- PVSM.RU - https://www.pvsm.ru -

Шаблон MVC — это тупик для разработки приложений?

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

В самом Model View Controller шаблоне нет ничего плохого. Он решает ту проблему, для которой его придумали — это разделение логики обработки запроса пользователя от логики представления информации.

mvc


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

Спагетти код

Использование MVC шаблона хорошо там, где модули относительно независимы друг от друга. Например, они вызываются из главного меню. Пользователь работает с модулем A, потом открывает модуль B и так далее.

Слабая связанность

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

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

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

А что если система поставляется множеству пользователей?

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

Но здесь кроется коварство использования MVC шаблона. Как показано на изображении ниже, велик соблазн ссылаться напрямую с представления (View) модуля 'A' на контроллер (Controller) модуля 'B', с модуля 'B' на модуль 'C', с модуля 'C' на модуль 'D'.

Сильная связанность
(Или же из контроллера модуля 'A' на контроллер модуля 'B'. Или, что ещё хуже, из контроллера модуля 'A' на представление модуля 'B'. )

Бизнес процесс будет жёстко прошит в 3х представлениях (Views). Согласитесь, что не очень-то и наглядно. Изменение бизнес процесса будет также затруднено из-за распределения связей по нескольким файлам. А поддержку нескольких вариантов бизнес логики, где будут, например, связаны модули A, С и D, придется реализовывать через if/else в представлениях (Views).

К сожалению, данный подход очень часто используется для построения приложений.

Как же вернуть былую слабую связанность модулей системы, сохранив описание бизнес процессов внутри неё?

Шаблон MVC — это тупик для разработки приложений?

Для этого нужно вынести конфигурацию бизнес процессов из модулей и поместить её отдельно.
Сделать так, чтобы пользователи и все модули общались через один основной контроллер.
При этом контроллер будет руководствоваться конфигурацией, какие модули, в какой последовательности предоставлять пользователю для работы.

Для конфигурации состояний модулей и переходов между ними очень удобно использовать реализации, основанные на конечных автоматах [1] (Finite State Machine [2]).

Примерами таких реализаций в Java мире могут послужить:

Spring Web Flow [3] — надстройка над Spring MVC [4].

ADF Task Flows [5] от Oracle [6] — реализация очень похожа на Spring Web Flow.

Lexaden Web Flow [7] — реализация для компонентной модели Vaadin [8].

Какие вы ещё знаете реализации данного подхода в Java?
Может, есть похожие фреймворки для других языков программирования?

Автор: hitmark

Источник [9]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/mvc/26877

Ссылки в тексте:

[1] конечных автоматах: http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82

[2] Finite State Machine: http://en.wikipedia.org/wiki/Finite-state_machine

[3] Spring Web Flow: http://www.springsource.org/spring-web-flow

[4] Spring MVC: http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html

[5] ADF Task Flows: http://docs.oracle.com/cd/E16162_01/web.1112/e16182/taskflows.htm

[6] Oracle: http://www.oracle.com/

[7] Lexaden Web Flow: http://www.lexaden.com/main/entry/web_flow

[8] Vaadin: http://vaadin.com/

[9] Источник: http://habrahabr.ru/post/169033/