Как применить шаблон MVC для разработки GUI - PullRequest
8 голосов
/ 07 октября 2008

Я в основном веб-разработчик, но у меня очень хорошее понимание C ++ и C #. Однако недавно я написал приложение с графическим интерфейсом, и я начал заблудиться в том, как обрабатывать отношения между моим контроллером и логикой представления. В PHP это было очень легко - и я мог написать свой собственный шаблон MVC с закрытыми глазами - в основном из-за того, что PHP не имеет состояния, и вы восстанавливаете всю форму за запрос. Но в языках программирования приложений я очень быстро теряюсь.

Мой вопрос: как бы я отделил свой контроллер от вида? Должно ли представление присоединяться к событиям от контроллера - или представление должно реализовывать интерфейс, с которым взаимодействует контроллер?

Ответы [ 5 ]

6 голосов
/ 07 октября 2008

Если бы я был вами, я бы выставлял события через интерфейс вашего взгляда. Это позволит вам сделать контроллер центральным для всего взаимодействия.

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

Если вы хотите, вы также можете использовать брокер событий, который лишит вас необходимости объявлять интерфейс для каждого представления. Таким образом, вы можете привязать события к атрибутам.

В результате контроллер останется зависимым от модели и интерфейса представления, а представление зависит только от данных, а модель не будет иметь зависимостей.

Некоторые примеры описанного выше дизайна можно найти в CAB и на фабрике программного обеспечения Smart Client Ссылка на Smart Client . Они используют шаблон MVP, но его можно одинаково легко применить к шаблону MVC.

3 голосов
/ 10 октября 2008

В большинстве случаев каждый графический интерфейс (от MFC до SWT и т. Д.) Уже основан на MVC. Фактически, шаблон MVC был сначала создан Smalltalk-80, а затем впервые использовался для разработки GUI.

Перепроверьте и посмотрите на стандарты и рекомендуемые методы для вашего выбора инструментария GUI. Иногда MVC не подходит для решения определенной проблемы или работы с конкретным инструментарием.

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

1 голос
/ 07 октября 2008

Важно помнить, что в вашей настройке MVC Контроллер должен знать, какой View вызывать, но View не должен знать ничего о контроллере.

Таким образом, ваше представление должно обеспечивать обобщенный способ взаимодействия контроллеров с ним, чтобы несколько разных контроллеров могли вызывать одно и то же представление (например, стандартизированный графический вывод некоторых данных, предоставляемых в качестве параметра).

Это дает вам гибкость:

  1. Если ваш клиент хочет вывод PDF в то, что вы предоставляете только HTML выход для, вы можете сойти с рук Написание нового PDF View будет называться от контроллера с тем же параметры как вид HTML.
  2. Если ваш клиент хочет получить аналогичный HTML-вывод из другого источника данных (скажем), вы можете уйти с кодированием нового контроллера, который предоставляет другой набор данных для того же старого представления HTML, который дает тот же HTML-отчет просто с другими данные.

Если вы держите свой View отдельно от определенных контроллеров и располагаете знаниями о том, какой View вызывать с вашего контроллера, вы уже в пути.

1 голос
/ 07 октября 2008

Представьте себе этот графический интерфейс:

Подразделение Зерглинга представляется пользователю как иконка пришельцев. Вы можете видеть, что он находится в режиме ожидания анимации. Назовите это Представлением.

Игрок перемещает юнит, нажимая на него и целевое местоположение. Вы можете заменить игрока на AI, если хотите. Назовите это Контроллер.

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

Помните об этой аналогии и расширьте ее для ваших проектов MVC.

0 голосов
/ 07 октября 2008

Ваш контроллер должен обязательно связываться с событиями, определенными в интерфейсе, который реализует представление.

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

Для чего-то действительно быстрого и простого, я бы начал с того, что каждое представление строит свой контроллер, а затем посмотрел бы на другие варианты, если это нужно для увеличения. Лично я думаю, что полная структура внедрения зависимостей излишня для полудюжины форм:]

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