Почему MVC так популярен? - PullRequest
       38

Почему MVC так популярен?

13 голосов
/ 02 сентября 2010

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

  • Архитектурный паттерн MVCимеет 3 зависимости.Вид зависит от модели.Контроллер зависит от вида и модели.Модель является независимой.

  • Архитектурный шаблон Layers определяет N - 1 зависимостей, где N - количество слоев.

При наличии трех слоевВ модели, представлении и контроллере есть только 2 зависимости, в отличие от 3 с традиционным MVC.Структура выглядит следующим образом:

View ---> Controller ---> Model

[Вид зависит от контроллера, контроллер зависит от модели]

Мне кажется, что этот стиль выполняет те же цели и производит более слабую связьПочему этот стиль не более распространен?Действительно ли он выполняет те же цели?

Редактировать: Не ASP.NET MVC, просто шаблон.

Что касается сообщения Грига:

  • Что касается насмешек, Layers по-прежнему позволяет использовать шаблон командного процессора для имитации нажатий кнопок, а также любого другого диапазона событий.
  • Изменения пользовательского интерфейса все еще очень простыВозможно, даже проще.В MVC Контроллер и Вид имеют тенденцию сцепляться.Слои создают строгое разделение.Оба уровня представляют собой черные ящики, которые могут варьироваться независимо друг от друга в реализации.
  • Контроллер имеет 0 зависимостей от View.Вид может быть записан, а время все еще можно сэкономить с помощью слабой связи.

Ответы [ 8 ]

15 голосов
/ 02 сентября 2010

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

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

По крайней мере, это то, что мы сделали, и мы сэкономили месяцы.

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

Наши тесты были также лучше, поскольку мы могли макетировать что угодно, включая нажатия кнопок и т. Д.

А если вы говорите об инфраструктуре asp.net-mvc, то в файлах aspx нет кода, нет состояния просмотра и т. Д.

3 голосов
/ 02 сентября 2010

В правильном MVC контроллер не зависит от вида afaik.Или, возможно, я не правильно понимаю.

Модель определяет данные.

Представление определяет, как выглядит вывод.понимаемая моделью грамматика к понимаемой грамматике.

Так что, по сути, контроллер независим.Точка зрения независима.И модель независимая.

Да?Нет

1 голос
/ 03 ноября 2010

Я давно не возвращался к этому, в основном потому, что все еще думал.Я был недоволен ответами, которые я получил, они действительно не отвечали на мой вопрос.

Профессор недавно направил меня в правильном направлении.По сути, он сказал мне следующее: слои, которые разделяют модель, представление и контроллер , равны MVC.В ванильном архитектурном паттерне MVC зависимость между представлением и моделью часто не используется, и вы фактически получаете слои.Идея та же, наименование просто плохое.

1 голос
/ 02 сентября 2010

Мне кажется, я понимаю вашу точку зрения:

Да, вы можете сделать так, чтобы представление зависело только от контроллера, только сделав так, чтобы контроллер преобразовывал (используя PHP в качестве примера) объекты модели в объекты, не являющиеся моделямикак простые массивы.

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

Среда PHP Symfony поддерживает этот стиль скининга контроллеров между моделями и View.Вы по-прежнему можете напрямую вызывать слой Model для извлечения объектов в слое View, но мы настоятельно рекомендуем устранить возникающие у вас проблемы с соединением.В представлении вы можете вызвать include_component (), который фактически возвращается к контроллеру, если вам нужно запросить модель.

1 голос
/ 02 сентября 2010

Я буду смелым и попытаюсь объяснить, почему ваш метод не завоевал популярность.

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

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

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

Посмотрите на некоторые примеры Struts2, чтобы понять, что я имею в виду ...

0 голосов
/ 03 ноября 2010

Я бы хотел добавить еще кое-что. Прежде всего, с моей точки зрения, мы используем модель в качестве контейнера для информации, которую мы хотим передать и показать на виде. Обычно метод действия в контроллере заканчивается обратным представлением ("viewName", модель). Само представление, вероятно, изменит свою структуру относительно модели:

на просмотре:

if (model.something == true) {

%>

кое-что показать

<% </p>

}

На данный момент определение модели трудно найти.

Я могу сказать (особенно в контексте предприятия), что это две "модели"

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

Контроллер управляет представлениями и не зависит от вида, но немного отличается от модели:

в контроллер

Pulic actionResult Index () {

....

если (model.BoolProperty == TRUE) {

return ("firstView);

}

еще

{

return ("secondView");

}

}

Надеюсь, это имеет смысл

0 голосов
/ 02 сентября 2010

Выбор шаблона презентации для новой или корпоративной веб-разработки на платформе Microsoft - непростая задача, на мой взгляд, их всего три; View Model, Model-View-Presenter (MVP) или ASP.NET MVC (производная Model2).

Полный текст статьи вы можете прочитать здесь Шаблоны ASP.NET MVC

0 голосов
/ 02 сентября 2010

По-моему, вам лучше попробовать это в своей программе, вы можете использовать ruby ​​on rails или codeigniter (для php), эти великолепные фреймворки могут помочь вам понять MVC.

...