Come modellare gli oggetti con profondità infinita?

4

Sto lavorando a un'applicazione web che gestisce i congelatori di campioni in modo che i nostri ricercatori possano gestire e inventariare tutte le cose grossolane che hanno fatto. Un congelatore si presenta così:

1 Freezer
+- X Racks
   +- Y Boxes
    +- Z Cells
     +- 3 Cassettes
        +- 5 straws

Quindi, praticamente quello che sta succedendo è che ho una pila potenzialmente infinita di un oggetto contenente un altro oggetto e così via e così via. Il problema è che posso anche avere qualcosa di simile (dal momento che ci occupiamo anche di campioni per la gente della giustizia penale):

1 Freezer
+- 24 Rollers
 +- 1 Cadaver
  +- X Evidence Bags
   +- Y Evidence Samples

Lordo, soprattutto perché entrambe le opzioni devono coesistere nello stesso programma e nello stesso back-end .

Ho pensato a un oggetto come questo che descrive di cosa si tratta e lo impila semplicemente:

public class SampleContainer{
    public List<SampleContainer> ChildContainers { get; set; }
    public string ContainerType { get; set; }
}

Ma questo mi mette nei guai dato che ho bisogno di descrivere cosa c'è nel contenitore, e questo varia abbastanza selvaggiamente (cioè, è un cadavere o un embrione di topo?).

Esistono schemi di progettazione appropriati? Qual è il modo migliore per modellare queste relazioni, senza perdere la mente di nessuno o degli altri?

    
posta Adam Wells 22.12.2017 - 20:45
fonte

3 risposte

5

Finché le operazioni necessarie per "gestire e inventariare" sono lo stesso insieme di comandi (stampa, conteggio, ecc.) indipendentemente dal livello, prendi in considerazione The Composite Pattern .

Riferimento < br> Questo andrà a fondo come vuoi. Puoi avere diversi tipi di foglie che reagiscono in modo diverso allo stesso insieme di operazioni se ne hai bisogno. La cosa bella è che l'operazione per stampare l'intero contenuto del congelatore è semplicemente freezer.print() .

    
risposta data 23.12.2017 - 05:16
fonte
2

Ecco un pensiero:

public class SampleContainer{
    public string Description;
    public SampleContainer Parent { get; set; }
    public List<SampleContainer> ChildContainers { get; set; }
    public FrozenThing Contents { get; set; }
}

e

public class FrozenThing {
    public string Description;
    public SampleContainer Location;
}

Da qualche parte nel tuo codice principale potresti avere un container root SampleContainer Facility , e potresti anche aver bisogno di un List<FrozenThing> AllThings;

Puoi vedere come puoi sfogliare i SampleContainer per scoprire cosa c'è in Freezer 5, Shelf 1, Tray 2, ... Test Tube 400.

Puoi anche trovare la parte del mouse cercando AllThings e poi tornare indietro da quella posizione di FrozenThing tramite i genitori.

Potresti anche voler utilizzare Googleing per "strutture di dati generici per alberi C #"

    
risposta data 22.12.2017 - 22:22
fonte
-4

Passaggio 1: definire uno schema di indirizzamento

Ad esempio; (a seconda dei requisiti, ecc.) potresti decidere di utilizzare un numero intero senza segno a 64 bit tale che:

    I
  • bit da 49 a 63 vengono utilizzati per "numero congelatore"
  • il bit 48 è usato come un flag "racks o rollers"
  • I bit
  • da 40 a 47 vengono utilizzati come "numero di rack" o "numero di rullo"
  • I
  • bit da 32 a 39 sono usati come "numero di casella" o "numero di cadavere"
  • I
  • bit da 16 a 31 vengono utilizzati come "numero di cella" o "numero di buste di prova"
  • I bit
  • da 8 a 15 vengono utilizzati come "numero di cassette" o come metà alta del "numero di campione di prova"
  • I bit
  • da 0 a 7 vengono utilizzati come "numero di paglia" o come metà bassa del "numero di campione di prova"

Il punto di questo è di ridurre tutto a un identificatore di interi gestito facilmente che può essere usato nei campi della struttura, chiavi negli archivi "chiave / valore", tabelle hash, indici di array, ecc (che non causa un " accumulare caches con molti livelli di riferimento indiretto e rovinare completamente l'efficienza ").

Nota: invece di chiamarlo un indirizzo, puoi chiamarlo "identificatore di posizione universale" o qualcos'altro. Il nome non è molto importante.

Passaggio 2: determina i modelli di accesso / utilizzo

Se lo scenario più comune è la ricerca (ad esempio "trova tutte le cose che contengono" il mouse ") allora probabilmente vuoi qualcosa che sia efficiente per la ricerca (ad esempio un insieme di indici, con un indice per ogni tipo di cosa che potresti ricerca) ma di solito significa sacrificare l'efficienza per tutto ciò che non è alla ricerca.

Se il funzionamento più comune è la ricerca (ad esempio "cosa si trova nel congelatore # 1, rack # 5, ..."), probabilmente si desidera qualcosa di efficiente per la ricerca (ad esempio un insieme di matrici di lunghezza variabile) ma questo di solito significa sacrificare l'efficienza per tutto ciò che non è ricerca.

Passaggio 3: Determina la / e migliore / i struttura / i dati / i per adattarsi ai modelli / all'utilizzo di accesso e all'ambiente utilizzato in

Ciò richiede più informazioni di quelle fornite. Ad esempio (presupponendo "database relazionale SQL"); forse l'unica cosa di cui hai bisogno è una singola tabella piatta con 2 colonne ("indirizzo" e "descrizione dei contenuti"), ma è molto improbabile.

    
risposta data 22.12.2017 - 21:20
fonte

Leggi altre domande sui tag