W takim projekcie należy wziąć pod uwagę kilka aspektów:
- zależności strukturalne
- relacja własności (skład a inny rodzaj powiązania)
- potrzeby nawigacji
Zależność strukturalna między klasami:
Jeśli dążysz do ponownego użycia klas komponentów, powinieneś unikać niepotrzebnej zależności i unikać takich zamkniętych struktur kołowych.
Niemniej jednak czasami dwie klasy są silnie ze sobą powiązane koncepcyjnie. W takim przypadku unikanie zależności nie jest realną opcją. Przykład: drzewo i jego liście, lub bardziej ogólnie kompozyt i jego składniki .
Własność przedmiotów:
Czy jeden obiekt jest właścicielem drugiego? Lub inaczej powiedziane: jeśli jeden przedmiot zostanie zniszczony, czy drugi również zostanie zniszczony?
Ten temat został dogłębnie poruszony przez Bałwana, więc nie zamierzam się nim tutaj zajmować.
Potrzeby nawigacyjne między obiektami:
Ostatnim problemem jest potrzeba nawigacji. Weźmy mój ulubiony przykład, kompozytowe wzorca projektowego z bandy czworga .
Gamma i in. wyraźnie wspomina o potencjalnej potrzebie wyraźnego odniesienia do rodzica: „ Utrzymanie odniesienia od komponentów potomnych do ich rodzica może uprościć przechodzenie i zarządzanie strukturą złożoną ” Oczywiście można sobie wyobrazić systematyczne przechodzenie od góry w dół, ale w przypadku bardzo dużych obiektów złożonych może znacznie spowolnić operacje w sposób wykładniczy. Bezpośrednie odniesienie, nawet okrągłe, może znacznie ułatwić manipulowanie twoimi kompozytami.
Przykładem może być model graficzny układu elektronicznego. Struktura złożona może reprezentować płytki elektroniczne, obwody, elementy. Aby wyświetlić i manipulować modelem, potrzebujesz geometrycznych proxy w widoku GUI. Z pewnością znacznie łatwiej jest nawigować od elementu GUI wybranego przez użytkownika do komponentu, aby dowiedzieć się, który jest rodzicem i z którymi są powiązane elementy brat / siostra, niż rozpocząć wyszukiwanie z góry na dół.
Oczywiście, jak wskazali Gamma i in., Musisz zapewnić niezmienników okrągłej relacji. Może to być trudne, jak pokazało pytanie SO, do którego się odwołujesz. Ale jest to doskonale zarządzalne i bezpieczne.
Wniosek
Potrzeba nawigacji nie powinna być zaniżona. Nie bez powodu UML wyraźnie zajął się tym w notacji modelowania. I tak, istnieją całkowicie uzasadnione sytuacje, w których potrzebne są odwołania cykliczne.
Chodzi tylko o to, że czasami ludzie szybko zmierzają w takim kierunku. Warto więc wziąć pod uwagę wszystkie 3 aspekty, zanim podejmiesz decyzję, czy to zrobić, czy nie.