MyTetra Share
Делитесь знаниями!
Где должна находиться бизнес-логика в парадигме MVC?
Время создания: 03.10.2014 21:52
Текстовые метки: mvc, бизнес-логика, модель, вид, контроллер, Yii
Раздел: Компьютер - Программирование - Теория программирования
Запись: xintrea/mytetra_syncro/master/base/1412358774jqv54gxunx/text.html на raw.github.com

Вопрос: где должен располагаться код бизнес-логики в парадигме MVC?

Ответ: бизнес-логика должна размещаться в Модели данных.

Пример для фреймверка Yii:

Допустим нам нужно перевести новость в архив. Делается это установкой поля status. Простой экшн в контроллере:

public function actionArchiveNews($id)

{

$news = News::model()->findByPk($id);

$news->status = News::STATUS_ARCHIVE;

$news->save();

}

Ошибка данного примера в том, что мы переносим бизнес-логику в контроллер. Это так же ведет к невозможности повторно использовать код (ниже объясню почему), но это лишь мелочь по сравнению со второй проблемой: что если мы изменим способ перевода в архив? Например, вместо изменения статуса мы будем присваивать true полю inArchive? И это действие будет выполняться в нескольких местах приложения? И это не новость, а транзакция на 10млн$?

В примере эти места легко найти — достаточно сделать Find Usage для константы STATUS_ARCHIVE. Но если вы сделали это с помощь запроса "status = 'archive'" — найти гораздо сложнее, ведь даже один лишний пробел — и вы бы не нашли эту строку.

Бизнес логика всегда должна оставаться в модели. Здесь следует выделить отдельный метод в сущности, который переводит новость в архив (или как-то по другому, но именно в слое бизнес-логики). Этот пример — крайне утрирован, немногие допускают подобную ошибку.

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования