Это плохой дизайн? - PullRequest
       7

Это плохой дизайн?

0 голосов
/ 10 июля 2009

У меня есть элемент управления, и он обеспечивает механизм выбора. Однако элементы, которые он выбирает, не подходят для общего потребления и вместо этого должны проецироваться в другой тип, параметризованный по дате.

В дополнение к этому, есть некоторые элементы управления, которые хотят инкапсулировать ту же информацию и, что более важно, хотят сохранить определенный выбор, даже если выбор исходного элемента управления изменился. Поэтому просто методы цепочки не работают, потому что метод исходного элемента управления всегда будет возвращать проекцию его текущего выбора.

Чтобы обойти это, я создал свойство, которое возвращает замыкание, которое выполняет проекцию на основе определенного выбора. Таким образом, я могу инкапсулировать проекцию и защитить реальный проецируемый тип, а также инкапсулировать конкретную коллекцию. Вот упрощенная версия того, что у меня есть.

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 ]

2 голосов
/ 10 июля 2009

Поскольку целью этой схемы является предоставление контекста и метода для запуска из этого контекста, было бы лучше использовать его примерно так:

Closure closure = selectionControl.GetClosure(DateTime.Today);
closure.DateSelection ...
1 голос
/ 10 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...