2009-08-19 10 views
26

私はモンキークラスを持っていて、時々バナナのインスタンスを取得する必要があるとします。このバナナが提供される方法は、サルには関心がありませんが、バナナの取得を開始します。イベント、デリゲート、またはインターフェイスですか?

今私は少なくとも3つの方法で猿をバナナプロバイダーに接続することができます。 これを行う最善の方法は何ですか?

1.イベント

Monkey.BananaNeededイベントを発生させます。イベントハンドラはBananaNeededEventArgs.Bananaプロパティを設定します。

2.インタフェース

呼び出しIBananaProvider.GetBananaIBananaProviderインスタンスは、コンストラクタの引数として、またはプロパティを通じて、サルに注入されます。

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

私は通常、いくつかの可能なバナナプロバイダがある場合、サルはバナナのために順番にすべてのプロバイダー、および1を提供することができます最初のものを要求する、つまりイベントモデルは、最高の作品2

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

+1 ...しかし、サルはバナナを拾うために工場に行く方法を知る必要がありますか? –

+0

@Justin Niessner:確かに、設定ファイルに基づいてProviderfactoryのファクトリを持つことができます。 – Gregoire

4

を使用しますそれを届けるようになる。

他の2つのモデルは、サルごとに単一のバナナ証明者のために正常に動作します。デリゲートはプロバイダーを作成するのが簡単で、インターフェイスはより構造化されています。

1

モンキーにはバナナが必要な操作があります。

バナナを得るための猿の必要性は、これらの操作の次のものです。あなたは確かに操作のパラメータとしてバナナを渡すことができます。

IBananaProviderに対するMoneyの依存関係を削除します。

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

発信者が、サルではなく、バナナを取得することができます。

私はここにを主張しており、ではエンティティにサービスを注入していません。

+1

サルは最初のものを終えるときに新しいバナナが必要かもしれません。 :-) – djna

+0

この場合、IBananaProviderを引数として渡します。猿は、彼が望むバナナの数を決めることができます。 – thinkbeforecoding

+0

しかし、やはりMartin Fowlerは、貧血猿モデルを反パターンと見なしています。http://martinfowler.com/bliki/AnemicDomainModel.html –

1

理想的には依存性注入がより一般的に認められているアプローチです。

もう1つのアプローチは、メッセージキューです。

このシナリオでは、Monkeyは本質的に、おいしいバナナのメッセージをキューに「ポスト」することができます。この「転記」は、プロバイダをキューを監視し、要求を実行するために起動します。つまり、プロバイダの実際のインスタンスは応答しません。 Monkeyは元のメッセージへの応答を待って、BananaProviderから目的の土地が到着したときに処理を行います。

メッセージキューは、プロバイダとコンシューマを切り離します。 」と言われましたが、まだ何らかの形の契約がありましたが、です。要求の反対側にあり、回答は無関係です。

1

私は同意し、オプション2が最適です。一般的に何かを委譲することを意味し、言い換えれば何かをすることを意味し、イベントは起こった何か(通常はユーザ関連)に即座に対応するためのものです。バナナや猿が最初に何かをしたがっていて、ユーザーがコードの内部動作と直接対話しないようにするには、インタフェースが勝ちます。サルがバナナを受け取れることを知ることが必要です。彼が後でそれらのバナナで行うことは彼に任されており、バナナ自体と周囲のコードは、それ。

関連する問題