user_of_toster
@user_of_toster

Контроллеры в одну строчку VS размазывание бизнес-логики в контроллере — что хуже?

Контроллеры в одну строчку:
  1. Соблюдаем SRP - контроллер занимается только обработкой запросов и передачей управления бизнес-логике.
  2. Легко делать изменения при смене протокола (http на websockets, например)
  3. Попахиваем посредником


Логика прямо в контроллерах:
  1. Нарушаем SRP (?) - контроллер занимается И обработкой запросов И выполнением бизнес-логики
  2. При смене протокола (http на websockets, например) придется выносить логику в отдельный класс
  3. Не пахнем посредником


Ту же аналогию можно привести и с бизнес-логикой в одну-две строки, которая всё, что делает - передает вызов в репозиторий. Вопрос - что хуже и почему? Когда делегировать, а когда писать сразу на месте?
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov
Senior software developer, system architect
Однозначно лучше держать бизнес-логику отдельно.
Отдельно не только контроллеров, а вообще от всего, даже от фреймворка (в случае чего сможете безболезненно сменить фреймфорк).

По опыту могу сказать, что если проект будет использоваться, развиваться - будет нужно постоянно вносить правки, а делать это когда бизнес логика "размазана" по контроллерам крайне сложно, еще сложнее, когда запросы в базу идут прямо из контроллера, ошибки неизбежны. Много будет ошибок. И поиск ошибок будет не простым.

Покрывать тестами отдельно реализованную бизнес-логику намного проще, чем когда она в контроллерах.

Также не редко бывает, когда какие то действия со стороны бизнес-логики могут быть инициированы как по HTTP, веб-сокетам, GRPC, через cron или вообще вызываться из фоновой задачи. И тут однозначно придётся выносить бизнес логику из контроллера. Так получится что логика "размазана" не только по контроллерам, а еще и по другим местам, потом очень долго надо со всем этим разбираться :)

Мне нравится вариант, когда есть модели(сущности), которые просто содержат данные + минимум методов, есть репозиторий, который только пишет/читает данные из базы и есть много маленьких сервисов, которые работают с моделями и репозиториями + в них же может быть и бизнес-логика. Вот эти самые сервисы хорошо вызывать в контроллерах.

С другой стороны, если проект очень маленький, тогда есть смысл сэкономить время и сильно не заморачиваться.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы