왜 양식 상속을 피해야합니까?


9

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

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

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

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

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

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

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


이해가 안 돼요 비주얼 디자이너를 사용하지 말고 모든 GUI 코드를 직접 작성해서는 안된다는 것을 의미합니까?
Euphoric

Pre .NET 폼에서 끌어온 모든 개체를 제어하는 ​​코드는 어디에 있습니까?
JeffO

1
@JeffO 내가 처리 한 레거시 코드로 판단하면 임시 인라인 SQL과 비즈니스 로직 사이의 어딘가에 있습니다. 요점은 WinForms .net입니다. 그래서 디자이너가 요즘 "나쁜 코드"와 "나쁜 코딩 습관"과 같은 냄새를 맡고 일을 구성 할 때 실제로 부서지면 디자이너를 버리고 양식을 원래의 클래스로 취급한다고 말하십시오. 그리고 C #에서 UI 레이어를 코딩하는 것은 ExtJS에서 UI 레이어를 코딩하는 것과 어떻게 다른가? "이봐 디자이너가있다"WinForms에서 그렇게하는 "지루한"? ExtJS UI 코딩이 지루합니까?
Mathieu Guindon

다른 사용자를 인용하겠습니다 : CodeCaster; 이벤트 핸들러는 GUI를 비즈니스 로직에 연결하기위한 것입니다. 사용자 이름을 입력 할 텍스트 상자와 추가 단추가있는 경우 추가 단추를 클릭하면 _userRepository.AddUser (UsernameTextbox.Text) 만 호출하면됩니다. 이벤트 핸들러에서 비즈니스 로직을 원하지 않습니다. stackoverflow.com/questions/8048196/…
피터 B

@Pieter는 프레젠테이션 계층에 DAL 종속성을 두지 않습니까?
Mathieu Guindon

답변:


9

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

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


기본 형식에는 Panel2가 고정 된 SplitContainer가 BottomPanel있으며 일반적인 Ok / Cancel / Apply / Close 동작을 호출 하고 호스팅 하는 FlowLayoutPanel이 포함되어 있습니다. Panel1에는 Panel1이 고정 된 SplitContainer (일반 "명령"레이블 또는 맨 위에있는 메뉴, 도구 모음)를 포함하고 Panel2라는 보호 된 패널을 포함합니다 MainContent. 각각의 실제 구현은 그것을 채우는 방법을 결정합니다. 모든 내용을 구현에 삽입 할 수 있습니다. 예, 디자이너가 시간을 절약하고 좋은 지적을 구하기 위해 만든 사용자 정의 컨트롤 일 수 있습니다. 그러나 양식 자체는 어떻습니까?
Mathieu Guindon

여기서 문제는 규모입니다. 10 개의 양식으로 신청할 때 단일 공통 양식을 갖는 것은 큰 문제가되지 않습니다. 수십 또는 수백 개의 양식으로 신청할 때 문제가 시작됩니다. 그런 다음 공통적 인 부분이 있지만 기본 양식을 작성하기에 충분하지 않은 양식을 갖게됩니다. 어떤 경우에는 다른 레이아웃이나 다른 버튼을 사용하고 싶지만 다른 모든 것을 유지하려고 할 수 있습니다. 그리고 그때 문제가 시작됩니다.
Euphoric

2
반 정도의 괜찮은 디자인을 가지고 있다면 '스케일 문제'는 존재하지 않습니다. 우리는 몇 백 개의 폼으로 작업하는 프로젝트를 가지고 있습니다. 일관성과 공통 기능을 제공하기 위해 폼 상속을 많이 사용하며 아무런 문제도 없었습니다. 그것으로.
메이슨 윌러

2
@MasonWheeler 나는 정반대의 경험을했습니다. 우리는 응용 프로그램 중 하나에서 양식 상속을 사용하려고 시도했으며 기본 양식을 거의 변경하지 않을 때마다 모든 것이 고장 났으며 다른 모든 양식을 수동으로 수정해야했습니다. 또한 상속 된 양식으로 작업 할 때 디자이너가 이상하게 동작합니다.
Euphoric

1
@ 유포 릭 : 어느 디자이너? 우리는 델파이를 사용하며, 디자이너는 상속 된 폼과 잘 작동합니다. 그리고 디자인이 좋으면 이러한 문제가 발생하지 않습니다 . 아무것도 계획하지 않으면 물론 만질 때마다 부서지기 쉬워 지지만 다른 코드와 다르지 않습니다.
메이슨 휠러

2

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

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

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


0

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

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


0

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.