私はコントロールを持っており、選択メカニズムを提供しています。ただし、選択したアイテムは一般的な消費には適しておらず、代わりに、日付別にパラメータ化された別のタイプに投影する必要があります。この悪いデザインですか?
これに加えて、同じ情報をカプセル化し、さらに重要なことに、元のコントロールの選択が変更された場合でも特定の選択を保持したいコントロールがあります。したがって、元のコントロールのメソッドは常にその現在の選択の投影を返すので、チェーンメソッドだけが機能しません。
この問題を回避するために、特定の選択に基づいて投影を実行するクロージャを返すプロパティを作成しました。このようにして、私は投影をカプセル化し、投写される実際のタイプを保護することができますが、特定のコレクションをカプセル化することもできます。ここに私が持っているものの簡略版があります。
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;
は、代表者のこのひどい設計や賢い利用ですか?
私はclosure.DateSelectionがこの文脈で意味をなさないとは確信していませんが、私はあなたの意見を見ます。あなたはその部分を説明できますか? –
DateSelectionプロパティは、投稿したコードでデリゲートを実行するのと同じ選択情報を返します。 –
ああ、あなたの意見が分かります。おそらくCreateClosureはもっと近似しているだろうが(意見の問題だが)、私はあなたが何を得ているかを見ている。意図をより明確にし、コードをより保守性のあるものにする必要があります。 –