Где место бизнес логике?

Часто возникает спор - где размещать бизнес логику приложения? И варианты ответа - в модель или в контроллер. Удивительно, но оба варианта имеют место быть и порождают либо перегруженную модель или перегруженный контроллер. Надо для себя разобраться и поставить точку в этом.

Начну с логики в контроллере. В этом случае база данных используется исключительно для хранения данных а сервер приложений для каждой транзакции проводит чтение обработку и запись (если запись случается). Каждый контроллер попадает под эту схему. Контроллеры могут быть со своими транзакциями или опираться на транзакции базы данных. Цена реализации подхода логики в контроллере - гипертрофированный контроллер состоящий из множества шаблонного кода и примитивная база данных.

Противоположный подход предполагает хранение бизнес логики в модели (в базе данных). При этом контроллер только вызывает хранимые процедуры базы данных. А хранимые процедуры в свою очередь пишутся руками и решают те же самые задачи что и логика в контроллере. Да, в этом случае меньше накладных расходов - нет необходимости гонять данные между базой данных и сервером приложений. Но уровень компетенции программистов, пишущих код хранимых процедур, должен быть выше. Цена этого решения - гипертрофированная база данных с дорогой поддержкой и простой контроллер.

Если посмотреть на конкретные задачи бизнес логики в разрезе их принадлежности модели, представлению или контроллеру становится очевидным - каждую задачу можно поместить в свой класс. Например формат даты для отображения относится к представлению. Проверка допустимости значения данных - к модели. Кеширование, проверка прав доступа - к контроллеру. Эта тенденция имеет методологических характер и тоже требует четкого понимания. Однако очевидно, что слишком обобщенное понятие бизнес логики и приводит к спору. И оно же объясняет почему обе стороны правы и неправы одновременно.

Бизнес логика делится на бизнес логику модели, представления и контроллера и ее следует размещать у всех трех сторон. Возможно ли это?

Базы данных, в частности PostgreSQL и Oracle обладают мощным функционалом для задач именно обработки данных. База данных обеспечивает требования ACID, которые тяжело обеспечить со стороны сервера приложений. Проверку допустимых значений, и прочая и прочая база данных решает максимально просто и эффективно. Без необходимости перекидывания данных между базой и сервером приложений. Примем как гипотезу что база данных справится с бизнез логикой модели.

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

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

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


2018-11-02