2009-08-19 6 views
26

가끔 바나나의 인스턴스를 획득해야하는 원숭이 클래스가 있다고 가정합니다. 이 바나나가 제공되는 방식은 원숭이에게는 중요하지 않지만 바나나 획득을 시작합니다.이벤트, 위임 또는 인터페이스?

이제 적어도 내 원숭이를 바나나 제공 업체로 연결하는 3 가지 방법이 있습니다. 가장 좋은 방법은 무엇입니까?

1. 이벤트

Monkey.BananaNeeded 이벤트를 올립니다. 이벤트 처리기는 BananaNeededEventArgs.Banana 속성을 설정합니다.

2. 인터페이스

호출 IBananaProvider.GetBanana. IBananaProvider 인스턴스는 생성자 인수 또는 속성을 통해 원숭이에 주입됩니다.

3. 위임 형 System.Func<Banana>의 대리자를 호출합니다. 대리자는 생성자 인수 또는 속성을 통해 원숭이에 주입됩니다. 이것은 여분의 인터페이스 나 클래스의 선언을 요구하지 않기 때문에 유혹스러운 일이지만 분명히 대중적인 선택은 아닙니다.

+3

+1 재미있는 예제와 괜찮은 질문이지만, 물론 원숭이는 바나나를 얻지 않는다고 생각합니다. 맛있는 음식을 먹고 싶습니다. –

+2

뚱뚱한 원숭이 : while (true) _provider.GetBanana.Eat(); – Guffa

+6

바나나 스킨을 버리는 것을 잊지 마십시오. 우리는 바나나 피부가 우리 손에 새는 것을 원하지 않습니다. –

답변

6

여러 개의 핸들러가 연결되지 않도록하는 메커니즘이없는 한 이벤트 및 대리자 옵션이 마음에 들지 않습니다. 따라서 옵션 2는 IMO 수상자입니다.

+0

대리인에게 둘 이상의 메서드를 연결할 수 없습니다. – Guffa

+4

@Guffa - Eh? .NET의 모든 델리게이트는 MulticastDelegate이며, 요점은 여러 메서드를 연결할 수 있다는 것입니다. 어떻게 생각하십니까? –

+0

예, 대리인을 결합 할 수는 있지만 마지막 경우에만 바나나를 반환 할 수 있으므로이 경우에는 전혀 쓸모가 없습니다. – Guffa

1

위의 시나리오에서 가장 좋은 방법은 인터페이스로 이동하는 것입니다. OOAD 용어로 Monkey 클래스가 바나나를 가지고 있기 때문에 위 시나리오를 정의 할 수 있습니다.

1

나는 보통 이벤트 모델이 원숭이가 바나나를 위해 차례로 모든 공급자를 요청 즉, 몇 가지 가능한 바나나 공급 업체이며, 하나를 제공 할 수있는 첫 번째 경우에 가장 적합한 2.

IBananaProvider bananaProvider = ProviderFactory.Get<IBananaProvider>(); 
+0

+1 ... 그렇다면 원숭이가 바나나를 집어 들기 위해 공장에가는 법을 알아야합니까? –

+0

@ Justin Niessner : 구성 파일을 기반으로 Providerfactory 팩토리를 가질 수 있습니다. – Gregoire

4

사용 그것을 전달합니다.

다른 두 모델은 원숭이 당 하나의 바나나 증명 자에게 잘 작동합니다. 대리자는 공급자를 쉽게 만들 수 있으며 인터페이스는 더 구조화되어 있습니다.

1

원숭이가 바나나를 필요로하는 작업이 있습니다.

원숭이가 바나나를 먹을 필요가 있습니다. 바나나를 매개 변수로 전달할 수 있습니다.

IBananaProvider에서 Money의 종속성을 제거합니다.

class Monkey 
{ 
    void FeedWith(Banana banana) { ... } 
} 

발신자가 원숭이가 아닌 바나나를 얻는 것이 허용됩니다.

여기 엔 이 아니며 엔티티에 서비스를 삽입하려면이 아닙니다.

+1

원숭이는 처음 바나나를 마칠 때 새로운 바나나가 필요할 수도 있습니다. :-) – djna

+0

이 경우, IBananaProvider를 인수로 전달하면 원숭이가 원하는 바나나 수를 결정할 수 있습니다. – thinkbeforecoding

+0

하지만 Martin Fowler는 Anemic Monkey Model을 anti-pattern이라고 생각합니다. http://martinfowler.com/bliki/AnemicDomainModel.html –

1

이상적으로 의존성 주입이 더 일반적으로 받아 들여지는 접근 방식입니다.

시도 할 또 다른 방법은 메시지 큐입니다.

Monkey은 본질적으로 맛있는 바나나를 위해 메시지를 일부 큐에 "게시"할 수 있습니다. 이 "게시"는 공급자를 트리거하여 큐를 모니터링하고 요청을 이행하며 공급자의 실제 인스턴스는 관련이 없습니다. Monkey은 원래 메시지에 대한 응답을 기다리고 BananaProvider에서 해당 소포가 도착하면 조치를 취합니다.

메시지 큐는 공급자와 소비자를 분리합니다. 하지만 아직 계약의 형태가 있습니다. "은 요청의 반대쪽에 있고 대답은 부적절합니다.

1

나는 옵션 2가 가장 좋은 해결책이라고 말합니다. 일반적으로 무언가를 위임하는 것, 다른 말로하면 뭔가하는 것, 이벤트는 일어난 일, 즉 사용자와 관련된 즉각적인 응답을 의미합니다. 인터페이스에는 간단히 "여기 있습니다. 그러면 할 수 있습니다."라고 말합니다. 바나나 나 원숭이가 처음에는 아무 것도하지 않기를 원하고 사용자가 코드의 내부 동작과 직접 상호 작용하기를 원하지 않는다면 인터페이스가 승리합니다. 원숭이가 바나나를받을 수 있다는 것을 아는 것이 필요합니다. 그가 바나나와 그 이후에 결정한 것은 그에게 달려 있으며 바나나 자체와 주변의 코드는 그것.

관련 문제