2017-01-04 2 views
0

다음과 같은 방식으로 상속을 사용하는 Java TCP 서비스가 있습니다. Java Service는 Json을 입력으로 사용하고 처리 한 다음 Json을 반환합니다. 처리는 B 및 C와 같은 클래스에 걸쳐 분산됩니다. A는 객체를 만들고 작업을 완료합니다. inputJson을 B와 C에 전달하는 대신 Container 클래스를 저장하여 컨테이너의 하위 클래스에서 쉽게 사용할 수 있도록했습니다.
나는 그것을 재 설계하는 더 좋은 방법이있을 것이라고 확신한다. 안내해주십시오. 가 :Java : 상속 및 기본 설계 최적화

//Pseudo 
Class Main(){ 

    public static void main(String[] args) 
    { 
     return new A().a1(inputJson); 
    } 

} 

Class Container{ 
    JsonNode input; 
    JsonNode output; 
} 

Class A extends Container{ 

    private JsonNode a1(inputJson) 
    { 
     input = inputJson; 

     B bObject = new B(); 
     bObject.doB1(); 

     C cObject = new C(); 
     cObject.doC1(); 

     return output; 
    } 

} 

Class B extends Container{ 
    public void doB1() 
    { 
     //prepares and updates part of output using input 
    } 
} 

Class C extends Container{ 
    public void doC1() 
    { 
     //prepares and updates part of output using input 
    } 
} 
+0

A, B, C 등의 처리 방법은 동일한 이름, returntype 및 매개 변수를 사용합니까? –

+0

다른 이름, 다른 returntypes .. 아니 다형성. –

+2

코드가 작동하지 않는다고 생각합니다. 확장하면 JSON이 A에서 B 및 C로 복사되지 않으므로 어쨌든 전달해야합니다. 나는 당신이 기본 개념을 가지고 놀고, 최적화에 대해 생각할 것을 제안한다. – fdreger

답변

1

어쩌면 이것은 당신이 그것을 위해 무엇을 찾고있다 (참고 실제에서, B와 같은 더 클래스가 있으며, C 및 용기 등 doB1()와 DOC1()에 의해 사용되는 많은 속성이 포함되어 있습니다) 필요한 단일 컨테이너 수퍼 클래스를 제거합니다. 사용 방법은 간단합니다 C.process(B.Process(A.create()));
물론 모든 클래스가 JsonNode을 반환하는지 확인해야하지만 해당 기능이 이미 컨테이너에 표시되어있는 것 같습니다.

interface Processor { 
    public JsonNode process(JsonNode input); 
} 

Class A { 
    public JsonNode create() {...} 
} 

Class B implements Processor { 
    public JsonNode process(JsonNode input) { 
     // logics 
     return output; 
    } 
} 

Class C implements Processor { 
    public JsonNode process(JsonNode input) { 
     // logics 
     return output; 
    } 
} 
+0

고맙다 ..하지만 더 나은 것처럼 보이지만 여전히 입력을 프로세스 함수에 전달하는 것을 피하려고한다. B, C로 전달해야하는 매개 변수 목록을 줄입니다. 그게 내가 입력 및 기타 자주 사용되는 개체를 저장 컨테이너 클래스를 만들었습니다. 그리고 저는 B, C를 컨테이너로 상속하여 자주 사용하는 객체뿐만 아니라 입력을 얻을 수 있습니다. 더 이상의 제안? 감사합니다 –

+0

인수를 전달하는 방법입니다. 6 개가 넘지 않는 한,'Processable' 클래스를 만들 것을 제안합니다.이 클래스를 매개 변수로 사용할 수 있습니다. –

+0

예. 하지만 생각하고 (Processable 클래스를 상속하는 매개 변수 Vs Processable 클래스 전달). B와 C에는 많은 내부 호출이 있습니다. 그리고 객체를 전달하면 거의 모든 함수를 전달해야합니다. 그래서 저는 유산을 선택했습니다. 귀하의 케이스의 Processible 클래스는 내 케이스의 컨테이너 클래스와 같습니다. 그리고 childs B, C는 상속을 통해 매우 편리하게 해당 속성을 사용하고 있습니다. 나는이 접근 방식에 단점이 있다는 것을 알고있다. (내 기능이 일반적인 것이 아니기 때문에) 나는 더 나은 디자인을 찾고있다. –