2017-12-07 3 views
1

아래의 코드는 Demeter의 법칙을 명백히 잠식합니다. 즉 getServer().methodx(...)의 방법을 사용합니다. 다른면에서보기에는 꽤 컴팩트 해 보입니다.이것은 Demeter의 법칙을 위반 한 것입니까? 대 읽을 수있는 코드

abstract class BaseManager { 
    ResultSet find(String searchText) { 
     return getServer().find(searchText); 
    } 

    ResultSet fetch(String fetchText) { 
     return getServer().fetch(fetchText); 
    } 

    void save(String saveText) { 
     getServer().save(saveText); 
    } 

    abstract BaseManager getServer(); 
} 

class Server1Manager extends BaseManager { 
    @Override 
    protected BaseManager getServer() { 
     return server1; 
    } 
} 

class Server2Manager extends BaseManager { 
    @Override 
    protected BaseManager getServer() { 
     return server2; 
    } 
} 

법률을 위반하는 경우이 코드를 리팩터링하는 방법은 무엇입니까? 미리 감사드립니다.

답변

1

분명히 Demeter의 법칙, 즉 의 getServer(). methodx (...) 코드가 실행됩니다. 다른면에서 보면 꽤 보입니다. compact = 가독성이 좋습니까?

디자인의 요점을 잃어 버렸습니다. compactness가 당신의 목표라면, 그러면 더 좋지 않을까요?

class Manager { 
    private Server server; 

    public Manager(Server server) { 
     this.server = server; 
    } 

    ResultSet find(String searchText) { 
     server.find(searchText); 
    } 

    ResultSet fetch(String fetchText) { 
     server.fetch(fetchText); 
    } 

    void save(String saveText) { 
     server.save(saveText); 
    } 
} 

더욱 컴팩트하고 명확한 것 외에도 Demeter의 법칙을 준수합니다. 더욱이, 상속에 대한 구성보다 선호하는 원칙을 따르며, 데메테르의 법칙에 의해 당신이 선호하는 (묵시적이지는 않지만) 것으로 보입니다.

법률을 위반하는 경우이 코드를 리팩터링하는 방법은 무엇입니까?

나는 여전히 내가 위에 제시 한 것을 좋아한다.

는 수용 가능 다음과 같은 솔루션은? (그렇지 않은 코드 중복 생겼)가 [...] 당신이 나에게 코드 검토, 나는 확실히 물어 것이라고 발표하면

당신이 상속에서 얻은 것 같아요. 여러분의 코드가 기술적으로 복제적인 것인지에 대해서는 다소 논쟁의 여지가 있지만, 필자가 제시 한 비 상속 버전보다 확실히 길고 복잡합니다. 그리고 비 상속 버전은 코드 중복에 대해 의문의 여지가 없습니다.

0

나를 위해 관리자에서 3 가지 방법을 구현하면 훨씬 좋습니다.

두 서버에 대해 하나의 데이터 관리자 노출 방법을 가질 수 있습니다.

내가 좋아하는 또 다른 규칙이 있습니다. 묻지 않음 -에게 문의하십시오.