У меня есть следующий сценарий: у меня есть кнопки и PreviewButton в слое Gui, у них есть общая часть с именем BasedButton. Кнопка знает только IButtonPresenter, интерфейс ButtonPresenter. У кнопки не должно быть логики, презентатор может содержать немного логики. Проблема в том, что PreviewButton — настолько простой класс, что ему не нужен ни один ведущий. За исключением одной вещи: функция hasLed (), которая в зависимости от типа кнопки (простой случай переключения) определяет, имеет ли индикатор Button и PreviewButton светодиод или нет. Где должна быть эта общая функция hasLed ()?
Моя идея:
PreviewButton также должен иметь презентатора, а функция hasLed () должна быть в общей части презентатора Button и PreviewButton. Проблема: мне кажется, что только для этой функции я должен представить докладчика.
Поместите это в логику: hasLed () в BasedButton (в общей части Button и PreviewButton). Проблема: я пытался избежать введения какой-либо логики в мой родной интерфейс.
Создайте некоторое пространство имен (или используйте пространство имен типа enum!) И поместите в него эту простую функцию как встроенную функцию. Проблема: «логика» помещена в «странный» и не ожидаемый класс.
Поместите функцию hasLed () в один из классов нашего менеджера на моем уровне презентаторов. Преимущество: интерфейс менеджера доступен для всех родных классов Gui. И код остается общим (без дублирования кода). Недостаток: мои менеджеры с такой функцией кажутся немного странными.
Другая идея?
Может быть, сейчас я бы выбрал 4-й …
Я бы выбрал вариант 1. Это не чрезмерная инженерия (тогда как попытка отличить PreviewButton от Button на уровне интерфейса для меня выглядит чрезмерно сложной), это всего лишь шаблон, но вы избегаете ненужных усложнений дизайна. сюда.
Других решений пока нет …