2011-01-04 3 views
1

다양한 디자인 패턴을 익히기위한 나의 지속적인 모험에서 나는 "State"디자인 패턴을 만났다.내부 및/또는 부분 수업은 주립 디자인 패턴의 원칙을 벗어 납니까?

먼저이 패턴을 사용하려고하는 위치를 설명하겠습니다. 나는 상태를 신청하고자하는 양식을 가지고 있습니다. 내 프로그램에는 구성, 처리 및 ProcessingComplete의 세 가지 상태가 있습니다. 양식이 변경되면 양식의 다양한 구성 요소가 활성화/비활성화, 표시/숨김 등이됩니다.

상태 패턴을 이해하면 모든 변경 사항 (구성 요소 표시/숨김, 활성화/비활성화 등) 양식의 인스턴스를 포함하는 별도의 클래스 내에서 발생해야합니다. 다양한 State 클래스가 Form의 클래스와 별개 인 경우 State 클래스는 Form의 구성 요소에 액세스 할 수 없습니다. 나는이 두 가지 옵션 중 하나를 나에게 잎 느낌 :

내가 해당 옵션을 느끼는 국가 클래스를 양식의 내부 클래스를 확인 공공

  • 로 폼의 구성 요소를 노출 (1) 나쁜 형태이지만, (2) 옵션이 어떻게 든 국가 패턴의 정신을 위반한다고 생각합니다. 내가 가지고있는 다른 생각은 옵션 (2)을 사용하지만 부분 클래스 구현을 사용하는 것이었지만 여전히 State 패턴의 정신을 위반하고 있다고 느낍니다.

    내 선택이 부당한 것인지, 아니면 내가 생각조차하지 않은 또 다른 옵션이 있습니까?

  • 답변

    1

    세 번째 옵션이 누락되었습니다.

    주정부가 계약서의 일부로 관리 할 부분을 포함시킵니다.

    레이블의 텍스트를 수정하는 것이 목표 인 경우 기본 상태 클래스에 레이블을 보내야합니다. 그런 다음 폼에 적절한 필드를 설정하는 InitializeState(State myState) 또는 BuildStates() 메서드를 가질 수 있습니다.

    옵션 1이 잘못되었습니다. 옵션 2는 주 (state)를 디자인 할 때 주어지는 것만을 행동 할 수 있도록 정말 불필요 해집니다. 실제로는 어떻게 객체가 어쨌든 행동해야합니다.

    +0

    나는이 아이디어가 정말 마음에 든다. 왜냐하면 나는 상당히 복잡한 생성자 (이 경우에는 많은 매개 변수를 의미하는 복잡한)를 구현해야한다는 것을 의미하는 내 클래스를 공정하게 불변으로 유지하는 데 익숙하기 때문에 나에게 발생하지 않았다. – Anthony

    +0

    그러나 더 생각해보십시오 : "옵션 2는 귀하가 주어진 것을 행동 할 수 있도록 귀하의 주를 디자인 할 때 실제로 불필요하게됩니다". 옵션 2에서는 State 클래스에 Form의 인스턴스를 지정해야합니다. 이점은 State 클래스가 중첩되어 있으므로 State가 Form의 인스턴스의 private 멤버에 액세스 할 수 있다는 것입니다. – Anthony

    +0

    @Shynthriir : 저는 한 클래스가 다른 클래스의 private 멤버에 액세스하는 것을별로 고려하지 않았습니다. 밀접하게 결합 된 코드입니다. 중첩 된 경우에도 볼 수있는 대상이 아닌 주어진 대상에만 액세스해야합니다. –

    1

    부분적인 구현을 피할 것입니다. 보통은 부가 가치를주지 않으며 코드를 읽기가 더 어렵게 만듭니다. 부분 클래스가 좋은 아이디어라고 생각할 수있는 유일한 곳은 (WinForms 디자이너에서와 같이) 코드의 일부가 자동으로 생성되는 경우입니다.

    MVP 또는 어떤 종류의 바인딩 사용은 어떻게됩니까? 컨트롤의 Visible 및 Enabled 속성을 Model 클래스에 바인딩하면 양식 인스턴스를 보유하는 대신 해당 모델의 인스턴스를 보유 할 수 있습니다.

    +0

    첫째, 부분 구현을 보는 방법은 순수하게 코드의 논리 부분을 개별 파일로 분리하는 데 도움이됩니다. 그것이 차 한잔이라면 파일이 커지지 않도록합니다. - 둘째, MVP의 다양한 측면에 대해 여전히 머리를 감싸고 있습니다. – Anthony

    +1

    @Shynthriir이 문제를 해결하는 대신 증상을 처리하고 있습니다. 클래스가 너무 커서 분리 된 파일로 나누려면 클래스를 별도의 클래스로 나누어야합니다. 큰 클래스는 테스트 할 수 없습니다. –

    +0

    참.클래스는 하나의 책임만을 가져야하며 논리적으로 분리되어서는 안됩니다. – JBSnorro

    1

    옵션 2를 사용하고 싶습니다. "상태"는 "양식"에만 사용되므로 의미 적으로 본질적이므로 클래스 계층 구조로 만들지 않으시겠습니까?

    +0

    동의합니다 ... 왜 상속을 사용할 수 없습니까? 그것이 OOP가 설계 한 것입니다. –

    관련 문제