2009-07-10 4 views
0

私はコントロールを持っており、選択メカニズムを提供しています。ただし、選択したアイテムは一般的な消費には適しておらず、代わりに、日付別にパラメータ化された別のタイプに投影する必要があります。この悪いデザインですか?

これに加えて、同じ情報をカプセル化し、さらに重要なことに、元のコントロールの選択が変更された場合でも特定の選択を保持したいコントロールがあります。したがって、元のコントロールのメソッドは常にその現在の選択の投影を返すので、チェーンメソッドだけが機能しません。

この問題を回避するために、特定の選択に基づいて投影を実行するクロージャを返すプロパティを作成しました。このようにして、私は投影をカプセル化し、投写される実際のタイプを保護することができますが、特定のコレクションをカプセル化することもできます。ここに私が持っているものの簡略版があります。

public class MySelectionControl 
{ 
    public Func<DateTime, IEnumerable<MyProjectedType>> CreateSelectionForDate 
    { 
    get 
    { 
     // Take a copy of the selection before creating the lambda so 
     // that the source items won't change if the selection does. 
     IEnumerable<MyRealType> copyOfSelection = this.realSelection.ToList(); 
     return weekEnding => 
      copyOfSelection.Select(x => new MyProjectedType(x, weekEnding)); 
    } 
    } 
} 

これは、その後のような方法のように呼び出すことができますので、

MySelectionControl control = new MySelectionControl(); 

// Gives the current selection for a given date. 
control.CreateSelectionForDate(DateTime.Today); 

// Takes a copy of the selection for later use, regardless of 
// whether the original selection changes. 
var selectedItemsProjection = control.CreateSelectionForDate; 

は、代表者のこのひどい設計や賢い利用ですか?

答えて

2

Closure closure = selectionControl.GetClosure(DateTime.Today); 
closure.DateSelection ... 
+0

私はclosure.DateSelectionがこの文脈で意味をなさないとは確信していませんが、私はあなたの意見を見ます。あなたはその部分を説明できますか? –

+0

DateSelectionプロパティは、投稿したコードでデリゲートを実行するのと同じ選択情報を返します。 –

+0

ああ、あなたの意見が分かります。おそらくCreateClosureはもっと近似しているだろうが(意見の問題だが)、私はあなたが何を得ているかを見ている。意図をより明確にし、コードをより保守性のあるものにする必要があります。 –

1

かなり賢いと思います。私がする唯一のことは、プロパティ(CreateSelectionForDate)をメソッドに変換することです(私にとってはとにかく)コードを明確にするでしょう。この配置の目的は、コンテキストとそのコンテキスト内から実行する方法を提供することであるので、より多くの、このようにそれを使用する方が良いと思われる

+0

私はしなかった主な理由その方法は、control.CreateSelectionForDate()(DateTime.Today)と呼びます。ダブルカッコのセットに注意してください。 –

+0

ああ - 良い点。 –

+0

私はそれが本当にあなたがより良い方法であるかのように、より多くの方法やより多くのプロパティのようにそれを使用するかどうかに依存していると思いますか? –