2011-02-09 2 views
5

나는 아래에서 설명하려고하는 디자인 문제로 인해 어려움을 겪었다.생성자를위한 디자인 패턴

클래스를 호출 할 때 A라고하는 매개 변수 집합과 함께 생성자가 있다고 가정합니다. 각 인스턴스화에서 모든 매개 변수를 작성하는 것이 지루하고 더러운 것이므로 다른 클래스를 작성하여 StyleSheetA라고 부르며 모든 매개 변수를 캡슐화하고 A의 생성자에 대한 유일한 매개 변수입니다.이 방법으로 일부 기본값을 준비 할 수 있습니다 StyleSheetA 템플릿은 나중에 사용할 수 있으며 필요할 경우 수정할 수 있습니다.

그리고이 시점에서 나는 A를 확장해야합니다. B가 A를 확장한다고 가정합니다. B는 자체 StyleSheet 즉 StyleSheetB를 갖습니다. StyleSheetB가 StyleSheetA를 확장하는 것이 적절할 것이라고 생각합니다. 따라서 하나의 스타일 시트 매개 변수로 B의 생성자도 수퍼 클래스 A를 구성 할 수 있습니다. 그러나이 디자인에 결함이있을 수 있다는 가능성을 두려워합니다. 예를 들어, 스타일 시트에 getter/setter를 추가하고자한다면 어떻게해야할까요? 이러한 모든 상황을 처리 할 수있는 새로운 방법이 있습니까? 나는 잘못된 길을 가고 있는가? 혼동하는 사람들을 위해, 나는 여기에 몇 가지 코드를 첨부 :


    class A 
    { 
     StyleSheetA ss; 

     A(StyleSheetA ss) 
     { 
      this.ss = ss; 
      // Do some stuff with ingredients of styleSheet 
     } 
    } 
    class StyleSheetA 
    { 
     int n1; 
     int n2; 
     // : 
     // : 
     int n100; 
    } 

    class B extends A 
    { 
     B(StyleSheetB ss) 
     { 
      super(ss); 
      // Do some stuff with ingredients of styleSheet 
     } 
    } 
    class StyleSheetB extends StyleSheetA 
    { 
     int n101; 
     int n102; 
     // : 
     // : 
     int n200; 
    } 

은 또한 당신의 비판 중 하나가 이해할 수있을 것이다, 어떤 도움이나 제안에 감사드립니다.

편집 : 제네릭 지원이 없도록 자바에서 개발 중입니다.

+0

개발중인 언어는 분명하지 않습니다 (대개 어쨌든). 일반적으로 제네릭/템플릿은이 문제를 해결하는 데 도움이 될 수 있습니다. A 클래스를 A 으로 만들면 클래스 B에서 A 을 확장하여 복합 유형 (예 : StyleSheetB)을 지정할 수 있습니다. 이러한 기능이 없다면 C#;을 시도하십시오.) –

+0

그래, 당신의 솔루션은 정말 좋은 접근 방법이 될 것이지만 불행하게도 나는 자바에서 개발하고 있었고 거기에는 일반적인 지원이 없다. 감사. –

+0

java-me 태그를 추가해야합니다. ;) – weltraumpirat

답변

3

구조체 종속성을 관리하기 위해 StructureMap과 같은 IoC 컨테이너를 사용 해본 적이 있습니까? 그러면이 일을 훨씬 쉽게 할 수 있습니다.

+1

유권자가 추가 할만한 건설적인 것이 있습니까? 사람들이 IoC 컨테이너를 사용하는 주된 이유 중 하나는 생성자 종속성을 단순화하는 것입니다. –

+0

당신은 나에게서 투표를 얻을 수 있습니다. 비록이 특정한 사람들의 문제를 해결하지 못할지라도 IoC의 열렬한 팬입니다.) –

+3

나는 @Adam에 동의합니다 : 투표를하지 않고 설명을하지 않는 것이 좋지 않습니다. . 또한 그 대답이 도움이되지 않은 이유를 이해하는 데 도움이되지 않습니다. – weltraumpirat

5

A 클래스의 매개 변수가 너무 많아서 StyleSheetA 클래스로만 이동하는 문제가 있습니다.

내 요점을 설명하려면 다음 질문을 생각해보십시오. 어떻게 StyleSheetA을 인스턴스화 하시겠습니까? 어쨌든이 모든 매개 변수를 받아들이는 생성자를 사용했을 것입니다. 이 디자인이 제공 할 수있는 유일한 이점은 의 여러 인스턴스간에 다시 사용하는 StyleSheetA의 개체로 캡슐화 된 동일한 매개 변수 값 집합이있는 경우입니다. 그렇다면 A의 인스턴스가 다를지라도 동일한 매개 변수를 공유하므로 좋은 선택이 아니라는 점을 명심하십시오.

내가 추천 할만한 것은 클래스 A 클래스를 리팩터링하려고하는 것입니다. 작은 클래스로 나누십시오. 만약 nesseccary라면 조건부 분기 등을 피하기 위해 서브 클래스를 만들려고 시도하십시오.

이제는 클래스 A이 어떻게 생겼는지 모르겠지만 그렇게한다면 여러 클래스가 생기고 각 클래스는 고유 한 집합을 갖게됩니다. 매개 변수 그리고 매개 변수 중 하나라도 판별 자 (클래스 "유형"을 결정한다는 의미)가 있으면 하위 클래스를 사용하고 대신 내장 유형 시스템을 사용하여 매개 변수를 제거 할 수 있습니다. 는 getter와 setter 문제에

+0

복합 클래스를 사용하여 관련 매개 변수를 캡슐화하면 성능이 향상됩니다. (아주 약간). –

+0

@Morton : 그들이 실제로 관련되어 있다면, 나는 당신에게 동의합니다. 난 그냥 많은 대신 하나의 입력 매개 변수를 가지고 그냥 인공 컨테이너 클래스 작성에 동의하지 않습니다. –

+0

@Goran : 동의 함 :) –

2

의 생각 :

'B'의 생성자가 추가 매개 변수 (N101의 +)이 클래스의 작동에 필요한 것을 의미한다. 전체 매개 변수 목록을 사용하여 클래스를 확장 한 경우 B에 n101 ... n200, A에 n1 ... n100의 getter 및 setter가 있어야합니다. 이것은 아마도 StylesheetBStylesheetA을 확장, 오히려 그것을 매개 변수의 위해, B(StyleSheetA,StyleSheetB) 수는 클래스 A에서 세터를 가질 수있다 이런 식으로 클래스 B의 생성자가 상속도 StylesheetB에 대한 B에 하나를 넣어 가지고 있지 않는 제안합니다.

+0

추가 네스트가 필요한 경우 곧 어색해 질 수도 있지만 그것은 또한 작동합니다. –