Я имел большой успех с этим Пассивным Экраном паттерном.
По моему мнению, большая проблема традиционной архитектуры MVC заключается в том, что люди слишком много вкладывают в классы форм. Это увеличивает количество ручного тестирования, которое вам нужно сделать.
Чем больше автоматизированного тестирования вы сможете выполнить после компиляции, тем больше ошибок вы обнаружите на своем рабочем столе. В сложных случаях побочные эффекты даже от незначительных изменений возникают слишком часто.
Хитрость для решения этой проблемы - создание сборки контроллера, на которую ссылается сборка формы (или EXE). Каждая форма имеет соответствующий класс в сборке. Нажатие на кнопку вызовет ThisForm.ThisButton(<args>)
, которая затем будет запускать объекты ниже в вашей структуре. Каждая форма реализует интерфейс, так что, если класс контроллера нуждается в дополнительной информации из формы, он имеет интерфейс для ее извлечения.
Затем для вашего модульного тестирования вы моделируете оператора, выполняющего сложные операции, путем реализации фиктивных классов для запуска событий и передачи информации в классы контроллера. Классы контроллера не знают различий, поскольку фиктивные классы реализуют все ожидаемые интерфейсы.
Есть важное исключение, и это для тривиальных диалогов. Для диалогов, которые имеют несколько флажков, я чувствую, что эта организация излишня. Я часто использую шаблон команды . Поэтому в сборке, где я определяю объекты Command, я помещаю диалог SIMPLE, связанный с этой командой. Насколько простым должно быть диалоговое окно, чтобы получить это лечение, зависит от вас.
Мне нравится структурировать свои приложения следующим образом.
Утилита - это сборка, в которой есть вещи, которые я постоянно использую - математические функции, файловые функции и т. Д.
Объекты - здесь есть определенные объекты, которые я использую для этого приложения.
UIFramework - определяет все интерфейсы форм и контроллеров.
Команды - здесь есть все объекты Command, которые управляют объектами моего приложения.
UI - объекты, которые реализуют интерфейсы контроллера
EXE - формы, реализующие интерфейс формы и вызывающие объекты контроллера.