Differenze tra i pattern Data Mapper e Active Record
Dopo aver “scoperto” che la maggiore differenza tra Doctrine e Propel la fa il pattern utilizzato, ho deciso di scrivere questo post per approfondire i due pattern in questione: Data Mapper e Active Record.
Active Record
Un esempio tipico di utilizzo di questo pattern potrebbe essere il seguente (con Propel ORM):
$author = new Author();
$author->setName('Daniele');
$author->save();
Creiamo un oggetto Author
a cui settiamo il nome e poi tramite il metodo save() lo persistiamo nel database, possiamo quindi notare che nell’oggetto risulta presente anche la storage logic (cioè come l’oggetto viene salvato nel database).
L’oggetto quindi non contiene solo ad esempio la business logic ma anche la gestione della sua persistenza, eludendo quindi il principio di singola responsabilità (SRP).
L’aumento di responsabilità dell’oggetto (convivenza tra business logic e storage logic) lo rendono più difficile da mantenere e da testare.
Un altro aspetto importante del pattern Active Record è la stretta mappatura tra oggetto e record nel database, questo porta lo stesso pattern ad essere preferito nei progetti meno complessi (anche per la sua facilità di utilizzo).
Data Mapper
Riscriviamo lo stesso esempio utilizzando il pattern in questione (con Doctrine ORM):
$author = new Author();
$author->setName('Daniele');
$entityManager->persist($author);
$entityManager->flush();
Le operazioni eseguite sono le stesse (creazione dell’autore, settaggio nome e persistenza/salvataggio) però, guardando sotto il cofano, si possono notare delle differenze notevoli.
La business logic e la storage logic sono gestite da oggetti diversi, ciascuno con la sua singola responsabilità.
Tutto ciò ci permette di poter estendere/sostituire le logiche di persistenza dell’oggetto e quindi passare ad esempio da un salvataggio verso database MySQL a XML (mantenendo invariata la business logic).
Questa astrazione e l’aumentare degli oggetti utilizzati renderà l’applicazione più complessa ma più mantenibile e testabile nel tempo.
Ho cercato di riassumere l’essenza dei due pattern, ad ogni modo se volete approfondire l’argomento troverete un sacco di materiale in giro.