Я можу сказати вам лише свою думку організації з цього приводу. Ми знаходимося в процесі переходу до модулів, для кожного окремого проекту, ми працюємо. Те, що ми будуємо, - це в основному мікросервіси + деякі бібліотеки клієнтів. Для мікросервісів перехід на modules
дещо нижчий пріоритет: код там уже якимось чином ізольований у контейнері докера, тому "додавання" модулів туди не здається (нам) дуже важливим. Ця робота починається повільно, але вона є пріоритетною.
З іншого боку, клієнтські бібліотеки - це зовсім інша історія. Я не можу сказати вам, який у нас інколи безлад. Поясню один момент, який я раніше ненавидів jigsaw
. Ви надаєте клієнтам інтерфейс для всіх. Автоматично interface
це public
- піддається світові. Зазвичай те, що я роблю, - це мати деякі package-private
класи, які не піддаються дії клієнтів, які використовують цей інтерфейс. Я не хочу, щоб клієнти цим користувались, це внутрішнє. Звучить добре? Неправильно.
Перша проблема полягає в тому, що коли ці package-private
класи зростають, і ви хочете більше класів, єдиний спосіб тримати все прихованим - це створювати класи в одному пакеті:
package abc:
-- Usage.java
-- HelperUsage.java
-- FactoryUsage.java
....
Коли він росте (у наших випадках він зростає), ці пакети занадто великі. Перехід до окремого пакета, про який ви говорите? Звичайно, але тоді це HelperUsage
і FactoryUsage
буде, public
і ми намагалися уникати цього з самого початку.
Проблема номер два: будь-який користувач / абонент наших клієнтів може створити одне і те ж ім’я пакета та розширити ці приховані класи. Це вже кілька разів траплялося з нами, веселі часи.
modules
вирішує цю проблему красиво: насправдіpublic
це вже не так public
; Я можу отримати friend
доступ через exports to
директиву. Це значно полегшує життєвий цикл коду та управління ним. І ми втікаємо від пекла із навчальних стежок. Звичайно, впорайтеся maven/gradle
з цим, головним чином, але коли є проблема, біль буде дуже реальною. Також може бути багато інших прикладів.
Тим не менш, перехід (все ще) непростий. Перш за все, усі в команді повинні бути вирівняні; по-друге, є перешкоди. Найбільші два, які я все ще бачу: це як ви розділяєте кожен модуль на основі чого? У мене поки немає однозначної відповіді. Другий - split-packages
о, прекрасний "той самий клас експортується за допомогою різних модулів". Якщо це трапляється з вашими бібліотеками, є способи пом'якшення; але якщо це зовнішні бібліотеки ... не що легко.
Якщо ви залежате від jarA
і jarB
(окремих модулів), але вони обидва експортують abc.def.Util
, вас чекає сюрприз. Однак є способи вирішити це. Якось болісно, але розв’язано.
Загалом, з того часу, як ми перейшли на модулі (і досі це робимо), наш код став набагато чистішим. І якщо ваша компанія є компанією, яка першою розробляє код, це має значення. З іншого боку, я брав участь у компаніях, якщо старші архітектори вважали це «занадто дорогим», «ніякої реальної вигоди».