Ola,

Ik heb een OOP vraagje... ik heb een class waarin je parameters kunt opslaan. Nu kun je via de constructor al een array met parameters meegeven en je kunt via een boolean de parameters freezen. Grofweg ziet de constructor er zo uit:

<?php
public function __construct($parameters = array(), $freeze = false) {
if (!empty $parameters) $this->setParameters($parameters);
if ($freeze === true) $this->freeze();
}
?>
Nu vraag ik me eigenlijk af... ik heb eens gelezen dat de constructor bedoeld is om NOODZAKELIJKE handelingen te verrichten. In de bovengenoemde constructor worden eigenlijk geen NOODZAKELIJK handelingen verricht. Het is vooral heel erg HANDIG.

Waarom is het handig? In plaats van dit:

<?php
$some_collection = new ParameterBag();
$some_collection->setParameters($parameters);
$some_collection->freeze();
?>

... kan ik nu dit doen:

<?php
$some_collection = new ParameterBag($parameters, true);
?>
Maar nu vraag ik me af... is het eigenlijk wel correct OOP om de constructor voor dit soort "handigheidjes" te gebruiken?

Graag jullie reactie.
Natuurlijk mag je ook wat slimme handige dingetjes doen. Waarom denk je anders dat mensen zo houden van het retourneren van $this om method chaining toe te passen? Volstrekt fout volgens OO 'regels', maar extreem handig voor het programmeren.

Wat ik alleen niet erin zou doen is het freezen van de bag, dat lijkt me niet iets wat in een constructor thuis hoort. In principe is de Bag dan nooit ontdooid geweest en dat klinkt voor mij niet goed.
Wouter, oké. Dus handigheid aanbrengen in de constructor is op zich geen probleem? Maar is dat wel volgens de regels van OOP eigenlijk? Hoe hoort het volgens officieel OOP?

Zo:

<?php
$some_collection = new ParameterBag();
$some_collection->setParameters($parameters);
$some_collection->freeze();
?>
of zo?

<?php
$some_collection = new ParameterBag($parameters, true);
?>

Jouw laatste opmerking begrijp ik niet helemaal. Ik heb de class property "freezed" op false staan, dus dat is de default instelling. Via de constructor kun je de parameterbag dan direct freezen nadat je de parameters hebt geset.
Er is geen officieel OOP (ik hOOP dat je dat ondertussen wel door hebt), dus niemand kan een antwoord daarop geven.

Ik kan alleen zeggen dat ik het zo zou doen:
<?php
$parameters = new ParameterBag($parameters);
$parameters->freeze();
?>
Ah oké, thanks... ik dacht dat wellicht de constructor een soort "vaste" bedoeling had. "De constructor is bedoeld om..." zoiets zeg maar.

Maar dat is dus niet zo.

Oké, laatste vraag nog... waarom zou jij die "freeze" niet in de constructor doen? Ik zie het verschil niet helemaal. Waarom wel $parameters in de constructor, maar waarom $freeze niet? Het zijn allebei class properties. $parameters wordt geinitialiseerd (of hoe noem je dat ook alweer) op een lege array en $freeze op false. Dit bedoel ik dus:

<?php
private $freeze = false;
private $parameters = array();
?>
Waarom zou je dan de een wel via de constructor kunnen beinvloeden en de ander niet? Of is dat meer een soort van "gevoel" wat je daarbij hebt? En zo ja, kun je dat dan omschrijven?
Ja, het is een gevoel.

Het freezen is gemaakt zodat je een bag kunt veranderen, toevoegen, verwijderen, ect. en dan zegt: 'Oké, nu is alles gedaan wat gedaan moest worden, nu is het READ ONLY.' Dan zeg je $bag->freeze(). Het voelt voor mij vreemd om in een constructor, ook wel initialize method, al meteen de bag op slot te zetten. Het is dan alsof je een nieuw Word documentje opent en die direct op READ ONLY set, daar heb je niks aan :). (nu klopt dat natuurlijk niet, omdat je ook al parameters hebt toegevoegd, maar het was een schets van mijn gevoel)
Aha, oké... dankjewel voor de toelichting. Dat is dan een verschil in interpretatie. Ik set de data en freeze vervolgens, maar ik kan de get functies natuurlijk nog gewoon gebruiken. Verschilletje van interpretatie, maar niet heel spannend dus in dit geval.

[offtopic]
Net James Bond (Skyfall) gekeken... vette film :-)
[/offtopic]

Reageren