Дизайн класса: состояние очистки - PullRequest
0 голосов
/ 12 февраля 2010

Я проектирую библиотеку классов, которая будет использоваться следующим образом:

 Engine  eng = new Engine();
 eng.AddPart(part).AddPart(otherPart).Run();

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

1. Игнорируйте это в библиотеке классов, пользователи будут вызывать new каждый раз, когда им нужно отбросить старые детали.

2. Автоматически сбрасывать детали, когда Run называется

3. Добавить Clear метод

4. Вместо возврата текущего объекта из метода AddPart (return this) верните новый экземпляр Engine и не изменяйте текущий.

5. Реализуйте IDisposable, чтобы пользователь мог заключить его в оператор using, даже если нет ресурсов, которые необходимо утилизировать. Пользователи будут использовать это так:

  Engine eng = new Engine();
  using(eng)
  {
      eng.AddPart(part).Run();
  }

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

Есть предложения?

Ответы [ 4 ]

1 голос
/ 12 февраля 2010

IMO, вы должны добавить метод Clear, чтобы завершить интерфейс.

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

На самом деле это можно превратить в Строитель .

1 голос
/ 12 февраля 2010

Метод Clear() является наиболее подходящим выбором здесь;либо это, либо просто требует, чтобы пользователь создал новый Engine.Clear() делает поведение вашей библиотеки наиболее очевидным.

Вы также можете рассмотреть вопрос о перегрузке метода Run() для принятия одной или нескольких частей.Эта версия Run() будет просто выполнять части, а не удерживать их.

0 голосов
/ 09 февраля 2011
Engine eng = new Engine();
eng.AddPart(part).AddPart(otherPart).Run(); 

должно быть таким же, как:

Engine eng = new Engine();
eng.AddPart(part);
eng.AddPart(otherPart);
eng.Run();

Run () не должна делать ничего другого, и, возможно, этот класс мог бы также обрабатывать параллелизм.

Итак, я думаю, что первое - лучшее.

0 голосов
/ 12 февраля 2010

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

...