Hi guys,

Een Processor/Core/Kernel class doorloopt allerlei stappen. Mag de consructor deze stappen triggeren/uitvoeren? Even een heeeeel erg versimpeld voorbeeldje met 3 fictieve functies.

<?php

class Processor {

private $request;

public function __constructor($request) {
$this->request = $request.
$this->initializeRequest();
$this->executeRequest();
$this->sendResponse();
}

}

?>
Zou de constructor deze functies mogen triggeren? Is dat oké volgens het OOP principe?
Ja tuurlijk, waarom zou dat niet mogen?

De vraag is meer of het handig is. En dat kan jij alleen beantwoorden. Als jij denkt dat het handig is dat die class direct methods etc aanroept op het moment dat jij daar een instantie van aanmaakt, dan is dat goed.

Ik zou overigen wel aan type hinting doen wanneer dat kan, Dus:


Public function __construct ( IRequest $request ) { }


Dan weet je zeker dat het object dat jij binnen krijgt beschikt over bepaalde methods.
Die typehinting doe ik ook ;) Dit was slechts een voorbeeldje.

Oké... ik vroeg me dus af of zoiets oké is, omdat de constructor dan het hele proces "aanstuurt".

Je zou bijvoorbeeld ook dit kunnen doen:

<?php

class Processor {

private $request;

public function __constructor($request) {
$this->request = $request.
$this->execute();
}

private function execute() {
$this->initializeRequest();
$this->executeRequest();
$this->sendResponse();
}

}

?>
Nu stuurt de "execute" method alles aan, maar volgens mij is dit eigenlijk een "schijn"-constructie omdat de "execute" method alsnog door de constructor wordt aangeroepen en het in feite dus een verlengstuk van de constructor is. Mee eens?
Oneens. Het kan wel handig zijn om private methods aan te roepen vanuit je constructor. Maar alleen zodat je niet veel logica in een constructor hoef te hebben. Stukken logica verhuis je dan naar methods die je een goed omschrijvende naam geeft.

Ik dacht dat je het eerst over public methods had.
Nu volg ik je even niet meer. Ben je het nu wel of niet eens om die methods vanuit de constructor aan te roepen? Het gaat om private methods.
Wat je goed moet begrijpen Ozzie is dat alles wat de constructor doet je niet meer kunt onderbreken als je een nieuwe instantie van de class aanmaakt. Als je later de class gaat gebruiken en je wil na het instantiëren nog een property van het object wijzigen dan heeft je constructor al een aantal stappen doorlopen eer jij de kans krijgt deze property te wijzigen. Dat kan soms onhandig zijn. Daarnaast is het zo dat een constructor niets kan return-en. Ook dat is in sommige gevallen niet handig en zou bij mij reden zijn om een nieuwe method aan te maken. Ik zie die constructor eigenlijk als een methode om de class-properties te initialiseren. Wat mij betreft hoort dus alleen $this->initializeRequest(); in de constructor thuis.

D Vivendi op 18/05/2014 17:41:11

Oneens. Het kan wel handig zijn om private methods aan te roepen vanuit je constructor. Maar alleen zodat je niet veel logica in een constructor hoef te hebben. Stukken logica verhuis je dan naar methods die je een goed omschrijvende naam geeft.

Ik dacht dat je het eerst over public methods had.


Private of public heeft hier niets mee te maken. Het mag beiden vanuit de constructor.


Toevoeging op 18/05/2014 18:00:15:

Ozzie PHP op 18/05/2014 17:31:45

Nu stuurt de "execute" method alles aan, maar volgens mij is dit eigenlijk een "schijn"-constructie omdat de "execute" method alsnog door de constructor wordt aangeroepen en het in feite dus een verlengstuk van de constructor is. Mee eens?


Ja en Nee. die execute method kan ook later nog worden aangeroepen vanuit een andere method. Hierdoor is het geen verlengstuk meer van de constructor. Wanneer er echt geen reden valt te bedenken onder welke omstandigheden deze functie later nog eens aangeroepen zou kunnen worden dan is het inderdaad niets meer dan een verlengstuk van de constructor maar als dat dan de leesbaarheid van de code verbeterd ben ik een voorstander om het alsnog te gebruiken. Uiteraard moeten de namen van je methods zo goed mogelijk omschrijven wat de taak is van de method zoals D Vivendi opmerkt.
Dankjewel voor je reactie Frank. Het is ook niet de bedoeling dat er na het instantiëren van het object er nog iets mee gebeurt. Dus op zich klopt dat wel.

>> Wat mij betreft hoort dus alleen $this->initializeRequest(); in de constructor thuis.

Oké... maar ik wil dus niet handmatig de "executeRequest" method aanroepen, die moet dus ergens door worden aangeroepen. In de constructor zelf? Of de constructor een soort van "execute" method laten aanroepen die vervolgens alle methods aanroept? Volgens mij schiet ik daar eigenlijk weinig mee op.
Ehm ik had nog wat toegevoegd Ozzie, en als jij zegt dat die handelingen in ieder voorkomende situatie direct uitgevoerd kunnen worden dan mag dat dus gewoon.
Oke... maar in principe als aan de "voorwaarden" die jij noemt is voldaan, dan kan zo'n constructie als dit dus gewoon prima? :)

<?php

class Foo {

private $foo;

public function __constructor($foo, $bar) {
$this->foo= $foo.
$this->initializeFoo();
$this->executeFoo();
$this->doTheFoo();
$this->addSomeBar($bar);
$this->createFooBar();
}

}

?>
Allrightie... thanks :)

Reageren