Ci sono diversi aspetti da considerare in un tale progetto:
- le dipendenze strutturali
- la relazione di proprietà (iecomposizione vs. altro tipo di associazione)
- le esigenze di navigazione
Dipendenza strutturale tra le classi:
Se si intende riutilizzare le classi di componenti, è necessario evitare dipendenze non necessarie ed evitare strutture circolari chiuse.
Tuttavia a volte due classi sono concettualmente fortemente interconnesse. In questo caso, evitare la dipendenza non è una vera opzione. Esempio: un albero e le sue foglie, o più in generale un composto e i suoi componenti .
Proprietà degli oggetti:
Un oggetto possiede l'altro? O altrimenti indicato: se un oggetto viene distrutto, anche l'altro deve essere distrutto?
Questo argomento è stato approfondito da Snowman, quindi non affronterò qui.
Esigenze di navigazione tra oggetti:
Un ultimo problema è la necessità di navigazione. Facciamo il mio esempio preferito, il modello di design composito della Gang of four .
Gamma & al. menzionare esplicitamente la potenziale necessità di avere un riferimento genitore esplicito: " Mantenere il riferimento dai componenti figlio ai loro genitori può semplificare l'attraversamento e la gestione di una struttura composita " Naturalmente si potrebbe immaginare un attraversamento sistematico dall'alto verso il basso, ma per oggetti compositi molto grandi può rallentare significativamente le operazioni e in modo esponenziale. Un riferimento diretto, anche circolare, può facilitare in modo significativo la manipolazione dei compositi.
Un esempio potrebbe essere un modello grafico di un sistema elettronico. Una struttura composita potrebbe rappresentare le schede elettroniche, i circuiti, gli elementi. Per visualizzare e manipolare il modello, sono necessari alcuni proxy geometrici in una vista della GUI. È quindi molto più semplice navigare dall'elemento GUI selezionato dall'utente al componente, scoprire qual è il genitore e con quali sono gli elementi fratello / sorella correlati, piuttosto che avviare una ricerca dall'alto verso il basso.
Naturalmente, come ha sottolineato Gamma & al, devi garantire gli invarianti della relazione circolare. Questo può essere difficile, come ha mostrato la domanda SO a cui ti riferisci. Ma è perfettamente gestibile e in modo sicuro.
Conclusione
La necessità di navigazione non deve essere sottovalutata. Non è senza ragione che UML lo abbia esplicitamente affrontato 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 rapidamente. Quindi vale la pena considerare tutti e 3 gli aspetti coinvolti prima di prendere la decisione di farlo o no.