Collegamento da figlio a genitore - cattiva idea?


15

Ho una situazione in cui il mio genitore sa che è figlio (duh) ma voglio che il bambino sia in grado di fare riferimento al genitore. La ragione di ciò è che voglio che il bambino abbia la capacità di designare se stesso come il più importante o il meno importante quando ne ha voglia. Quando il bambino fa questo, lo sposta nella parte superiore o inferiore dei figli del genitore.

In passato ho usato una proprietà WeakReference sul bambino per fare riferimento al genitore, ma sento che aggiunge un fastidioso sovraccarico, ma forse è solo il modo migliore per farlo.

È solo una cattiva idea? Come implementeresti questa abilità in modo diverso?

Aggiornamento 1: aggiunta di altro contesto. Questo è un sistema di rendering, quindi il contenitore padre è un elenco di finestre raggruppate insieme. L'elemento figlio (finestra) che dice "Sono più importante!" vuole sostanzialmente essere reso in cima al resto delle finestre.

Il genitore è solo un contenitore logico per raggruppare questi bambini insieme. Posso vedere dove aggiungere un evento per segnalare la richiesta di essere in cima è una buona idea. Ma implementazione (cosa il bambino vuole fare con il genitore) a parte, perché non dovresti avere un collegamento figlio-> genitore? Gli elenchi doppiamente collegati lo fanno in modo che le persone possano spostarsi da e verso qualcosa.


3
Non hai bisogno di un WeakReference. .Net garbage collector può gestire i cicli. Se il bambino non è più in uso (il genitore non lo punta), verrà raccolto nonostante contenga un riferimento al genitore.
dbkk,

Cosa succede se 2 bambini pensano entrambi di voler essere i bambini più importanti?
btilly

@btilly Il bambino più importante in realtà lo riordina in cima allo stack nell'elenco figlio del genitore. Quindi, chiunque lo fa, diventa molto importante. Nel mio scenario, non avresti mai avuto conflitti tra i più importanti.
Thraka,

Risposte:


18

È solo una cattiva idea?

Spesso.

  • Rompe l'incapsulamento del genitore.
  • Aumenta l'accoppiamento in entrambi.
  • Serve come un punto di rottura per il bambino per arrivare al resto del sistema, aumentando l'accoppiamento con qualsiasi cosa vagamente vicino ad esso (perché la gente si abusare di tale riferimento)
  • Limita il tuo design se mai desideri bambini senza genitori.

Come si fa meglio? Il bambino non dovrebbe sapere o preoccuparsi che si trovi in ​​una collezione. Invece di considerarsi importante, dovrebbe segnalare che si è verificato un evento di cui è a conoscenza in modo che chiunque si preoccupi (il genitore) possa aumentare la sua priorità (o qualunque sia la regola del contesto in cui vive il bambino). Non ne sono entusiasta, e forse preferirei una migliore separazione delle preoccupazioni tra il modello del bambino e il comportamento importante, ma non posso elaborare senza più contesto.

[modificare:]

Sì, i sistemi di rendering sono un caso in cui la proprietà dei genitori ... beh, non voglio dire ha senso, ma è un caso in cui è stato fatto e non è la fine del mondo. Per dare un focus sul controllo, preferirei ancora il design in cui il gestore di input (o qualunque cosa) cammina sull'albero e sa quale raccolta riordinare piuttosto che trovare il bambino, chiamando qualcosa su di esso che sa andare al suo genitore.


1
Questa è una buona risposta e probabilmente dovresti considerare tutti i punti sollevati da essa e vedere se si applicano al tuo problema. Detto questo, anche se non penso che sia la fine del mondo se inizi con il riferimento come una semplice implementazione e lo rifletti quando / se le cose sfuggono di mano.
rperetti,

La risposta è giusta Ma se il collegamento da figlio a genitore è una cattiva idea, la programmazione orientata agli oggetti non è più correlata agli oggetti della vita reale. Non c'è modo di renderlo una cosa buona?
Manoj R,

Grazie per questa risposta finora. Ho aggiunto più contesto alla mia domanda originale.
Thraka,

1
@ManojR - la programmazione orientata agli oggetti non è mai stata correlata agli oggetti della vita reale.
Telastyn,

La tua modifica mi fa pensare a VisualTreeHelper in WPF \ Silverlight. Ciò ha permesso di interrogare sulla relazione tra il controllo corrente e il resto dei controlli dei sistemi UI. Immagino di poter implementare qualcosa del genere perché ho anche un controllo di root che ospiterà tutto il resto. Grazie!!
Thraka,

0

In che modo l'esecuzione è arrivata al punto in cui il bambino decide di voler essere più importante? Ci è arrivato attraverso il genitore? In caso affermativo, è possibile inviare riferimenti a parent a quel metodo.

per esempio. se tutti i nodi hanno una sorta di metodo update () che fa qualcosa di simile

void update() {
    doSomething()
    for(Node n:childs){
        //do something
        n.update();
    }
}

potresti cambiarlo in

void update(Node parent) {
    doSomething(parent)
    for(Node n:childs){
        //do something
        n.update(this);
    }
}

Sì, questo è un ottimo modo per farlo. Tuttavia, nella mia situazione, potrebbe essere possibile che il codice logico client non sia stato avviato dal ciclo del genitore.
Thraka,

0

Non penso sia una cattiva idea. È possibile risolvere questo problema aggiungendo un valore di ordinamento a ciascun figlio. Sto immaginando qualcosa come "z-index" usato per visualizzare oggetti uno sopra l'altro o uno dietro l'altro nelle pagine web.

Non sono sicuro di come codifichi qualcosa del genere, ma il concetto sembra fattibile.


Con questa soluzione, il problema esiste ancora. Questo sostituisce solo il concetto di ordine nell'array con z-index. Dovrei comunque avere un sistema di comunicazione da bambino a genitore. Grazie comunque :)
Thraka il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.