Статьи

MVC: неправильно понял в течение 37 лет

С августа я помогаю Гастону Сильве создать микросайт о Семейном древе MVC . Это супер круто, вы должны это проверить. Моя точка зрения заключается в том, что я люблю Model View Controller, но раздражен тем, насколько загрязненным стало определение. Мой бывший ОГО, Мартин Фаулер, написал статью о GUI Architectures в 2006 году, но я высокомерно хотел, чтобы кто-то еще попытался сделать что-то, что подтолкнуло к определению.

Мартин говорит в своей статье: «Так что не принимайте мои описания как авторитетные». То же самое относится и ко мне — просто еще один парень, взвешивающий неправильно истолкованную модель Model View Controller.

Характеристики MVC

Как уже говорилось с Гастоном в Огесте, прежде чем он занялся созданием вышеуказанного микросайта:

1. Контроллер классически составляет модели и виды. Либо на этапе концептуального запуска, либо как раз вовремя для частей пользовательского интерфейса.
2. Изменения модели могут распространяться на просмотр вызываемой логики контроллера.
3. Просмотр изменений может распространяться на модель без вызова логики контроллера.
4. Контроллер может опционально выполнять посредничество между моделью и представлением.
5. Взаимодействия представлений часто вызывают логику контроллера для более сложных ситуаций (в большинстве случаев выше).
6. Модель в значительной степени отбрасывается, чтобы отказаться от ожидающих «изменений».
7. Сохранение модели часто является преднамеренным действием, которое распространяет контент моделей на постоянное место (через сервисы или напрямую в какую-либо форму БД или хранилища).
7. Модели могут быть вложенными или расширенными ( стиль Лискова)
9. Представления могут быть расширены и почти всегда являются вложенными
10. Если модель не передана представлению, представление не может получить к нему доступ. На самом деле вся наука о MVC кричит о внедрении зависимостей.

Примеры фрагментов Java-кода

view = new ComboBox(new ComboBoxModel())

view = new MyExtendedComboBox(new ComboBoxModel(myStringArray))

view = new ComboBox(new MySpecialComboBoxModel())

view = new MyExtendedComboBox(new MySpecialComboBoxModel())

view = new ComboBox(new MySpecialComboBoxModel(new MyListOfThings()))

mscbm = new MySpecialComboBoxModel(new MyListOfThings())
view = new ComboBox(mscbm).withChangeHandler(someHandlerMethod(mscbm))

Почему это так сложно реализовать правильно?

Иногда это технология, а не идиома

Неинстанцируемые представления

Microsoft IIS (.Net 1.1 — 2) действительно хотела быть в соединении для вызовов веб-запросов. Кодовый код был предметом для разработанных страниц, что означало несколько вещей:
1. вы не собирались расширять представление
2. в ситуациях с модульным тестированием вы не могли сами создавать представление, вводить их в макеты вещей это был не вид. Прочитайте газету Майкла Перса « Скромный диалог»

С появлением Интернета и возрастающей важностью программирования на JavaScript оказалось, что весь код и разметка / логика представления разбросаны по DOM таким образом, что для понимания потребуется степень доктора наук. Таким образом, было трудно разделить представление модели и контроллер в течение самого длительного времени. Сообществу open source пришлось разработать некоторые методы для этого. Несмотря на это, нынешний разработчик таких технологий, AngularJS, утверждает, что является приложением Model-View-Wh независимо (MVW или MV *), а не приложением MVC. Точно так же, когда представление размечено в HTML, вам будет трудно убедить людей в том, что его можно расширить простым способом.

Фронт-контроллеры не показатель

Идеи «Model 2 Controller», продвигаемые Sun в 1998 году, стали ассоциироваться с MVC, но на самом деле это немного натянуто. Во-первых, модель и представление не могут случайно обновить друг друга без контроллера, являющегося оркестратором этого (два критерия распространения выше).

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

Поздно на вечеринку MVC

В некоторых случаях у разработчиков технологий было что-то хорошее, что противоречило принципу MVC. Например, у Microsoft было огромное количество возможностей с привязкой данных. Это, возможно, началось с MS-Access в 90-х годах, и было очень много в их ДНК. Я написал часть истории этого для Гастона. Это позволило им, на мой взгляд, задержать прибытие на землю MVC.

Когда я получаю резюме или резюме от кандидатов на должности разработчика, я иногда сталкиваюсь с любопытством: MVC — это шаблон проектирования с 1998 года, а ASP.NET MVC — это технология Microsoft с 2008 года, но оба они объединены в печати.