Een eerder topic vandaag heeft mij aan het denken gezet over OOP.

Ik wil graag jullie MENINGEN horen! Dus iedereen die iets doet met OOP, reageer alsjeblieft even.

Stel dat we een class hebben die een auto in elkaar zet. Laten we het simpel houden. Deze class zoekt op basis van het opgegeven model de juiste autobanden, de juiste motor, de juiste carrosserie en het juiste interieur (dashboard, stoelen, bekleding) en installeert en configureert deze zaken vervolgens. Nogmaals, het is even een heel simpel voorbeeld. Het gaat vooral om de gedachte. In mijn vorige topic zei Wouter dat je de methoden in een class gescheiden moet houden van de constructor. En daar kan ik zeker wel inkomen. Je zou dan het volgende krijgen:

<?php
$model = 307; // we gaan een Peugeot 307 maken

$auto = new Auto($model);
$auto->zoekEnInstalleerBanden();
$auto->zoekEnInstalleerMotor();
$auto->zoekEnInstalleerCarrosserie();
$auto->zoekEnInstalleerInterieur();

?>
Voila, we hebben een Peugeot 307 gefabriceerd!

Nu komt de vraag... een auto wordt altijd op dezelfde manier gebouwd met behulp van de bovenstaande 4 functies. Aangezien deze functies altijd moeten worden uitgevoerd om een auto te maken, is mijn vraag de volgende.

Vinden jullie (de OOP gebruikers) het een goed idee om de 4 functies vanuit de constructor aan te roepen. Dan zou je om een Peugeot 307 te maken alleen nog maar dit hoeven te doen:

<?php
$model = 307; // we gaan een Peugeot 307 maken

$auto = new Auto($model);

?>
En de Peugeot 307 is klaar.

De 4 functies zouden we private kunnen maken, zodat we deze niet van buitenaf kunnen aanroepen. De complete auto wordt dus gemaakt door enkel het model mee te geven aan de constructor.

Graag reacties... wel of geen goed idee? En waarom wel of niet?

Ik ben erachter dat in de OOP wereld er veel sprake is van persoonlijke voorkeur. Dat is niet erg, ik ben gewoon benieuwd naar jullie meningen. Dus wat zouden jullie doen. De functies handmatig aanroepen, of triggeren vanuit de constructor?
Maar wat je nu doet met deze code:
<?php
new Verwarming(21);
?>
Is iets anders dan de verwarming aanzetten. In dit geval is het namelijk de verwarming installeren.

Vervolgens gebruiken we bijv. een method Verwarming#setTemperature(21) om de verwarming in te stellen. En deze roept al deze 4 methods aan. Natuurlijk ga je die in dit geval niet allemaal zelf aanroepen, wat je natuurlijk ook niet gaat doen is telkens een nieuwe verwarming installeren als je de temperatuur hoger of lager wilt zetten.
In je stelTemperatuurIn methode kan je die controles dan beter doen.
Hmm, ja... zit wat in.

De situatie zoals ik die schets zal ook niet vaak voorkomen, maar als ie dus voorkomt wat moet ik er dan mee.

Even terugkomend op het voorbeeld van de autoloader... ik heb dus een register functie die altijd moet worden aangeroepen om de class te laten werken. Dus zodoende vroeg ik me af waarom ik 'm dan niet in de constructor zou aanroepen.

Stel bijv. dat je bij die verwarmingsclass altijd (voordat je de verwarming gaat installeren) zou willen controleren of er wel een leidingstelsel aanwezig is in het betreffende pand, waarom zou je die controle dan niet in de constructor uitvoeren in plaats van:

$verwarming = new Verwarming();
$verwarming->checkLeidingStelsel();
Ozzie PHP op 08/04/2013 16:06:15
Even terugkomend op het voorbeeld van de autoloader... ik heb dus een register functie die altijd moet worden aangeroepen om de class te laten werken. Dus zodoende vroeg ik me af waarom ik 'm dan niet in de constructor zou aanroepen.
Een autoloader is om verschillende redenen een uitzondering. Autoloaders worden aangeroepen in de volgorde waarin je ze op een stack plaatst. Dat betekent dat je het registreren van de ene autoloader niet los kunt zien van het registreren van een andere autoloader. Wil je daarover wel controle houden, dan zou je het registreren bijvoorbeeld kunnen verplaatsen naar één centrale Registry waar alle autoloaders zich moeten "aanmelden".

Ozzie PHP op 08/04/2013 16:06:15
Stel bijv. dat je bij die verwarmingsclass altijd (voordat je de verwarming gaat installeren) zou willen controleren of er wel een leidingstelsel aanwezig is in het betreffende pand, waarom zou je die controle dan niet in de constructor uitvoeren in plaats van:

$verwarming = new Verwarming();
$verwarming->checkLeidingStelsel();

De verwarming "weet" niet dat ze is aangesloten op een leidingstelsel. En al helemaal niet dat dit leidingstelsel zich in een pand bevindt. Sterker nog, de verwarming weet niet eens wat een leiding of een pand is.

Een controle uitvoeren is iets anders dan totale controle willen hebben. De verwarming hoeft alleen een fout te constateren (ik voel te weinig waterdruk op mijn drukmeter) en die te melden (ik doe het derde ledje van links aan). Daarna is het aan de eigenaar van de verwarming om iets te doen met de rode ledjes.
Ozzie.. wat probeer je nu eigenlijk te doen? Een auto inladen met de juiste properties? Dan maak je beter gebruik van een factory.

Reageren