Показать сообщение отдельно
  #1 (permalink)  
Старый 20.07.2010, 13:44
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,022

MVC vs API. Ваше мнение.
Всем мир.

В приложении есть набор модулей/плагинов/виджетов. Необходимо реализовать взаимодействие между ними.

Давайте с вами разберём два основных подхода клиентского программирования:

Первый вариант для многих знаком и привычен. Суть его в том, что каждый модуль имеет внешнее API, посредством которого можно управлять им (модулем) из стороннего модуля. Схематично это выглядит примерно так:
http://javascript.ru/forum/attachmen...1&d=1279616659

Обращение одного модуля к другому указано стрелками между ними. Так же может быть (может и не быть) контроллер этих плагинов со своим API. Контроллер может иметь функционал добавления/удаления модулей, получение API определённого модуля, если ссылка была потеряна и так далее.

Что я думаю о таком варианте:
+ API позволяет напрямую изменять другие модули. На первый взгляд все логично и удобно.

- Модули зависят друг от друга. Логика обращений из одного модуля к другому зашита внутри кода первого и наоборот. При смене API одного, менять нужно все, которые его (API) используют.
- Изменение ответов сервера влечет изменение клиентской части.
- Не соответствует архитектуре MVC. Если один модуль отвечает за бизнес логику и в нем происходят какие-либо изменения, их должен отобразить другой модуль. В этом случае граница между ними становится размытой.

Такой подход я наблюдаю повсюду. Всеми любимый jQuery тому пример.

Второй вариант использует событийную архитектуру. Суть его в том, что каждый модуль реагирует на определённые события, присылаемые контроллером, которые в свою очередь генерирует источник события. Схематично это выглядит так:
http://javascript.ru/forum/attachmen...1&d=1279618583

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

Что я думаю о таком варианте:
При таком подходе все минусы первого варианта становятся плюсами и наоборот.

Для меня выбор очевиден, но хотел бы спросить вас:
в каком варианте вам было бы удобнее поддерживать/развивать чужое приложение? К примеру, если вы работаете в команде, какой подход бы вы выбрали? Или может у кого есть другие варианты? Спасибо.
Изображения:
Тип файла: jpg 1.jpg (8.7 Кб, 45 просмотров)
Тип файла: jpg 2.jpg (8.4 Кб, 52 просмотров)
Ответить с цитированием