Ich kann Ihnen nur meine Organisationsmeinung zu diesem Thema mitteilen. Wir sind dabei , für jedes einzelne Projekt, an dem wir arbeiten, auf Module umzusteigen. Was wir bauen, sind im Grunde genommen Mikrodienste + einige Client-Bibliotheken. Für Mikrodienste hat der Übergang zu modules
irgendwie eine niedrigere Priorität: Der Code dort ist bereits irgendwie im Docker-Container isoliert, so dass das "Hinzufügen" von Modulen dort (für uns) nicht sehr wichtig erscheint. Diese Arbeit wird langsam aufgenommen, hat aber eine niedrige Priorität.
Auf der anderen Seite ist Client-Bibliotheken eine ganz andere Geschichte. Ich kann dir das Chaos nicht sagen, das wir manchmal haben. Ich werde einen Punkt erklären, den ich vorher gehasst habe jigsaw
. Sie stellen Clients eine Schnittstelle zur Verfügung, die jeder verwenden kann. Automatisch interface
ist das public
- der Welt ausgesetzt. Normalerweise habe ich dann einige package-private
Klassen, die nicht den Clients ausgesetzt sind, die diese Schnittstelle verwenden. Ich möchte nicht, dass Kunden das verwenden, es ist intern. Hört sich gut an? Falsch.
Das erste Problem ist, dass wenn diese package-private
Klassen wachsen und Sie mehr Klassen möchten, die einzige Möglichkeit, alles verborgen zu halten, darin besteht, Klassen im selben Paket zu erstellen :
package abc:
-- Usage.java
-- HelperUsage.java
-- FactoryUsage.java
....
Wenn es wächst (in unseren Fällen), sind diese Pakete viel zu groß. Wechseln Sie zu einem separaten Paket, sagen Sie? Sicher, aber dann das HelperUsage
und FactoryUsage
wird es sein public
und wir haben versucht, das von Anfang an zu vermeiden.
Problem Nummer zwei: Jeder Benutzer / Aufrufer unserer Kunden kann denselben Paketnamen erstellen und diese versteckten Klassen erweitern. Es ist uns schon ein paar Mal passiert, lustige Zeiten.
modules
löst dieses Problem auf schöne Weise: public
ist nicht mehr wirklich public
; Ich kann friend
über exports to
Direktive Zugang haben . Dies erleichtert unseren Code-Lebenszyklus und unsere Verwaltung erheblich. Und wir entkommen der Hölle des Klassenpfades. Natürlich maven/gradle
kümmern wir uns hauptsächlich darum, aber wenn es ein Problem gibt, werden die Schmerzen sehr real sein. Es könnte auch viele andere Beispiele geben.
Der Übergang ist jedoch (noch) nicht einfach. Zunächst muss jeder im Team ausgerichtet werden. Zweitens gibt es Hürden. Die größten zwei, die ich noch sehe, sind: Wie trennt man jedes Modul, basierend auf was speziell? Ich habe noch keine definitive Antwort. Die zweite ist split-packages
, oh die schöne "gleiche Klasse wird von verschiedenen Modulen exportiert". Wenn dies bei Ihren Bibliotheken der Fall ist, gibt es Möglichkeiten, dies zu verringern. aber wenn dies externe Bibliotheken sind ... nicht so einfach.
Wenn Sie auf jarA
und jarB
(separate Module) angewiesen sind , beide jedoch exportieren abc.def.Util
, werden Sie überrascht sein. Es gibt jedoch Möglichkeiten, dies zu lösen. Irgendwie schmerzhaft, aber lösbar.
Insgesamt ist unser Code seit der Migration auf Module (und dies immer noch) viel sauberer geworden. Und wenn Ihr Unternehmen ein "Code-First" -Unternehmen ist, ist dies wichtig. Andererseits war ich an Unternehmen beteiligt, bei denen dies von leitenden Architekten als "zu teuer" und "kein wirklicher Vorteil" angesehen wurde.