순환 패키지 종속성을 해결하는 방법


11

대부분의 클래스가 하나의 패키지에있는 큰 코드베이스를 리팩토링하고 있습니다. 더 나은 모듈성을 위해 각 기능별로 하위 패키지를 만들고 있습니다.

나는 패키지 종속성 그래프가 루프를하지 말았어야 어딘가에 학습 기억하지만, 나는 다음과 같은 문제를 해결하는 방법을 모른다 : Figure패키지에 figure, Layout패키지에 layout, Layout패키지, 그래서 레이아웃을 수행 할 수있는 인물이 필요 layout패키지에 따라 달라집니다 figure. 그러나 반면에 a FigureFigure자체에 다른을 포함 할 수 있으므로 Layout패키지에 figure따라 패키지가 종속됩니다 layout.

나는 그것을 구현하고 패키지에 넣는 Container인터페이스를 만드는 것과 같은 몇 가지 솔루션을 가지고 있습니다 . 이것이 좋은 해결책입니까? 다른 가능성?FigureLayout

감사


모듈 (예 : 다른 Jar)은 순환 종속성을 가질 수 없습니다. 패키지는 동일한 모듈에 속하는 한 순환 종속성을 가질 수 있으며 종종 있습니다.
lorus

@lorus 그래서 이것은 디자인 문제가 아닌가?
vainolo

2
전혀 그렇지 않다. 패키지는 일반적으로 네임 스페이스 일 뿐이며, OSGi 환경에서 컨텐츠 가시성을 변경하는 등 다른 용도로만 사용될 경우에만 변경 될 수 있습니다. 다른 방법으로 귀찮게하지 마십시오.
lorus

1
많은 당국이 주기적 의존성을 비난하고 때로는 타당한 이유가 있지만, 맹목적으로 리팩토링하기 전에 그 이유 중 하나가 실제로 당신에게 적용되는지 확인해야합니다. 패키지 구조가 문제를 일으키지 않고 양심적으로 미래에 왜 그런지 볼 수 없다면 추상적 아키텍처 가치를 만족시키기 위해 근본적인 것을 바꾸지 마십시오.
Kilian Foth

답변:


9

제어 역전에 대해 생각해야 합니다

기본적으로 Layout자신의 패키지에서 Layout 클래스 근처에 있는 인터페이스를 정의하여 구현 패키지와 공용 인터페이스 패키지를 만들 수 있습니다 Layoutable( 예 : 적절한 영어인지는 모르겠습니다). 이제 레이아웃은 해당 인터페이스가 아닌 Figure클래스를 구현합니다 . 마찬가지로 그림에 대한 인터페이스를 만들 수 있습니다 Drawable.

그래서

my.public.package.Layoutable
my.implementation.package.Layout
my.public.package.Drawable
my.implementation.package.Figure

이제-Figure는 Layoutable을 구현하므로 Layout에서 사용할 수 있으며 (원하는 경우 확실하지 않습니다)-Layout은 Drawable을 구현하고 Figure에 그릴 수 있습니다. 요점은 일부 서비스를 제공하는 클래스가 인터페이스 (여기 : 레이아웃 및 레이아웃 가능)로 서비스를 제공한다는 점입니다. 해당 서비스를 사용하려는 클래스는 인터페이스를 구현해야합니다.

그러면 두 객체를 하나로 묶는 생성자 객체와 같은 것이 있습니다. 따라서 제작자는 Layout뿐만 아니라에 대한 의존도를 가지게 Figure되지만 LayoutFigure자체는 독립적입니다.

그것은 거친 생각입니다.

Kirk Knoernschild의 Java Application Architecture 책이이 문제에 대한 훌륭한 해결책 입니다.


Container질문에서 제안한 인터페이스와 동일하지 않습니까?
vaughandroid

예-아니요-언급 한 것과 동일한 패키지에 두지 않습니다. 그리고 그 뒤에 많은 이론이 없었습니다. 그리고이 경우에는 한쪽면으로는 충분하지 않으므로 양쪽면에서해야합니다. 좋구나?
michael_s

죄송합니다 . Container와 동일한 패키지를 사용하는 것에 대한 원래 질문에서 약간 누락 되었습니다 Layout. 솔루션은 작동하지 않지만 작동하지 않습니다.
vaughandroid

아-좋아-해킹 할 때 컨테이너와 함께 부분을 놓친 것 같았습니다. 컨테이너 이름을 지정해야합니다.)
michael_s

0

나는 무엇인지에 대해 너무 명확하지 Figure않지만 아마도 같은 패키지에 있어야 Layout합니까?

제안 된 Container인터페이스 솔루션이 작동하지 않습니다. Container인터페이스를 세 번째 패키지에 넣지 않으면 두 패키지 사이에 순환 종속성이 있습니다. 작동하는 것에 대해서는 michael_s의 답변 을 참조하십시오 .

다른 사람들이 언급했듯이 다른 것은 아마도 결코 문제가되지 않을 것입니다. 당신은 경우 향후 문제에 실행하는거야 FigureLayout분리 될하고자하는 모듈 . 필요하다면 언제라도이 문제를 해결할 수 있지만, 두 클래스가 서로 밀접하게 관련되어있는 것 같으면 그럴 가능성이 거의 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.