Je refactorise une grande base de code où la plupart des classes sont situées dans un seul paquet. Pour une meilleure modularité, je crée des sous-packages pour chaque fonctionnalité.
Je me souviens avoir appris quelque part qu'un graphique de dépendance de package ne devrait pas avoir de boucles, mais je ne sais pas comment résoudre le problème suivant: Figure
est dans le package figure
, Layout
est dans le package layout
, Layout
nécessite la figure pour effectuer la mise en page, donc le package layout
dépend du package figure
. Mais d'un autre côté, un Figure
peut contenir d'autres Figure
s à l'intérieur, ayant le sien Layout
, ce qui rend le paquet figure
dépendant du paquet layout
.
J'ai pensé à quelques solutions, comme créer une Container
interface qui Figure
implémente et la mettre dans le Layout
package. Est-ce une bonne solution? D'autres possibilités?
Merci
la source
Réponses:
Vous devriez penser à l' inversion du contrôle
Vous définissez essentiellement une interface pour votre
Layout
qui est située quelque part près de votre classe Layout dans un propre package afin que vous ayez un package d'implémentation et un package d'interface publique - par exemple, l'appelezLayoutable
(je ne sais pas si c'est le bon anglais). Maintenant - Layout n'implémentera pas cette interface mais laFigure
classe. De même, vous créez une interface pour Figure,Drawable
par exemple.Donc
Maintenant - Figure implémente Layoutable et peut donc être utilisé par Layout et (je ne suis pas encore sûr si c'est ce que vous vouliez) - Layout implémente Drawable et peut être dessiné dans une figure. Le fait est que la classe qui expose un service le rend disponible par une interface (ici: Layout et Layoutable) - la classe qui veut utiliser ce service doit implémenter l'interface.
Vous auriez alors quelque chose comme un objet créateur qui lie les deux ensemble. Ainsi, le créateur aurait une dépendance
Layout
aussi bien que enversFigure
, mais luiLayout
-Figure
même serait indépendant.Voilà l'idée approximative.
Une excellente source de solutions à ces problèmes est le livre Java Application Architecture de Kirk Knoernschild.
la source
Container
interface comme suggéré dans la question?Container
aller dans le même paquet queLayout
. Cela ne fonctionnerait pas, alors que votre solution fonctionnerait.Je ne suis pas trop clair sur ce qu'est un
Figure
, mais peut-être devrait-il être dans le même paquet queLayout
?Votre
Container
solution d'interface proposée ne fonctionnerait pas - à moins que vous ne mettiez l'Container
interface dans un troisième package, vous auriez toujours une dépendance circulaire entre les deux packages. Voir la réponse de michael_s pour quelque chose qui fonctionnerait.Une autre chose, comme d'autres l'ont mentionné - ce ne sera probablement jamais un problème. Vous allez seulement à rencontrer des problèmes à l' avenir si
Figure
etLayout
veulent être séparés des modules . Vous pouvez gérer cela si et quand cela devient nécessaire, mais étant donné que les deux classes semblent assez étroitement liées, cela semble hautement improbable.la source