ActiveRecord contro Data Mapper
Mercoledì 14 Settembre 2011 - 09:40
di Alessandro Nadalin

Sembra un’eterna lotta quella che mette a confronto i sostenitori di questi due pattern: se analizziamo le principali feature e problematiche dei due sistemi forse possiamo schiarirci le idee.
L’active record permette di mappare 1:1 un oggetto con la sua rappresentazione sul database: questo implica quindi, che le colonne a livello di DB, rappresentino gli attributi di un oggetto.
Il vantaggio di questo tipo di implementazione è, chiaramente, una barriera inferiore per l’adozione per paradigma di persistenza, nonché una grossa facilità, lato software, per persistere i dati da un oggetto al DB.
Doctrine 1.2 ha, per esempio, ottenuto grande attenzione proprio per l’implementazione molto chiara di questo pattern.
Il Data mapper invece, proposto nel PEAA, introduce un layer che si occupa di mappare un oggetto, aggiungendo metadati, senza alterarne la sua logica di dominio: questo permette di non infettare l’oggetto stesso con informazioni che non gli appartengono, come il modo in cui viene persistito.
In Doctrine2, questo viene raggiunto attraverso, per esempio, le annotations.
Un mapper introduce meno inquinamento nei propri oggetti e ne permette un testing unitario maggiormente facilitato: tutto questo al prezzo di gestire ed iniettare un’istanza unica del mapper nelle nostre applicazioni, pena l’inconsistenza della Unit Of Work.
È chiaro come l’utilizzo di un data mapper sia ben più dispendioso (si pensi a Symfony2) e meno immediato di avere a disposizione un ORM con un’implementazione active record, col vantaggio, però, di avere un architettura e un dominio più puliti.
Al di là delle semplificazioni (notevoli), che si devono fare in questo contesto, voi che idea vi siete fatti? Avete mai provato entrambe le implementazioni?
Categoria: Software e Servizi | Permalink
Commenti
1
con altri nomi, in altri tempi la questione era esattamente la stessa, anzi direi che nasce con i db relazionali.
Il data mapper è molto simile all’Application Model dell’IBM primni anni 80, e IMHO è la strada migliore perchè l’architettura diventa più modulare e “flessibile” anche se si presta a overdesign esasperato per cui bisogna stare attenti a non rendere complesse le cose semplici
# - postato da sunny - 14 Settembre 2011 - 10:30
2
buon punto sunny
# - postato da Alessandro Nadalin - 14 Settembre 2011 - 10:38
3
Fino ad ora ho utilizzato solo le ActiveRecord dato che sono utilizzate in maniera intrinseca dal framework che uso per lavoro ormai da anni: Yii Framework.
A livello prestazionale ci sono dei cambiamenti?
A livello di utilizzo che cambia? Cioe, io programmatore, vedo qualche differenza fra mapping e AR?# - postato da Emanuele Ricci - 14 Settembre 2011 - 10:46
4
Li ho utilizzati entrambi, ed è innegabile la superiorità del DataMapper per progetti a lunga durata e manutenzione, su domini non banali.
Inoltre, citando Doctrine2, questo sta facendo grandi passi per mitigare l’inevitabile collo di bottiglia rappresentato dal livello di astrazione necessario per la sua implementazione: Cache, Cache e ancora Cache come il prezzemolo, per ottenere in produzione una mappatura OggetiDb mai da computare.
DataMapper, punto.
# - postato da Slam - 14 Settembre 2011 - 11:24
5
edit
Oggetti<->Db
Mannaggia agli escape errati di edit :P
# - postato da Slam - 14 Settembre 2011 - 11:25
6
@Emanuele Ricci
sinceramente a livelli di prestazione non saprei (anche se a pelle direi che ActiveRecord è “cotto e mangiato” quindi con meno chiamate). Come dice Slam è più un discorso di mantenimento a lungo termine di un progetto complesso, quindi se non ti trovi in una situazione del genere non credo ti debba preoccupare.
Non so voi, ma alcune soluzioni e design sono veramente belli, delle opere d’arte (ok, magari apprezzate solo da nerd :). Ad esempio Symphony2 è affascinante (anche se per ora ho solo letto la documentazione e qualche articolo), magari si genereranno nuovi problemi ma vedere come hanno pensato tutto il framework è davvero istruttivo e piacevole.
# - postato da sunny - 14 Settembre 2011 - 12:26
7
io credo che la discriminante più importante sia la complessità e la vastità del progetto.
Un active record aggiunge uno strato di metodi preconfezionati, testati e pronti all’uso. Di contro non si è mai perfettamente certi di quello che sta succedendo dietro le quinte (normalmente nella classe base del tuo oggetto).
Di contro il datamapper è più trasparente e chiaro. Ma non aiuta molto in termini di sviluppo agile.
Secondo me:
1. progetto piccolo, rad necessario -> active record
2. progetto grosso, maggiori tempi di sviluppo e tempo per pensare per bene alla business logic -> data mapper
# - postato da Matteo - 14 Settembre 2011 - 16:41
8
Credo che una delle differenze maggiori sia apprezzabile in fase di unit test dei modelli. Usando il pattern ActiveRecord credo sia quasi necessario eseguire il mocking della base dei dati, oppure utilizzare fixture.
Seguendo il pattern DataMapper, i domini sono tenuti separati, e di conseguenza il testing viene reso sicuramente più mantenibile e mirato.
Un altro punto a sfavore di ActiveRecord è per certi versi l’uso di metodi statici, che rende più macchino il testing.
Se si guarda l’implementazione in Rails di ActiveRecord però difficilmente si può negare l’immediatezza d’uso e la leggibilità del codice.# - postato da Fabio Sussetto - 14 Settembre 2011 - 21:37
9
qui c’è una bella serie presentazione a favore del data mapping…
Architecting Your Models su slideshare
# - postato da Matteo - 15 Settembre 2011 - 14:12







