2011-02-01 4 views
3

관리자 역할을하는 클래스가 있으며 작동합니다. 응용 프로그램 서버가 시작될 때 시작되는 서블릿은이 관리자를 인스턴스화합니다. 다른 작업을 수행 할 다른 클래스를 추가해야하며 관리자와 조정해야합니다. 클래스를 인스턴스 변수로 관리자에 추가하려고 생각했습니다. 관리자가 생성자에서와 같이 새 클래스를 인스턴스화해야합니까, 아니면 서블릿에서 새 클래스를 인스턴스화하고 관리자가 인스턴스화 된 후에 manager.setNewClass()를 호출해야합니까?오브젝트 구성

답변

0

후자를 수행해야합니다. 관리자와 대리인을 분리합니다. 디커플링을 올바르게 수행하려면 관리자가 예상하는 동작을 정의하는 인터페이스를 작성한 다음 제어/종속성 삽입의 반전을 통해 구현을 제공해야합니다. 이것은 관리자와 그 worker 클래스를 테스트 할 수있게 해준다.

EDIT -이 대답은 서블릿을 언급했기 때문에 java로 가정합니다.

당신은 당신이 인터페이스

class Manager { 
    Worker worker; 

    Manager(Worker worker) { 
     this.worker = workder 
    } 
} 

근무하는 인터페이스입니다 기대, 관리자 클래스를 가지고있다. 그것은 당신이 지금 구현

class WorkerImpl implements Worker { 
    // must define a doesSomething() implementation 
} 

매니저는 그냥 일부 노동자를 얻을 알고를 만들 필요가 behavour하지만 구현

interface Worker { 
    public void doesSomething(); //method definition but no implementation 
} 

을 정의합니다. 인터페이스를 구현하는 모든 클래스를 제공 할 수 있습니다. 이것은 디커플링입니다. Manager는 특정 구현에만 구속되지 않으며, 이는 작업자의 행동에만 종속되어 있습니다.

+0

관리자가 예상하는 동작을 정의하는 인터페이스를 만드는 방법을 자세히 설명해 주시겠습니까? 어디로 가는지 보지 못합니까? – bmw0128

+0

@ bmw0128 확장 – hvgotcodes

+0

위의 대답은 완전히 정확하지 않습니다. "멋진"문제가 아닙니다. 인터페이스를 만들지 않는 한 관리자는 두 가지 방법 중 하나를 통해 "위임자"와 분리되지 않습니다. 생성자 호출 또는 setNewClass 및 인스턴스 변수의 유형 시그니처에서 ID를 인식합니다. 두 번째 방법을 사용하면 이제 서블릿을 클래스에 연결하기 때문에 둘 다 결합됩니다. – Sisyphus

2

총체 오버 일반화로 서블릿에서 생성자를 인스턴스화하고 생성자 매개 변수 또는 setNewClass()을 통해 관리자에게 전달해야합니다. 종속성을 하드 코딩하지 말고 주입하십시오. .

그러나 정확한 사용 사례에 따라 올바른 대답이 아닐 수도 있습니다. 관리자 클래스를 구성하는 데는 Builder을 사용하는 것이 좋습니다. 그런 식으로 빌더는 서블릿에 하드 코딩하지 않고 전체 관리자 (종속성 포함)의 구성을 관리합니다. 이것은 서블릿에서 빌더로 종속성을 이동시킵니다 (테스트 및 다른 코드에서 더 잘 다룰 수 있습니다).

짧은 대답은 은색 총알이 없다는 것입니다. 모든 수업의 힘든 관계와 역할 및 책임을 모른 채 최선의 방법을 말하는 것은 어렵습니다. 그러나 생성자에서 인스턴스화하는 것은 거의 좋은 생각이 아니며 어떤 형태로든 종속성을 주입해야합니다. (어디에서 토론을 할 것인가) ...

1

이것은 FFF 패턴을 상기시켜줍니다.

인스턴스를 만드는 위치는 중요하지 않습니다. 가장 적합한 곳이면 어디서든 만들 수 있으며, 다른 곳에서 필요하면 기본적인 리팩토링을 적용하면됩니다.

실제로 디커플링이 필요한 경우 Guice과 같은 도구를 사용해보십시오. 필요한 경우에만 시도하십시오.

관련 문제