Refaktoryzuję dużą bazę kodu, w której większość klas znajduje się w jednym pakiecie. Dla lepszej modułowości tworzę podpakiety dla każdej funkcjonalności.
Pamiętam, że dowiadywałem się gdzieś, że wykres zależności pakietu nie powinien zawierać pętli, ale nie wiem, jak rozwiązać następujący problem: Figure
jest w pakiecie figure
, Layout
jest w pakiecie layout
, Layout
wymaga wykonania rysunku, więc pakiet layout
zależy od pakietu figure
. Ale z drugiej strony, Figure
może zawierać w sobie inne Figure
s, które mają swoje własne Layout
, co powoduje, że pakiet figure
zależy od pakietu layout
.
Wymyśliłem kilka rozwiązań, takich jak stworzenie Container
interfejsu, który Figure
implementuje i umieszczenie go w Layout
pakiecie. Czy to dobre rozwiązanie? Jakieś inne możliwości?
Dzięki
źródło
Odpowiedzi:
Powinieneś pomyśleć o odwróceniu kontroli
Zasadniczo definiujesz interfejs,
Layout
który znajduje się gdzieś w pobliżu klasy Layout we własnym pakiecie, więc miałbyś pakiet implementacyjny i pakiet interfejsu publicznego - na przykład zadzwoń do niegoLayoutable
(nie wiem, czy to jest poprawny angielski). Teraz - układ nie zaimplementuje tego interfejsu, aleFigure
klasę. Podobnie stworzyłbyś na przykład interfejs dla FigureDrawable
.Więc
Teraz - Figure implementuje Layoutable, a zatem może być używany przez Layout i (nie jestem jeszcze pewien, czy tego właśnie chciałeś) - Layout implementuje Drawable i można go narysować na rysunku. Chodzi o to, że klasa, która udostępnia pewną usługę, udostępnia ją przez interfejs (tutaj: Layout i Layoutable) - klasa, która chce korzystać z tej usługi, musi implementować interfejs.
Wtedy miałbyś coś w rodzaju obiektu twórcy, który łączy oba razem. Tak więc twórca byłby zależny zarówno od,
Layout
jak i odFigure
, aleLayout
iFigure
oni byliby niezależni.To jest szorstki pomysł.
Doskonałym źródłem rozwiązań tych problemów jest książka Java Application Architecture autorstwa Kirka Knoernschilda.
źródło
Container
interfejs sugerowany w pytaniu?Container
z tego samego pakietu coLayout
. To nie zadziałałoby, podczas gdy twoje rozwiązanie.Nie jestem zbyt jasne, co to
Figure
jest a , ale może powinno być w tym samym pakiecie coLayout
?Proponowane
Container
rozwiązanie interfejsu nie zadziałałoby - chyba że umieściszContainer
interfejs w 3. pakiecie, nadal będziesz mieć cykliczną zależność między dwoma pakietami. Zobacz odpowiedź michaela na coś, co by działało.Kolejna rzecz, jak wspomnieli inni - prawdopodobnie nigdy nie będzie to problemem. Jesteś tylko będzie napotkasz problemy w przyszłości, jeśli
Figure
iLayout
chce być w oddzielnych modułach . Możesz sobie z tym poradzić, jeśli i kiedy stanie się to konieczne, ale biorąc pod uwagę, że obie klasy wydają się dość blisko powiązane, wydaje się to bardzo mało prawdopodobne.źródło