Esiste un modello di progettazione per la gestione di relazioni profonde da molti a molti?

10

Ho difficoltà a definire questo schema di dati che ho incontrato lavorando su diverse applicazioni.

Consiste di:

  1. Un tipo di oggetto che è composto da molti oggetti stessi
  2. Un secondo tipo di oggetto, in cui ogni istanza "ha molti" del primo oggetto
  3. E, ciascuno degli oggetti secondari del primo oggetto è modificabile per ogni associazione al secondo tipo di oggetto.

Un semplice esempio potrebbe essere:

  1. Un corso di programmazione costituito da un insieme di lezioni
  2. Le lezioni sono composte da un insieme di compiti.
  3. Un corso può essere assegnato a uno studente.
  4. Tuttavia, una volta assegnato un corso a uno studente, ciascuna lezione e / o assegnazione può essere personalizzata per lo studente, con rimozioni e aggiunte, fino al punto in cui il corso originale può essere irriconoscibile.

Nelle mie soluzioni, ciò che risulta è:

In caso di assegnazione di un corso a uno studente, il corso viene caricato in memoria. Quindi, per ciascun oggetto secondario, viene generato un oggetto relazione studente / oggetto secondario con i metadati appropriati. Essenzialmente, sto usando l'oggetto originale come modello per generare gli oggetti personalizzabili richiesti.

Ciò comporta un'enorme quantità di dati man mano che gli oggetti secondari diventano più complessi e numerati. Mi chiedo se ci sia qualche ottimizzazione o pattern per ridurre la quantità di logica / complessità richiesta per manipolare questo modello di dati.

    
posta Nicholas Pickering 29.08.2015 - 03:50
fonte

3 risposte

6

Vedo alcune opzioni a seconda di cosa ti serve: (1) se ci sono molte istanze uniche che seguono un algoritmo comune, (2) se ci sono molti oggetti simili o genererai oggetti in fase di esecuzione, e ( 3) se si desidera modificare dinamicamente il comportamento dell'oggetto durante l'esecuzione. Nota: puoi combinare tutti i modelli che menziono qui, se necessario.

  1. Se ciascun "secondo tipo di oggetto" è univoco ma segue un modello di comportamento simile, è possibile utilizzare Modello modello . Sembra che tu stia facendo questo. Ma per renderlo esplicito, la tua classe base astratta ha programmato un algoritmo generale; alcuni passaggi di questo algoritmo sono implementati nelle classi derivate.

  2. Se creerai molti oggetti o se la creazione di oggetti in fase di esecuzione è importante per te, puoi utilizzare Modello di fabbrica .

  3. E se desideri modificare dinamicamente il comportamento, Stategy Pattern potrebbe funzionare. Ad esempio, se uno studente in un curriculum regolare viene deciso di avere esigenze particolari o di partecipare a un programma accelerato. Questo funziona componendo lo "studente" di un oggetto che rappresenterebbe una classe base del curriculum. Il curriculum sarà assegnato a un curriculum derivato alla costruzione dello studente (che sembra strano) e potrebbe essere riassegnato a un altro curriculum derivato in seguito.

(Solo FYI, se usi (3) Strategy Pattern con C ++, dovrai calcolare Rvalues per la composizione.)

Per memorizzare i tuoi oggetti e i secondi oggetti, può valere la pena di considerare Iterator Pattern (per scorrere tra loro, aggiungere, eliminare, ordinare, ecc.).

Un buon riferimento è Modelli di primo modello di testa , che copre i modelli I menzione e la loro attuazione. Funzionano in Java.

    
risposta data 29.08.2015 - 05:42
fonte
0

Sto trovando difficile credere, in presenza di un data store o persistenza, che sia necessario disporre di oggetti con questo tipo di profondità in qualsiasi punto in un tempo di esecuzione. Questo è per GUI CRUD? Se è così, allora suggerirei di cambiare il tuo approccio dall'inizio. IE:

Identifica la sottostruttura necessaria per lo Studente da mostrare e con stato memorizza il suo indice di origine sul db, e statelessly aggiorna quello, andando o dalla vista e il back-end db.

    
risposta data 04.09.2015 - 02:53
fonte
-1

Un corso personalizzato per ogni studente fino al punto in cui il corso originale è irriconoscibile suggerisce che il corso originale è semplicemente un riferimento "predefinito". Quello che vorrei fare è creare una classe chiamata CustomizedCourse (o una lista di essi) e avere quella (o una lista di quella) come proprietà di uno studente. Il CustomizedCourse può avere un riferimento al corso originale per l'utilizzo "referenziale", ma il lavoro principale e i dati dovrebbero essere nello stesso CustomizedCourse.

    
risposta data 05.09.2018 - 01:03
fonte