ActiveRecord of een DataMapper
Ik heb een beetje op Google gekeken over wat nu beter is, ActiveRecord of een DataMapper.
Dit was mijn conclusie:
ActiveRecord
- Niet bezig zijn met SQL
- Heel snel, zonder enige moeite iets ophalen uit de database.
- Niet flexibel
- Niet geschikt voor ingewikkelde query's
DataMapper
- Heel flexibel
- Meer OO
- Toch nog steeds zelf SQL schrijven
Maar nu twijfel ik toch nog steeds... wat zouden jullie doen?
Raoul
DataMapper, ActiveRecord ben ik geen fan van. Je plaats hiermee namelijk methods in een bepaalde klasse, bijv. User, die er helemaal niet in horen. Hoe kan een enkele User nou opeens meerdere Users ophalen uit de DB? Dat kan niet. En hoe kan een User uberhaupt zichzelf al ophalen uit de DB?
Wouter J op 07/02/2013 08:52:18:
DataMapper, ActiveRecord ben ik geen fan van. Je plaats hiermee namelijk methods in een bepaalde klasse, bijv. User, die er helemaal niet in horen. Hoe kan een enkele User nou opeens meerdere Users ophalen uit de DB? Dat kan niet. En hoe kan een User uberhaupt zichzelf al ophalen uit de DB?
Je hebt een punt. Ik zag trouwens ook nog dat sommigen een mapper ook wel een repository noemen... komt dat op hetzelfde neer als een mapper?
Ja, Datamappers zijn objecten die communiceren tussen een Object en een data in een database. Een Repository, Model, ect. zijn dus in principe allemaal datamappers, het ligt er maar net aan in welke cultuur je bent opgegroeid :)
https://gist.github.com/rvandenberge/4730395
Dan denk ik dat ik toch ga voor een datamapper, ik heb een klein opzetje gemaakt, wat denk je hier van? Gewijzigd op 07/02/2013 12:26:09 door - Raoul -
En dan verder:
- Die base entity klasse is niet nodig, die ga je niet nodig hebben en zou ik ook niet gaan implementeren;
- abstract class RepositoryInterface dat is natuurlijk ten strengte verboden. Een interface is interface RepositoryInterface, wat jij nu hebt is abstract class AbstractRepository (volgens de PSR standaarden). Ik zou ze allebei doen, dus eerst een RepositoryInterface en vervolgens een AbstractRepository klasse.
- Een repository heeft over het algemeen meer functies dan find, remove en save. Zo mis je de update, maar daarnaast heb je ook nog een findById, findByName, findAllSortedByName, ect. methoden. Wat ik zou doen is 4 algemene methods maken, die geef je dan een array met opties mee (zoals Doctrine DBAL ook doet) en daarnaast meer specifieke functies (zoals findById).
- Het moet niet verplicht zijn een Repository klasse te maken voor een entity. Je kunt vaak ook gewoon af met de basis repository klasse. Zorg dus dat je je basis repository klasse zo weet te maken dat die flexibel is en met alle Entities kan omgaan. Hierdoor worden je specifieke repository klassen ook weer een stuk beter, aangezien je de hoeveel 'duplicate code' verminderd.
Thx Wouter. Ik ga hier aan werken!
Ik zou alleen datamappers gaan gebruiken als je echt een hele ingewikkelde applicatie gaat maken en waarbij je 20 tabellen aan mekaar moet joinen.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
$users = User::all();
$user = new User('username', 'password');
$user->save();
$userMapper = new UserMapper($this->container->get('database');
$users = $userMapper->getAll(); // deze functie schrijven
$user = new User('username', 'password');
$userMapper->saveUser($user); // deze functie schrijven
$user = new User('username', 'password');
$user->save();
$userMapper = new UserMapper($this->container->get('database');
$users = $userMapper->getAll(); // deze functie schrijven
$user = new User('username', 'password');
$userMapper->saveUser($user); // deze functie schrijven
Kijkend naar het aantal regels code dat je moet schrijven, en de leesbaarheid, kies ik voor activerecord. Bij sommige talen kan je makkelijk ar gebruiken (bv ruby, php) en dan zou ik dan ook altijd gebruiken