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

Я вижу вашу точку зрения, хотя я не уверен, что закрытие. DateSelection имеет смысл в этом контексте. Вы можете объяснить эту часть? –

+0

Свойство DateSelection вернет информацию о выборе, что эквивалентно запуску делегата в отправленном вами коде. –

+0

Ах да, я вижу вашу точку зрения. Возможно, CreateClosure будет более подходящим (вопрос мнения, хотя), но я вижу, к чему вы клоните. Это делает намерения более четкими и делает код более удобным. –

1

Я думаю, что это довольно умно. Единственное, что я сделал бы, это превратить вашу собственность (CreateSelectionForDate) в метод, который (для меня в любом случае) сделает код более понятным.

+0

Основная причина, почему я не сделал это метод, который тогда вы бы назвали его: control.CreateSelectionForDate() (DateTime.Today). Обратите внимание на двойной набор круглых скобок. –

+0

А - хорошая точка. –

+0

Я думаю, что это действительно зависит от того, будете ли вы использовать его больше как метод или больше как свойство, которое лучше, не так ли? –

Смежные вопросы