2014-12-08 3 views
1

전역 서비스의 하위 인 여러 서비스 (Spring MVC)가 있습니다. 그래서이 예제 여러 방법으로 가장 좋은 방법 (또는 의견)에 대해 알아야 할 :코드 반복과 읽기 가능

//Domain classes 
public class MyParentObject{} 
public class MyObj extends MyParentObject{} 

//Services 
public class MyParentObjectServiceImpl implements MyParentObjectService{ 

    @Override 
    public MyParentObject findObjectByProp(String prop, String objectType){ 
     //myCode (not abstract class) 
    } 

} 

public class MyObjServiceImpl extends MyParentObjectServiceImpl implements MyObjectService{ 

    private myObjType = "MyObj"; 

    @Override 
    public MyObj findMyObjByProp(String prop){ 

    return (MyObj) super.findObjectByProp(prop, this.myObjType); 

    } 
} 

그리고이 방법에서,이 같은 통화를 사용

MyObj foo = myObjService.findMyObjByProp(prop); 

그래서 필요 이 접근 방식이 "더 나은"것인지 아니면 두 번째 매개 변수를 사용하여 직접 부모 메서드를 직접 호출하는지 확인하십시오. 예 :

... 그리고 두 번째 방법의 생성을 피하십시오. 도메인 객체와 관련된 많은 코드가 있기 때문에 자녀 서비스가 어쨌든 만들어 질 것임을 아는 것이 중요합니다.

나는 더 읽기 쉽기 때문에 첫 번째 접근법이 더 좋다고 생각하지만,이 디자인을 동료들과 토론하기 위해 일부 문서, 블로그 또는 의견으로 그 결정을 지원해야합니다.

+0

'MyObjServiceImpl'과 같은 형태의 자식이 여러 명있을 수 있습니까? 나는 당신의 타이틀에 언급 된 "반복"이 무엇을 의미하는지 알아 내려고 노력하고 있습니다. 자식이 여러 명이면'findMyObjByProp'이 어떻게 반복적인지 알 수 있습니다. 그러나 그 문제를 둘러싼 또 다른 방법이있을 수 있습니다. – ajb

+0

예! 나는 MyObjServiceImpl : MyObjServiceImpl ... bla bla를 많이 가지고있다. MyParentObject의 하위 객체 인 10 개의 다른 객체처럼 – MarcosTonina

답변

3

태그가 지정된 클래스 계층 구조처럼 보입니다. 세부 사항을 모른 채 일반적으로이 디자인의 가치에 대해 논평하기는 어렵습니다. 그러나 내가 권장할만한 접근 방식은 기본 클래스를 생성하여 형식 안전성을 조금 확보하는 것입니다. 특히

:

public /* abstract */ class MyParentObjectServiceImpl<T extends MyParentObject> 
    implements MyParentObjectService{ 

    MyParentObjectServiceImpl(Class<T> type) { this.type = type; } 

    private final Class<T> type; // subclasses provide this 

    @Override 
    public T findObjectByProp(String prop){ 
    //you can use type for object specific stuff 
    } 
} 

public class MyObjServiceImpl extends MyParentObjectServiceImpl<MyObj> 
    // You might not need this interface anymore 
    // if the only method defined is findMyObjByProp 
    /* implements MyObjectService */ { 
    MyObjServiceImpl() { 
    super(MyObj.class); 
    } 

    @Override 
    public /* final */ MyObj findMyObjByProp(String prop) { 
    return (MyObj) super.findObjectByProp(prop, this.myObjType); 
    } 
} 
당신은 확실히 (캐스팅은 기본 클래스에 나타납니다), 당신이 (다른 객체를 식별하는 문자열)은 "태그"을 없애 가능성이 유형의 안전에 얻을

전체 계층 구조를 구현하는 데 필요한 클래스/인터페이스의 수를 줄이십시오. 나는 성공적으로이 접근법을 여러 번 사용했다. 기본 클래스가 추상 클래스 인 경우이 방법이 가장 효과적입니다. 생각을위한 음식.

+0

응답 해 주셔서 감사합니다! 내가 찾고있는 것 : 생각을위한 음식, 하나의 새로운 프로젝트에 대한 최선의 접근 방식을 생각하고 있기 때문입니다. – MarcosTonina

+0

"효과적인 JAVA"(조슈아 블로흐)를 읽고 있었으며 "태그가있는 클래스에 클래스 계층 구조를 선호"했습니다. 어떤 접근 방식이 더 좋을지 확신 할 수 없습니다. 나는 모두가 어린이 서비스의 유사성에 달려 있다고 생각합니다. 내 말은 : findMyObj ...가 매우 유사하다면, 태그가 붙은 클래스가 더 좋을 것인가? – MarcosTonina

+0

@MarcosTonina 장기간에 걸친 태그가 지정된 클래스는 내 경험으로 결코 갚을 수 없다. 나는 Bloch에 동의한다. 위의 접근법은 기본 클래스에 많은 공통 기능을 패키징 할 수 있다면 괜찮은 대안입니다. 다시 한번, 아키텍처에 대해 더 많이 알지 못하면이 경우 최상의 접근 방식이 무엇인지 판단하기가 어렵습니다. 행운을 빕니다! –