태그 보관물: winforms

winforms

왜 양식 상속을 피해야합니까? 툴박스에서 드래그 한 모든 컨트롤 인스턴스,

VB4를 배우고 버튼을 폼으로 드래그하고 해당 버튼을 두 번 클릭 한 다음 코드를 마법으로 축복받은 이벤트 핸들러에 입력하는 것을 기억합니다. QBASIC에서 온 저는 “VB”의 “V”에 감격했습니다. 시각 디자이너는 말 그대로 빵을 만든 이래로 최고의 제품이었습니다.

물론 프로그래밍 방식으로 모든 작업을 수행 할 수 있지만 “V”의 마법은 매우 매력적 이었으므로 해당 버튼을 끌 수는 없었습니다. 우리는 그 길을 타도록 장려되었습니다.

그러나 몇 년 전에 나는 C #과 .net 프레임 워크에 대해 배우기 시작했고 내가 생각한 모든 것이 방금 창 밖으로 나간 방식에 매료되었습니다. VB6에는 .net에서 완전히 공개 된 많은 마술 이 있습니다 InitializeComponents. 예를 들어 생성자와 메소드를 사용하십시오. 후자에는 툴박스에서 드래그 한 모든 컨트롤 인스턴스, 등록한 모든 이벤트 및 디자이너에서 설정 한 속성이 있습니다.

그리고 그건 괜찮아요 .. 그냥, 나는 무슨 일이 일어나고 있는지 “소유”하지 않는 것처럼 느껴집니다.이 코드는 디자이너를 통해서만 수정할 수 있습니다. 한 양식에서 다른 양식으로 “확인”이라고 표시된 버튼을 복사 할 때마다 (때로는 형제 “취소”와 함께) 실제로 코드를 복제하는 것입니다. 이것이 가 아닙니다? 교황 은“DRY는 자신을 반복하지 않는다”고 말했다 .

모든 객관성에서 종교와 사상 학교는 기본 양식에서 양식을 파생 시켜서 “확인”버튼 (및 모든 친구)을 기본 양식에 두어야합니까? 유사한 뭔가 FormBase이로부터 파생 DialogFormBase; 코드를 입력하여 곧바로 생성 된 모든 클래스 버튼은 클래스가 어떻게 구성되어 있는지에 따라 생성됩니다 (즉, 생성자 열거 형 인수는 생성 할 버튼을 결정합니다), 컨트롤은 분할 패널과 흐름 레이아웃 패널의 배열 안에 배치되며Content기본 콘텐츠 패널에 맞습니다. 이것이 마스터 페이지와 콘텐츠 자리 표시 자에서 ASP.net이하는 일이 아닙니까? 새 “마스터 페이지”가 ​​필요할 때 양식을 파생하지만이 새 “마스터 페이지”는 여전히 기본 폼 클래스에서 파생되므로 전체 응용 프로그램에서 시각적 인 일관성을 유지합니다.

나에게 그것은 WinForms의 디자이너와 함께했던 다른 것보다 훨씬 더 많은 코드 재사용이며, 어렵지 않고 코드를 제어 할 수없는 200 줄 방법으로 어지럽히 지 않습니다. 내가 좋아하는 곳에 의견을 쓰면 디자이너가 덮어 쓰지 않을 것입니다. : 난 그냥이 링크에 나를 데리고 무엇 패턴과 구조의 문제, 같아요 일반적인 기능을 공유 할 것입니다 윈도우 양식에 대한 최고의 디자인 나는 제외에 자리 깨달았다, 이 대답은, 난 정확히 제시 디자이너 고려 사항으로 인해 양식 상속 에 대해 조언 합니다. 그것이 내가 얻지 못한 부분 입니다.코드 구조 고려 사항 때문에 , 특히 폼과 컨트롤 상속과 관련하여 , 디자이너 이외의 다른 것을 피할 이유가 없습니다 .

우리는 모두 게으른 수 없습니다, 그래서 내가 어떤 부분을 놓치고 있습니까?



답변

나는 다른 패러다임으로 당신을 반대 할 것입니다 : 상속보다 구성을 선호하십시오.

