Структура проекта и качество кода, часть 2



В прошлом посте мы рассмотрели основные структуры, по которым делаются проекты. Структура помогает легко ориентироваться в коде, плюс снижает связность между компонентами за счёт модификаторов доступа.



Просто так использовать default класс из другого пэкеджа (то есть повысить связность) не получится, код не скомпилируется. Либо придётся менять модификатор доступа, что точно будет заметно на ревью.



Но кое-что разрушает эту прекрасную картину: фреймворки



Чтобы Spring мог сотворить волшебство, приходится немного жертвовать изоляцией. Начиная с public репозиториев и заканчивая одним контекстом на всё приложение.



При использовании спринга (или других фреймворков) связность между компонентами меньше ограничивается и с течением времени растёт.



Но выход есть!



Поделить функциональность не на пэкеджи, а на Maven/Gradle модули:



📂 registration

📂 src

— Controller, Service, Repository

📂 test

pom.xml



📂 export



⚠️ Обратите внимание, каждый модуль — просто набор классов и тестов, а не отдельный микросервис!



Связность при таком подходе снижается ещё больше:

У каждого модуля свой набор зависимостей

Нет общего контекста



Можно, наверное, поделить приложение на java модули, но модули Maven/Gradle встречаются гораздо чаще.



Совсем большие проекты идут ещё дальше. В Hexagonal/Clean/Onion/… architecture каждый бизнес-сценарий делится на модули бизнес-правил, адаптеров, инфраструктуры и тд.



Минимальная связность, ультра простое тестирование

😐 Количество модулей, классов и интерфейсов увеличивается в разы

😐 Легко скатиться в карго-культ, нужен опыт для правильной реализации



Резюме



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



Если приложение большое, имеет смысл поделить его на отдельные модули. У каждого бизнес-процесса будет свой контекст и набор зависимостей. Поддерживать такую структуру будет гораздо проще👍