ActiveRecord of een DataMapper

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- Raoul -

- Raoul -

07/02/2013 08:50:14
Quote Anchor link
Hoi,

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
 
PHP hulp

PHP hulp

22/09/2021 20:16:35
 
Wouter J

Wouter J

07/02/2013 08:52:18
Quote Anchor link
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?
 
- Raoul -

- Raoul -

07/02/2013 08:53:57
Quote Anchor link
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?
 
Wouter J

Wouter J

07/02/2013 08:58:14
Quote Anchor link
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 :)
 
- Raoul -

- Raoul -

07/02/2013 09:01:32
Quote Anchor link
Dan denk ik dat ik toch ga voor een datamapper, ik heb een klein opzetje gemaakt, wat denk je hier van? https://gist.github.com/rvandenberge/4730395
Gewijzigd op 07/02/2013 12:26:09 door - Raoul -
 
Wouter J

Wouter J

07/02/2013 17:38:30
Quote Anchor link
Allereerst denk ik: Aj, zo'n PSR fanaat en dan tabs gebruiken... :-P

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.
 
- Raoul -

- Raoul -

07/02/2013 17:58:46
Quote Anchor link
Thx Wouter. Ik ga hier aan werken!
 
Moose -

Moose -

07/02/2013 18:04:25
Quote Anchor link
Het kutte aan een datamapper ten opzichte van activerecord is dat je gigantisch veel extra code zult moeten schrijven. Ook kan je het DRY principe zowat op je buik schrijven.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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


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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.