Seguendo il principio generale dell'astrazione dei dati, di solito astraggo i dati in un formato serializzato (JSON) e li passo come parametro ai moduli Business Logic (BL) in modo tale che il modulo BL veda sempre un formato coerente dei dati indipendentemente dal livello di archiviazione dati sottostante. Anche se utilizzo un ORM, utilizzo il formato serializzato di quell'ORM. Sento di avere i seguenti vantaggi.
- serializzando i dati, ci sarebbe un controllo migliore su dati e parametri
- Qualsiasi sviluppatore può scrivere BL senza pensare troppo all'archiviazione dei dati sottostanti
- I wrapper possono essere scritti per nuovi database (ci sono molti wrapper già pronti per convertire i dati in JSON)
- I test possono essere eseguiti spietatamente e senza un database (poiché il formato dei dati è serializzato)
- Integrazione OLAP e OLTP funzionalmente più semplice da comprendere
Ho notato anche i seguenti inconvenienti
- Un nuovo livello da aggiungere tra il database e il modulo BL (la maggior parte degli ORM oggi ha un formato JSON predeterminato)
- Le chiamate con funzioni extra rallentano l'applicazione (ma penso che questo compromesso sia OK se confrontato con test migliori e manutenzione semplificata)
- Un maggiore livello di astrazioni potrebbe confondere lo sviluppatore
Rendo le osservazioni di cui sopra principalmente nel contesto delle applicazioni aziendali Per seguire questa discussione, facciamo un esempio in modo che le cose possano essere discusse nel suo contesto. Assumi un database di prodotti con le colonne: Prodotto, Tariffa, Imposte e dobbiamo creare una fattura
Codice senza astrazione del database
GET rate,taxes for product X from database
multiply qty with rate and add taxes
display invoice
Codice con l'astrazione del database
GET rate,taxes for product X from database
Convert it into JSON
call create_invoice function //This does all the calculations
display invoice
Nel secondo esempio, avrei passato gli argomenti nel modulo (Product = X, Qty = 5, Rate = 5, Taxes = 0.05). Se le tasse devono essere suddivise in più di una categoria (imposta di stato = 0,03, imposta centrale = 0,02) o un fattore di sconto da aggiungere, vorrei solo aumentare il numero di parametri nelle funzioni BL in modo tale che i campi del database, le chiavi JSON e i parametri della funzione coincidono (ciò avviene automaticamente durante la serializzazione e la maggior parte degli ORM lo fanno). Ciò semplifica, nel mio approccio, estendere le funzioni e anche rendere i moduli indipendenti dai dati poiché i moduli conoscono sempre i dati che possono ricevere e anche se ricevono un nuovo parametro, possono adattarsi fornendo il codice sottostante è intelligente.
Le mie domande generali sono
- Questo è un buon schema e come si chiama (mi viene in mente l'astrazione dei dati)?
- Pro / Contro di questo modello (a parte quelli menzionati sopra) nel contesto di applicazioni aziendali, app per dispositivi embedded, big data
- Esiste una differenza tra questo modello e l'ORM (lo ritengo, dal momento che ORM è principalmente un wrapper di classe per ottenere dati da un database mentre questo modello è più orientato verso la struttura dei dati)
- Se questo è buono, può essere facilmente compreso da un nuovo sviluppatore?