Про бизнес-логику

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

И это объясняется тем, что имеющиеся объяснения в интернете довольно противоречивые. Взять, к примеру, определение из Википедии:

Бизнес-логика – совокупность правил, принципов, зависимостей поведения объектов предметной области. Является синонимом термина «логика предметной области».
— Википедия

Так как понятие раскрывается через предметную область, то надо взглянуть и на этот термин:

Предметная область — часть реального мира, рассматриваемая в пределах данного контекста. Под контекстом здесь может пониматься, например, область исследования или область, которая является объектом некоторой деятельности.
— Википедия

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

Теперь давайте натянем это понятие на стандартную трёхслойную архитектуру:

  1. Слой презентации,
  2. Слой бизнес логики,
  3. Слой доступа к данным.

Уже видите противоречие?

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

Тут сразу стоит сказать, что определение из википедии неправильное и путающее, хотя распространенное.

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

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

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

Итого, все описанное можно упаковать в следующее определение:

Бизнес-логика – это правила, описывающие поведение части реального мира (предметная логика) и правила, отвечающие за варианты использования предметной модели и её связь с инфраструктурой (логика приложения).

При этом логика приложения не обязательно должна быть явно отделена от предметной. О патернах организации бизнес-логики можно почитать в книге Patterns of Enterprise Application Architecture.