Ci sono diversi aspetti da considerare in un tale progetto:
- le dipendenze strutturali
- la relazione di proprietà (i.e.composition vs. altro tipo di associazione)
- le esigenze di navigazione
Dipendenza strutturale tra classi:
Se miri a riutilizzare le classi di componenti, dovresti evitare una dipendenza non necessaria ed evitare tali strutture circolari chiuse.
Tuttavia a volte due classi sono concettualmente strongmente interconnesse. In questo caso, evitare la dipendenza non è un'opzione reale. Esempio: un albero e le sue foglie, o più in generale un composito e i suoi componenti .
Proprietà degli oggetti:
Un oggetto possiede l'altro? O altrimenti dichiarato: se un oggetto è distrutto, anche l'altro sarà distrutto?
Questo argomento è stato affrontato in modo approfondito da Snowman, quindi non ho intenzione di affrontarlo qui.
Esigenze di navigazione tra oggetti:
Un ultimo problema è la necessità di navigazione. Prendiamo il mio esempio preferito, il modello di design composito del Gang of four .
Gamma & al. menziona esplicitamente la potenziale necessità di avere un riferimento genitore esplicito: " Mantenere il riferimento dai componenti del bambino al genitore può semplificare il traversale e la gestione di una struttura composita " Naturalmente puoi immaginare un attraversamento top-down sistematico, ma per oggetti compositi molto grandi può rallentare in modo significativo le operazioni e in modo esponenziale. Un riferimento diretto, anche circolare, può facilitare in modo significativo la manipolazione dei tuoi materiali compositi.
Un esempio potrebbe essere un modello grafico di un sistema elettronico. Una struttura composita potrebbe rappresentare schede, circuiti, elementi elettronici. Per visualizzare e manipolare il modello, sono necessari alcuni proxy geometrici in una vista GUI. È quindi molto più facile navigare dall'elemento GUI selezionato dall'utente al componente, per scoprire quale è il genitore e con i relativi elementi fratello / sorella, piuttosto che iniziare una ricerca dall'alto verso il basso.
Naturalmente, come Gamma & ho sottolineato, devi assicurare gli invarianti della relazione circolare. Questo può essere complicato, come ha dimostrato la domanda SO a cui fai riferimento. Ma è perfettamente gestibile e in maniera sicura.
Conclusione
Il bisogno di navigazione non deve essere sottovalutato. Non è senza motivo che UML lo abbia esplicitamente indirizzato nella notazione di modellazione. E sì, ci sono situazioni perfettamente valide in cui sono necessari riferimenti circolari.
L'unico punto è che a volte le persone tendono ad andare in tale direzione in fretta. Quindi vale la pena considerare tutti i 3 aspetti coinvolti prima di prendere la decisione di andare o no.