Metodo o approccio di calcolo del Riepilogo efficiente?

1

Ho una gerarchia di oggetti con un numero di nodi foglia che contribuirà ai valori di riepilogo per l'oggetto padre (in particolare: costo del progetto e metratura).

Qual è il modo più efficiente per calcolare questi valori mentre viene progettato il progetto?

Ulteriori dettagli

 Parent
   ListOne
     NodeA
       NodeA.1
       NodeA.2 ...
     NodeB
       NodeB.1
       NodeB.2 ...
   ListTwo ...
  • Sarà selezionato un solo nodo punto # alla volta, quindi sarà NodeA.1 O NodoA.2 ma non entrambi saranno selezionati.
  • Indipendentemente dal fatto che NodeA e NodeB siano selezionati indipendentemente l'uno dall'altro. Quindi potrei avere qualsiasi combinazione di nodi selezionati / attivi A - > Z

Un approccio è semplicemente quello di scorrere ogni Elenco, ogni Nodo e ciascun nodo foglia e sommare i valori solo quando il nodo foglia è selezionato.

Un altro approccio potrebbe essere quello di creare un gestore di eventi per le variabili di progetto padre a cui ogni bambino può poi sparare quando cambiano i loro valori. La ruga qui è che avrò dei valori specifici del Nodo che voglio anche tenere traccia. In altre parole, sto monitorando il costo del progetto, il costo di listino e il costo del nodo.

Un altro approccio sarebbe una gerarchia di gestori di eventi che si attivano quando l'elemento selezionato cambia e quindi notifica ai genitori la modifica. Quindi il cambiamento di un nodo foglia alla fine tornerebbe a cascata al Progetto dopo che un certo numero di eventi era stato sparato.

In questo momento, la struttura complessiva del progetto è piuttosto piccola: solo tre o quattro elenchi, ciascuno con circa sei nodi ciascuno con quattro o sei nodi foglia ciascuno. A causa delle dimensioni ridotte, non sono preoccupato tanto del tempo di calcolo quanto del mantenimento di questo e della possibilità di estenderlo in futuro con l'aggiunta di più Liste, Nodi, ecc.

Modifica:
Il progetto che guida questa domanda è scritto in C # e in realtà ha un altro livello tra l'Elenco e i nodi foglia finale. Penso che la domanda sia pertinente ai programmatori C ++ e Java poiché si occupa delle responsabilità tra i bambini e gli oggetti genitore quando un valore del genitore dipende dai suoi figli e nipoti. Una risposta su misura per C # sarebbe una salsa, ma sto cercando l'approccio più robusto / manutenibile in questo caso.

    
posta GlenH7 02.08.2012 - 18:24
fonte

3 risposte

7

Il modo più semplice (più facile da capire, leggere e gestire) è semplicemente definire, nel genitore:

public int Summary
{
    get { return this.Children.Sum(x => x.SomeVariable); }
}

Se non hai un problema di prestazioni (e sembra che tu non lo faccia), lo farei. Se sei preoccupato di aggiornare la visualizzazione di un nodo genitore quando un nodo figlio cambia, esistono due semplici alternative:

  • Utilizza un timer e ricalcola ogni X secondi (presupponendo che ricalcoli l'ora < < X) o
  • Utilizzare un bus di messaggi di qualche tipo. Inietti l'oggetto bus messaggi in tutti i nodi. Quando qualsiasi nodo modifica qualcosa a cui un genitore potrebbe interessare, invia un messaggio e fa in modo che quel messaggio attivi l'aggiornamento secondo necessità.

Ho provato gli eventi una volta, e se stai aggiungendo e rimuovendo attivamente i nodi, diventa complicato perché se non si annulla la sottoscrizione di ogni evento quando un nodo viene rimosso, si potrebbero ottenere riferimenti ciondolanti e l'equivalente di un perdita di memoria.

    
risposta data 02.08.2012 - 18:54
fonte
4

Se questo elenco non contiene milioni di voci, fai semplicemente la cosa più semplice: itera e somma. Salva qualcosa di più complicato finché il codice semplice non è misurabile troppo lento.

    
risposta data 02.08.2012 - 18:54
fonte
2

Sembra un caso da manuale per il pattern Observer. Rendi ciascun nodo un osservatore dei suoi figli e invita ogni bambino a informare i suoi osservatori ogni volta che il suo valore o stato cambia (poiché presumo che tu voglia modificare il costo se un bambino è de-selezionato).

    
risposta data 02.08.2012 - 22:36
fonte

Leggi altre domande sui tag