1

Doohickeysキーによってインデックス付けされたカスタム コレクションがあります。このコレクションには、ファクトリ メソッドcreateDoohickey(key)とアクセサがありますDoohickey(key)createDoohickey(key)新しいオブジェクトを返す必要がありますvoidか?

最初のケースでは、このように使用します

myDoohickey = doohickeys.createDoohickey(key);
doStuff(myDoohickey);

他の場合はこのように

doohickeys.createDoohickey(key);
doStuff(doohickeys(key));

どちらが好ましいと思いますか?またその理由は?

編集私は何年にもわたってかなりのことを学んだと思います、そして私が受け入れた答えは実際には最高のものではありません.

4

4 に答える 4

3

コンテナーに含まれるオブジェクトを作成するためのファクトリ メソッドがコンテナーに必要かどうかはわかりません。問題を適切に分離するには、オブジェクトの作成をコンテナーから分離する必要があります。

したがって、次のようなものが必要だと思います。

Doohickey myDookickey = new Doohickey();
doohickys.Add(key, myDookickey);
doStuff(myDookickey); // or
doStuff(doohickeys(key));

その後、別のオブジェクト ファクトリを自由に使用したり、Doohickey を直接インスタンス化したりできます。これにより、モック Doohickey オブジェクトを使用してコンテナーを単体テストすることが容易になります。

ファクトリ メソッドが必要な場合は、Doohickey を返します。これは、必要なときにインデックスを使用して取得するよりも、必要のないときに戻り値を無視する方が (参照/ポインターが返されると仮定して) 安価であるためです。

于 2009-07-08T14:34:46.063 に答える
2

はい、ファクトリは新しく作成されたインスタンスを返す必要があります。 ただし、Alexが指摘したように、リポジトリとファクトリを分離することができます。私はおそらく、リポジトリへの参照を持つようにファクトリを設計します。ファクトリメソッドが実際に新しく作成されたインスタンスを返す限り、2つを1つのクラスに結合した世界の終わりではないと思います。

于 2009-07-08T14:43:27.953 に答える
1

上記の例では、ファクトリメソッドがコンテナクラスに埋め込まれています。私はwillcodejavaforfoodに同意します。これは、長期的には良い考えかもしれませんし、そうでないかもしれません。問題は、ファクトリを独自のクラスに分割することによる結合の削減が、追加コストの価値があるかどうかです。

ファクトリメソッドが新しく作成されたインスタンスを返す必要がある理由については、作成を包含から切り離すことが望ましいです。クラスの一部のユーザーは、一方を必要とし、もう一方を必要としない場合があります。また、作成と封じ込めを組み合わせると、封じ込めもテストせずに作成を(単体で)テストすることはできなくなります。

于 2009-07-08T16:15:41.080 に答える
-1

この答えは私の同僚からのものです。彼はcreateDoohickey(key)確かに返すことを提案したDoohickey; さらに、getDoohickey(key)代わりにそれを呼び出します。

編集私は、この答えが必ずしももはや最良のものではないので、私が学んだことの後で信じています。

于 2009-07-08T19:23:02.217 に答える