Ich überarbeite eine große Codebasis, in der sich die meisten Klassen in einem Paket befinden. Zur besseren Modularität erstelle ich Unterpakete für jede Funktionalität.
Ich erinnere mich, dass ich irgendwo erfahren habe, dass ein Paketabhängigkeitsdiagramm keine Schleifen haben sollte, aber ich weiß nicht, wie ich das folgende Problem lösen soll: Figure
Ist im Paket figure
, Layout
ist im Paket layout
, Layout
erfordert die Abbildung, um das Layout auszuführen, also layout
hängt das Paket vom Paket ab figure
. Auf der anderen Seite Figure
kann a andere Figure
s enthalten , die ihre eigenen haben Layout
, was das Paket figure
vom Paket abhängig macht layout
.
Ich habe mir einige Lösungen überlegt, wie das Erstellen einer Container
Schnittstelle, die diese Figure
implementiert und in das Layout
Paket einfügt. Ist das eine gute Lösung? Irgendwelche anderen Möglichkeiten?
Vielen Dank
quelle
Antworten:
Sie sollten über die Umkehrung der Kontrolle nachdenken
Sie definieren im Grunde genommen eine Schnittstelle für Ihre,
Layout
die sich irgendwo in der Nähe Ihrer Layout-Klasse in einem eigenen Paket befindet, sodass Sie ein Implementierungspaket und ein öffentliches Schnittstellenpaket haben - nennen Sie es beispielsweiseLayoutable
(ich weiß nicht, ob das richtig Englisch ist). Jetzt - Layout implementiert nicht diese Schnittstelle, sondern dieFigure
Klasse. Ebenso würden Sie eine Schnittstelle für Figure erstellen, dieDrawable
zum Beispiel ist.So
Jetzt - Abbildung implementiert Layoutable und kann daher von Layout verwendet werden und (ich bin mir noch nicht sicher, ob Sie dies wollten) - Layout implementiert Drawable und kann in einer Figur gezeichnet werden. Der Punkt ist, dass die Klasse, die einen Dienst verfügbar macht, ihn über eine Schnittstelle verfügbar macht (hier: Layout und Layoutable) - die Klasse, die diesen Dienst verwenden möchte, muss die Schnittstelle implementieren.
Dann hätten Sie so etwas wie ein Erstellerobjekt, das beide miteinander verbindet. Der Schöpfer würde also sowohl von
Layout
als auch von abhängig seinFigure
, aberLayout
undFigure
selbst wäre unabhängig.Das ist die grobe Idee.
Eine ausgezeichnete Quelle für Lösungen für diese Probleme ist das Buch Java Application Architecture von Kirk Knoernschild.
quelle
Container
in der Frage vorgeschlagene Schnittstelle?Container
das gleiche Paket wie verpasstLayout
. Das würde nicht funktionieren, während Ihre Lösung würde.Ich bin mir nicht
Figure
sicher, was ein ist, aber vielleicht sollte es im selben Paket sein wieLayout
?Ihre vorgeschlagene
Container
Schnittstellenlösung würde nicht funktionieren - wenn Sie dieContainer
Schnittstelle nicht in ein drittes Paket einfügen, besteht immer noch eine zirkuläre Abhängigkeit zwischen den beiden Paketen. Siehe die Antwort von michael_s für etwas, das funktionieren würde.Eine andere Sache, wie andere erwähnt haben - es wird wahrscheinlich nie ein Problem sein. Du wirst nur Probleme in Zukunft laufen , wenn
Figure
undLayout
will in getrennt sein Module . Sie können damit umgehen, wenn dies erforderlich wird. Da die beiden Klassen jedoch ziemlich eng miteinander verbunden zu sein scheinen, ist dies höchst unwahrscheinlich.quelle