GUI 코드를 직접 작성하기 시작하고 상속을 사용하여 양식간에 동작과 시각적 요소를 공유하더라도 일반 OOP 디자인과 동일한 문제가 발생합니다. OK / Cancel 버튼이있는 DialogForm과 그리드가있는 GridForm이 있다고 가정하겠습니다. DialogForm에서 모든 대화 상자와 GridForm에서 Grid로 모든 양식을 파생시킵니다. 그리고 당신은 둘 다로 양식을 원한다는 것을 알게됩니다. 어떻게 해결하겠습니까? 폼 상속을 사용하는 경우 해결할 방법이 없습니다. 반면에 UserControls를 사용하는 경우 GridControl을 양식에 놓고 간단하게 수행 할 수 있습니다. 그리고 여전히 UserControls와 함께 디자이너를 사용할 수 있으므로 지루한 GUI 코드를 작성하는 데 시간을 낭비하지 않아도됩니다.


답변

이 중 많은 부분이 선택한 기술 스택에 연결되어 있습니다.

WinForms와 WPF는 모두 .NET UI 프레임 워크 일 수 있지만 최종 목표를 달성하는 방법은 크게 다릅니다. 어떤 패러다임은 기술 사이를 잘 이동하지만 다른 패러다임은 그렇지 않으며, 모든 패러다임에 존재한다고 느끼기 때문에 패러다임을 강요해서는 안됩니다. MVVM이 WPF / SL에서 조정되고 MVC가 WebForms 등에서 ASP.NET에서 분리 된 개념 인 이유가 있습니다. 특정 기술은 특정 패러다임에서 더 잘 작동합니다.

생성 된 코드는 일반적으로 DRY 문제에서 제거 되어야합니다 . 어떤 경우에는 적용 할 수 있지만 무시하지 않는 경우가 더 많습니다. DRY 개념은 반드시 프리젠 테이션 레이어 외부에 초점을 유지해야하지만 프리젠 테이션 레이어에서 생성 된 코드는 작업중인 프레임 워크의 부산물이 아닌 경우가 많습니다. 이는 DRY 원칙을 접근 방식에 적용 할 수는 없지만 조심성 있는. 기본 양식을 작성하고 무기한으로 상속 할 수 있습니까? 예. 필요할 때마다 새 폼에 구성 요소를 끌어다 놓을 수 있습니까? 예. 잠재적 인 결함을 피하고 선택한 기술 스택의 범위 내에서 작업하는 동안 다운 스트림 리팩토링 및 확장 성을 쉽게 만들어 최종 목표에 계속 집중하십시오.


답변

필드를 올바르게 캡슐화하고 그에 따라 채우면 상속 사용할 수 있습니다 . 상속을 사용하기를 원한다면 기본 양식과 해당 양식에 대한 해당 모델을 갖고 각 파생에 대해 양식과 모델을 모두 파생시키는 것이 좋습니다.

훨씬 좋은 대안은 관련 컨트롤을 하나 이상의 UserControl 컨트롤로 그룹화하는 것입니다. 관련 데이터를 넣으려면 약간의 논리가 필요합니다.


답변

3 년 안에 자신이 마음을 바꿨을지라도 나는 메이슨 휠러에 전적으로 동의한다.

Delphi 실행 파일에서 WEB로 마이그레이션 할 대안을 찾고 있습니다.

지금까지 양식 상속을 계속 사용할 수 있기 때문에 UNIGUI를 결정했습니다. 델파이가 다트와 같은 믹스 인을 갖기를 원합니다. 그러나 사람들이 Visual Form Inheritance보다 MVC에서 훨씬 더 많은 코드를 작성한다고 생각합니다. 탐색의 대부분은 데이터 모듈 (applyupdates)의 유효성 검사 규칙, SQL 필터링 기준, 클라이언트 데이터 세트 검색 등 모든 것이 5에서 6으로 작성되었습니다. 조상을 형성하십시오.

사람들이 OOP를 초대했기 때문에 “MVC를 사용하면 Delphi를 기능에 더 쉽게 넣을 수 있습니다”라고해도 논쟁의 여지가 없습니다. 모든 사람들이 클래스, 속성, 메서드입니다. 그래서 필요한 것은 번역기입니다. 훨씬 덜 복잡하지만 Daily 기반으로 변경되는 웹 사이트의 경우 실제로 이점을 찾을 수 없었습니다.


답변