Quando creare un oggetto in memoria per gestire i record del repository?

2

Supponiamo di avere un concettuale Ledger popolato con Line Items . Supponiamo che Line Items siano memorizzati in qualche tipo di memoria persistente. Il libro mastro viene mostrato all'utente che può aggiungere / rimuovere Line Items o aggiornare le variabili all'interno di un particolare Line Item , come prezzo / quantità / descrizione.

Per gestire questo, per esempio, potrei scrivere una classe singola usando il livello del repository, chiamarla qualcosa come LineItemRepository , e avere funzioni come loadLineItems() , addLineItem() , removeLineItem() , changeQuantityX() , ecc.

Per fare le sue operazioni la classe dovrà essere a conoscenza di cose come

  • ledger_id per caricare tutti gli elementi pubblicitari relativi a quell'id o per aggiungere un elemento pubblicitario al libro mastro
  • line_item.id per rimuovere / aggiornare un Line Item

Sembracheconl'aiutodiunaclasseController,questosaràtuttociòdicuihobisognoperattivareeventideldominioaziendalecome"Aggiungi nuovo elemento pubblicitario", "Aggiorna prezzo elemento pubblicitario", "Elimina elemento pubblicitario", ecc. Posso anche fare cose come "Trova la somma di tutti gli elementi pubblicitari con Descrizione" x "all'interno di Ledger Y".

Il mio repository può essere essenzialmente un Ledger

Domanda

1) Va bene mantenere il concetto di Ledger e Line Item Repository in una singola classe concettualmente rispetto a SRP e SOC? Se sì, come posso chiamare questa classe? ItemRepositoryLedger ?

2) Quando ho bisogno, perché potrei aver bisogno, o ho sempre bisogno di un oggetto Ledger separato (rappresentazione in memoria di ciò che è nel database, con le funzionalità aziendali) da Repository (assegnato con effettiva funzionalità di recupero e archiviazione del database, presumibilmente inconsapevole delle funzionalità aziendali)?

Penso che potrei usare questa classe in-memory Ledger per cose come

  • Carica tutti gli elementi pubblicitari contemporaneamente e non toccare il database per un po 'finché non ho davvero bisogno di
  • Aggiungi, modifica l'aggiornamento elimina gli elementi pubblicitari nella% in memoria Legder per quanto mi serve prima di svuotarli tutti nel database. Mentre lo faccio, il database potrebbe non essere sincronizzato se è aggiornato da qualcun altro (anche se nel mio caso specifico tali casi saranno rari ...)
  • Esegui varie operazioni matematiche sugli elementi pubblicitari senza toccare o sottolineare il database con ogni nuovo modo in cui voglio sommare le cose, ad esempio.

Ma i problemi che vedo è che tale Ledger conterrà temporaneamente le informazioni duplicate di ciò che è nel database. Questo mi sembra "CATTIVO". Ma forse no. Cosa succede se voglio caricare i record e quindi fare diverse aggiunte di prezzi diversi senza colpire il database per ogni nuovo?

Obiettivo

Il mio obiettivo per questa domanda è ottenere una comprensione più chiara dei concetti di Repository e della struttura in memoria come Ledger nell'universo MVC.

La comprensione corrente è che il repository viene utilizzato solo per memorizzare / recuperare dati e non è utilizzato, ad esempio, per calcolare il prezzo totale di LineItems. Una classe Ledger lo farebbe, dopo aver prima utilizzato Repository per caricare Line Items in memoria.

Ma potrei anche usare il repository per sommare gli elementi pubblicitari per me usando SQL. Quindi sono un po 'confuso qui ...

Altri pensieri

Posso fare un ulteriore passo avanti e chiedere .. Ho bisogno di un oggetto in memoria Line Item per rappresentare quello nel database? Credo che avrò bisogno di qualche variabile oggetto per memorizzare i dati ricevuti dal database, per poterlo mostrare nel livello View. Senza di esso, devo chiamare il repository dal mio View.

Quindi probabilmente ho bisogno di qualche struttura / oggetto / collezione di variabili per rappresentare Line Item , finché non è pronto per essere visualizzato nella Vista.

L'oggetto Ledger dovrebbe seguire la stessa logica?

Ledger è essenzialmente un oggetto Controller , un gestore di Repository in questo caso e non un'entità separata solo per il dominio?

    
posta Dennis 28.09.2016 - 17:14
fonte

1 risposta

1

Poiché la tua domanda riguarda sicuramente la progettazione di alto livello piuttosto che l'implementazione, tornerei alla definizione letterale di un libro mastro (uno di essi, comunque), per ottenere suggerimenti semantici:

"Ledger, n .: un libro contabile di iscrizione finale, in cui sono registrate le transazioni commerciali".

Che si tratti di rintracciare e / o interrogare transazioni di unità monetarie o di inventari di oggetti tangibili (o non), capisco l'essenza di un libro mastro principalmente come una delle interfacce / contratti implementati da ( o delegato a) effettivi archivi persistenti delle transazioni del dominio (cioè repository).

IWO, i ledger sono / sono interfacce che i servizi di dominio consumeranno da qualche parte tra loro e gli archivi (o implementati alle due estremità).

In teoria, suppongo che un'interfaccia di contabilità generale possa esporre un insieme di funzioni pure, ad esempio, parametrizzate per data di inizio / fine, transazione, tipo di articolo / account e se si desidera visualizzare saldi basati su voci doppie, ecc. - ma naturalmente si potrebbe finire per aver bisogno di rompere quella purezza, se il calcolo di questi riepiloghi su richiesta non fosse fattibile perché coinvolgerebbe la scomposizione dei dati su dataset troppo grandi, ecc.

'HTH,

    
risposta data 28.09.2016 - 20:33
fonte