È necessario rendersi conto che una dipendenza circolare implica che è possibile utilizzare solo le corrispondenti classi dipendenti circolari insieme: se si dispone di una dipendenza circolare tra, diciamo, A
e B
, non è possibile utilizzare A
o B
indipendentemente in qualsiasi programma. Affrontare il tuo problema: sicuramente non hai bisogno che gli altri due amici esistano! Tutto ciò di cui hai bisogno è un modo per fare riferimento ad alcuni e interagire con loro in un modo che può essere limitato rispetto alle loro effettive abilità.
Tuttavia, è spesso possibile che oggetti delle classi si utilizzino l'un l'altro senza causare una dipendenza circolare. A tal fine è importante determinare ciò che effettivamente causa una dipendenza tra due classi/componenti (questi non sono del tutto equivalenti, ma fornire una definizione approfondita sarebbe piuttosto lunga). A
dipende B
in queste condizioni:
- Quando
A
contiene un membro di tipo B
.
- Quando
A
deriva da tipo B
.
- Se
A
utilizza un valore di tipo B
come parte di una firma di funzione.
- Quando
A
utilizza B
nella sua implementazione.
- Probabilmente dimentico qualcosa qui (ricordo che c'erano più motivi per cui le classi sarebbero state accoppiate).
Quando si ha una dipendenza ciclica tra due classi, ci possono essere modi per rompere questa dipendenza. Spesso, la dipendenza può essere interrotta dividendo una delle due classi in una classe base e una classe derivata con la classe base non dipendente dall'altra classe. Esistono numerosi altri approcci per interrompere i cicli di dipendenza. "Large Scale C++" (1996) di John Lakos riguarda essenzialmente i cicli di dipendenza da rotture e motiva il motivo per cui le dipendenze cicliche sono cattive (credo, non sarebbe d'accordo con questa semplificazione della caratterizzazione).
...e, sì, le dipendenze cicliche sono male:
- Sono causa di programmi per includere funzionalità non necessarie perché le cose sono trascinati in cui non sono necessari.
- Rendono molto più difficile testare il software.
- Rendono molto più difficile ragionare sul software.
- Rendono molto più difficile sostituire parti del sistema.
- ... e probabilmente una serie di altri motivi.
Quanto sopra è stato formulato con una vista presa da una prospettiva C++. Alcune delle cause delle dipendenze circolari potrebbero non esistere [direttamente] in C, ma gli stessi concetti si applicano approssimativamente anche a C.
fonte
2014-11-07 16:01:13
Nella mia esperienza il problema principale con i riferimenti circolari è la gestione della memoria - chi possiede cosa? –
Non è né buono né cattivo: è quello che è. Se ti senti necessario, fai attenzione alle perdite di memoria. – YvesLeBorg
l'ultima volta che ho controllato (alias ho dovuto compilarlo) il progetto 'llvm' era all in per le dipendenze circolari e stanno scrivendo una macchina virtuale/un compilatore. Puoi prenderlo come esempio e magari chiedere perché stanno andando con quel design. – user2485710