2012-06-09 11 views
5

Sono a conoscenza di riferimenti circolari (classe a contiene classe b e classe b contiene classe a). Ma dal momento che non ho programmato abbastanza, è difficile per me trovare i motivi per usarli. Mi stavo chiedendo se le persone potessero darmi dei buoni esempi e possibilmente spiegare le buone ragioni per usarli.Motivo per riferimenti circolari con classi?

Ad esempio, in questo momento sto osservando le esercitazioni di codice sorgente 2D e l'utente ha creato una classe Creature e una CreatureAi che fanno riferimento l'una all'altra. Per quale ragione? Non lo so ancora, ecco perché sto cercando degli esempi e sto ancora leggendo in giro.

risposta

10

Il caso più ovvio di riferimento circolare è l'auto-riferimento: è necessario per elenchi collegati, alberi e molte altre strutture ricorsive.

I riferimenti circolari sono spesso impliciti in una gerarchia di classi relared, come gli elementi dell'interfaccia utente con nidificazione arbitraria o alberi di espressione.

Infine, un caso comune di riferimento circolare è la relazione bidirezionale genitore-figlio: un genitore (ad esempio un pannello dell'interfaccia utente) detiene un riferimento a una matrice dei suoi figli e ogni bambino (ad esempio pulsanti, tabelle, ecc.) Tiene un riferimento al genitore. Il genitore deve inviare motivazioni ai suoi figli per dire loro che è stato abilitato, disabilitato, visibile o invisibile; un bambino può notificare al genitore la necessità di ridimensionare, modificare lo stato visivo, ecc.

Questo ultimo esempio è probabilmente simile alla tua coppia Creature-CreatureAI: sono separati perché le loro preoccupazioni sono dissimili, ma hanno riferimenti a ciascuno altro perché hanno bisogno di cooperare su diversi compiti.

11

Hai una società di classe contenente un elenco di individui che lavorano per esso. Ogni istanza di classe Individuale nella raccolta contiene un riferimento alla Società per cui lavorano.

In questo modo è possibile scoprire facilmente quali persone lavorano per quali aziende. Si noti che potrebbe non essere necessariamente il miglior design, specialmente se le classi vengono mantenute nel database usando un ORM o un database di documenti.

+0

Può essere effettivamente il * solo * design se si utilizza dire OrmLite in cui è necessario specificare le relazioni estranee nel codice stesso. Ma sì, non mi piace neanche – Voo

0

Spesso non è strettamente necessario, ma offre un elevato livello di comodità per il codice che funziona con gli oggetti.

Altre volte, è davvero necessario. Ad esempio, alcune relazioni devono essere rappresentate nel codice come una struttura di dati e la relazione è riflessiva.

2

Ci qualsiasi numero di motivi per cicli di riferimento sé o riferimento

  • Essi possono essere inerenti nel modello di dominio; per esempio. le persone hanno figli che sono anche persone, le cartelle contengono altre cose tra cui altre cartelle. Un riferimento personale o un ciclo è un modo naturale per implementare queste cose.

  • Possono essere inerenti a una struttura di dati generica o specifica dell'applicazione; per esempio. una lista collegata è composta da nodi che includono riferimenti al nodo "successivo" e "precedente" nell'elenco, e ciò richiede che la classe Node faccia riferimento a se stessa.

  • Il ragionamento alla base del riferimento ciclico può essere una parte fondamentale del progetto dell'applicazione.

  • Oppure, può essere semplicemente una comodità di implementazione o un artefatto storico di precedenti refactoring o evoluzione del codice.

In sostanza, è necessario guardare (olistico) presso la base di codice di applicazione di capire il motivo per cui esistono queste dipendenze cicliche ... e se sono realmente necessarie.

Problemi correlati