Hallo allemaal,

Ik probeer voor mezelf wat duidelijker te krijgen wat precies een "valid state" van een object is. Regelmatig lees ik dat je via de constructor een object in een valid state moet brengen. Nu vraag ik me af hoe ik dat moet zien.

Een fictief voorbeeldje. Stel ik heb een class die een pannenkoek bakt :-)

Nu geef ik de ingrediënten voor de pannenkoek mee aan de constructor.

<?php
$pannenkoekenbakker = new Pannenkoekenbakker($ingredienten);
?>
Ik heb nu dus de ingrediënten aan de constructor doorgegeven en deze worden geset als class property. Is de class nu in een "valid state"?

Als ik de de pannenkoek uit de pannenkoekenbakker wil halen, ziet dat er zo uit:

<?php
$pannenkoekenbakker = new Pannenkoekenbakker($ingredienten);
$heerlijke_pannenkoek = $pannenkoekenbakker->getPannenkoek();
?>
De oplettende lezer zal het misschien zijn opgevallen dat ik een pannenkoek opvraag, maar dat er nog geen pannenkoek is gebakken!

Mijn vraag is nu, was de Pannenkoekenbakker class hierboven dan wel in een "valid state"? Had de constructor eerst een pannenkoek moeten bakken om een "valid state" te bereiken? Of is het voldoende om in de constructor uitsluitend de ingrediënten te setten om in een "valid state" te geraken, en moet ik vervolgens zelf handmatig de "bakken" method aanroepen voordat ik een pannenkoek kan opvragen? Zo dus:

<?php
$pannenkoekenbakker = new Pannenkoekenbakker($ingredienten);
$pannenkoekenbakker->bakken();
$heerlijke_pannenkoek = $pannenkoekenbakker->getPannenkoek();
?>
Wanneer is de "valid state" bereikt vraag ik me af? Als ik in dit laatste voorbeeld een pannenkoek opvraag, terwijl die nog niet is gebakken dan heb ik een probleem. Is het dan toch de taak van de constructor om de pannenkoek te bakken om zodoende een "valid state" te bereiken?
Volgens mij gaan we nu compleet de verkeerde kant op.

Ipv nog een klasse erbij te maken omdat we zo graag een aparte configure method willen hebben moeten we eerder gaan nadenken of dit wel is wat je wilt.

Waarom zou ServiceConfigurator bijv. niet met meerdere inputs kunnen werken? Waarom zou ik per input een nieuwe instance moeten aanmaken? Het zou veel logischer zijn als ServiceConfigurator een stateless class zou zijn en de configure method de services in de container zou zetten aan de hand van de input:
<?php

$loader = new ContainerChainLoader(array(
$yamlLoader, $xmlLoader, $phpLoader
));
$resources = array(
BASE_DIR.'/config/services.yml',
// ...
);
foreach ($modules as $module) {
$resources[] = $module->getConfigResources();
}

$containerConfig = new SeriveConfigurator($loader);

$containerConfig->configure($container, $resources);
?>
Hmmm... dat is iets om over na te denken inderdaad. Met stateless bedoel je dat er geen class properties aanwezig zijn?

Waarom geef je trouwens 3 loaders mee?

Reageren