In een ander topic zegt Wouter op een gegeven moment:
Wouter J op 02/03/2014 16:08:06
allereerst zou ik geen setters gebruiken voor id en value. Dat zijn verplichte waarden, geef die dus mee aan de constructor en nog mooier: gebruik een factory: Session::create('user', 'Ozzie')
Waarom zou je een factory gebruiken ipv een constructor?
Waarom...
<?php
$session = Session::create('user', 'Ozzie');
?>
en niet...
<?php
$session = new Session('user', 'Ozzie');
?>
Wat is het verschil/voordeel?
Nee, het is beter dan $session = new Session('user', 'Ozzie').
De constrictor van Session create een nieuwe session voor de gebruiker Ozzie.
Als die session al bestaat dan kan je beter dat checken met die static functie voor dat je helemaal een ojbect gaan creëren en opnieuw die session gaan initialiseren.
$session = new Session('user', 'Ozzie') creëert altijd een object.
$session = $Factory::creat('user', 'Ozzie'); check of dat session al bestaat als niet creëert een new.
Dat kan, maar niet altijd (bijv. session objecten hoeven een keer gecreëerd worden)
Als je al een session geïnitialiseerd hebt dan waarom ga je dat opnieuw starten!.
Simo, 1 factory die precies weet hoe ALLE services aangemaakt moeten worden? Dat gaat volkomen tegen het SOLID (voornamelijk de SRP) principe in...
Factories bestaan er in 2 smaken:
- Factory class
- Factory method
In het geval van een klasse heb je een bepaalde klasse, 1 per object type, die weet hoe hij iets aanmaakt:
<?php
$audi = AudiFactory::createCar(new Tyres('Pirelli'), new Engine('V8'));
?>
In dit geval is het gebruik van een Factory class alleen maar duidelijk, een auto maakt zichzelf niet, de fabriek maakt de auto. In de meeste gevallen is dit echter een beetje overdone, dan is een Factory method genoeg.
Het Factory Method pattern gebruik ik echter wel veel. Wat we hierboven in de code voor problemen hebben:
- Strict genomen create ik geen auto, ik assemble een auto. Tyres en Engines manufacture ik.
- We hebben nu 1 object: Tyres die voor alle soorten banden werkt. Beter is hier bepaalde kwaliteiten van een band in te stellen doormiddel van het Strategy pattern. Zelfde geldt voor de motor.
Een mooiere code zou dan zijn:
<?php
$audi = AudiManufactory::assemble(Tyres::manufacture('pirelli'), Engine::assemble('V8'));
class Tyres
{
pub static func manufacture($type)
{
$tyre = new Tyres();
switch (strtolower($type)) {
case 'pirelli':
$tyre->milesBeforeWear(2000)->...;
Wouter, maar waarom wil je in het voorbeeld met de Session class een factory gebruiken? Jij zegt omdat dat mooier is, maar waarom vind je het dan mooier?
Nou hier zie je al een duidelijk voorbeeld. Je wilt niet telkens al je initialzations aanpassen omdat je de constructor wat aanpast of omdat je wat andere waardes verwacht bij initialize. Je wilt maar 1 plek hoeven aanpassen.