이러한 설계에서 고려해야 할 몇 가지 측면이 있습니다.
- 구조적 의존성
- 소유권 관계 (예 : 컴포지션과 다른 종류의 연관)
- 탐색 필요
클래스 간의 구조적 종속성 :
컴포넌트 클래스를 재사용하려는 경우 불필요한 종속성을 피하고 닫힌 순환 구조를 피해야합니다.
그럼에도 불구하고 때로는 두 개의 클래스가 개념적으로 강력하게 연결되어 있습니다. 이 경우 종속성을 피하는 것이 실제 옵션이 아닙니다. 예 : 나무와 그 잎, 또는보다 일반적 으로 복합물과 그 구성 요소 .
객체의 소유권 :
한 개체가 다른 개체를 소유합니까? 또는 달리 언급하십시오 : 한 물체가 파괴되면 다른 물체도 파괴됩니까?
이 주제는 Snowman이 자세히 다루었으므로 여기서는 다루지 않겠습니다.
객체 간 탐색 필요 :
마지막 문제는 탐색이 필요합니다. 내가 가장 좋아하는 예인 Gang of four 의 합성 디자인 패턴 을 보자 .
감마 & 알. " 자식 컴포넌트에서 부모로의 참조를 유지하면 복합 구조의 순회 및 관리가 단순화 될 수 있습니다. "물론 체계적인 하향식 순회를 상상할 수 있지만 매우 큰 복합 객체의 경우 작업을 기하 급수적으로 늦출 수 있습니다. 직접 참조, 심지어 원형은 복합재의 조작을 상당히 쉽게 할 수 있습니다.
전자 시스템의 그래픽 모델을 예로들 수 있습니다. 복합 구조는 전자 보드, 회로, 요소를 나타낼 수 있습니다. 모델을 표시하고 조작하려면 GUI보기에 기하학적 프록시가 필요합니다. 그런 다음 하향식 검색을 시작하는 것보다 사용자가 선택한 GUI 요소에서 구성 요소로 이동하여 부모 요소와 관련 형제 / 자매 요소를 찾는 것이 훨씬 쉽습니다.
물론 Gamma & al이 지적했듯이 순환 관계의 불변성을 보장해야합니다. 언급 한 SO 질문에 표시된 것처럼 까다로울 수 있습니다. 그러나 완벽하게 관리 가능하고 안전한 방식입니다.
결론
내비게이션 필요성을 과소 평가해서는 안된다. UML이 모델링 표기법으로 UML을 명시 적으로 다룬 이유는 없습니다. 그리고 그렇습니다. 순환 참조가 필요한 완벽한 상황이 있습니다.
유일한 요점은 사람들이 때때로 그러한 방향으로 빨리가는 경향이 있다는 것입니다. 따라서 결정을 내릴 것인지 결정하기 전에 관련된 세 가지 측면을 모두 고려해야합니다.