Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.07.2010, 12: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 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 20.07.2010, 13:28
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,806

B~Vladi,
Мне кажется это зависит от поставленной задачи и в каком виде это будет применяться.
Я бы выбирал так:
Если нужно более безопасное приложение то 2, а если более гибкое то 1.
__________________
.
Ответить с цитированием
  #3 (permalink)  
Старый 20.07.2010, 13:58
Аспирант
Отправить личное сообщение для Panzermaus Посмотреть профиль Найти все сообщения от Panzermaus
 
Регистрация: 14.07.2010
Сообщений: 43

Сообщение от B~Vladi Посмотреть сообщение
Всем мир.
Алейкум ассалам.

Сообщение от B~Vladi Посмотреть сообщение
Всеми любимый jQuery тому пример.
ИМХО, нельзя сказать, что jQuery несовместим с MVC, так как это всего лишь библиотека, а не фреймворк. Каждый пишет как ему заблагорассудится. Кстати, bind() и trigger() из jQuery вполне можно использовать для "событийного" подхода.
Ответить с цитированием
  #4 (permalink)  
Старый 20.07.2010, 14:23
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,022

Сообщение от Skipp
а если более гибкое то 1
В чем гибкость первого подхода? Наоборот - зависимость одного от другого сильно мешает при расширении/изменении приложения.

Сообщение от Panzermaus
ИМХО, нельзя сказать, что jQuery несовместим с MVC
Почему? В jQuery вообще нет никаких границ. К примеру тот же вызов:
$('input[name=data].active:checked')

подразумевает, что приложение должно знать какие данные ему нужны, какое представление они сейчас имеют и какое логическое состояние оно должно иметь.
Любой плагин для jQ имеет API. Некоторые используют разметку (по классам и т.п.) вместо него, но суть от этого не меняется - плагин должен знать представление (класс), чтобы находить элементы.
Так что иди читай.

Сообщение от Panzermaus
так как это всего лишь библиотека, а не фреймворк
В чем разница?
Сообщение от Panzermaus
Кстати, bind() и trigger() из jQuery вполне можно использовать для "событийного" подхода.
Ты, видимо, немного не допонял. События не являются стандартными для DOM.

Последний раз редактировалось B~Vladi, 20.07.2010 в 14:25.
Ответить с цитированием
  #5 (permalink)  
Старый 20.07.2010, 14:34
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,806

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

Сообщение от Skipp
В любом случаи что-то зависит от чего-то.
Во втором случае модули никак не связаны друг с другом.
Ответить с цитированием
  #7 (permalink)  
Старый 20.07.2010, 15:05
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,806

B~Vladi,
Но они зависят от контролёра. То есть при изменение контролёра, возможно потребуется изменение модулей.
__________________
.
Ответить с цитированием
  #8 (permalink)  
Старый 20.07.2010, 15:11
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,806

B~Vladi,
В любом случаи независимого кода не существует.
Поэтому я считаю этого надо бояться в тех случаях когда безопасность на первом плане.
__________________
.
Ответить с цитированием
  #9 (permalink)  
Старый 20.07.2010, 15:14
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

К сожалению, я вебдев и ни разу не GUI'овец, поэтому могу сказать только со своей колокольни.

Допустим, у нас есть два с виду независимых компонента: отправка формы аяксом и кастомные селекты с фенечками. Живут себе, мирно сосуществуют (каждый из них ненавязчив, ошибкоустойчив и выполняются в разных scope, ожидая событий через live).

И вдруг нужно, чтобы при использовании фенечки в «псевдоселекте», срабатывала бы отправка формы. И тут те же самые два пути: можно добавить в псевдоселект вызов что-то типа «ajaxFormSend()», либо генерировать событие «jsonSuggestApply».

В первом случае получаем лишнуюю зависимость (if (ajaxFormSend) ajaxFormSend() — так, цветочки), во втором, компонент сам отлавливает нужное событие (события) и реагирует на них.

Лично мне ближе второй вариант.
Ответить с цитированием
  #10 (permalink)  
Старый 20.07.2010, 15:24
Аспирант
Отправить личное сообщение для Panzermaus Посмотреть профиль Найти все сообщения от Panzermaus
 
Регистрация: 14.07.2010
Сообщений: 43

Сообщение от B~Vladi Посмотреть сообщение
В чем разница?
Из библиотеки можно использовать в приложении только ту часть, которая нужна, например одну функцию.
Фреймворк (бурж. "каркас") жестко диктует всю архитектуру приложения, во всю используя паттерны Шаблонный метод и Стратегия. То есть состоит из "заглушек", которые переопределяются приложением по мере надобности. Для примера: стандартные функции php - это библиотека. Zend Framework, CodeIgniter, CakePHP - фреймворки.

Сообщение от B~Vladi Посмотреть сообщение
Ты, видимо, немного не допонял. События не являются стандартными для DOM.
Допонял. jQuery позволяет создавать custom events:
// module #1
$('body').bind('myevent', handler1);

// module #2
$('body').bind('myevent', handler2);

// module #3
$('body').trigger('myevent'); // вызовутся handler1() и handler2()
Разве не это требовалось?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Google Chart API mycoding Оффтопик 0 14.07.2010 10:22