🔥

Тред (Сергей Сова)


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

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

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

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

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

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

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

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

В моем случае, разделение логики и вью это размещение кода в двух разных файлах-модулях. Например: pages/login/{index.tsx, model.ts}

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

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