Stel ik maak een algemene class om data in op te slaan. Vervolgens wil ik ook een class maken om configuratiegegevens in op te slaan. Daar kan ik eigenlijk perfect de algemene Data class voor gebruiken.
Nu vraag ik me iets vreemds af. Wat is nu wijsheid. Om voor de configuratie gebruik te maken van de algemene data class? Dus:
<?php
$config_settings = new Data();
?>
Of is het slimmer om toch een aparte Config class te maken die de Data class extend?
<?php
class Config extends Data {
}
$config = new Config();
?>
Nu hebben we wel een aparte Config class, maar deze is wel leeg. Er staan geen methods is. Wat zou jullie voorkeur hebben?
>> Het gaat niet om het exacte idee, maar om de gedachte.
Volgens mij proberen vele mensen al maanden jouw van deze zin af te zetten. Hoe kun je gedachte hebben over een concept dat niet "het exacte concept" is maar zomaar een "hersenspinsel van ozzie"? Kom eerst met een exact reallife use-case en dan kunnen we daar onze mening over geven. Er is geen one-size-fits-all principe in OO, elke situatie heeft weer een andere gedachte erachter en een andere aanpak.
In dit geval: Als je config niet meer is dan een array, dan moet je nog eens goed gaan nadenken over wat config precies doet. En ja, daarin gebruik je ergens een array, maar nee, als je het goed hebt uitgewerkt gebruik je hier geen object voor, omdat die precies hetzelfde als een array zou doen.
Thanks Dos. Misschien moet ik de data class abstract maken. En als ik dan bijv. een config class heb, dan laat ik die de Data class extenden. Dan heb ik wel een aparte Config class, alleen staan er dan geen methods in. Mocht het zo zijn dat ik in de toekomst toch extra methods nodig heb, dan kan ik die Config class uitbreiden en hoef ik niet te rommelen in de algemene Data class. Snap je wat ik bedoel?
>> En waarom zou je dan Data nooit mogen gaan gebruiken?
Dat is nu dus iets waar ik over zit te denken... in hoeverre is data niet gespecificeerd? Heb je ooit ongespecificeerde data? Het zou kunnen, en dan moet je 'm dus niet abstract maken.
Mijn 1e vraag is vooral of ik voor een specifieke toepassing een algemene class moet gebruiken, of dat ik een specifieke class moet maken (zonder methods) die de algemene class extend.
Stel we hebben een algemene class Auto. Die kunnen we gewoon ergens voor gebruiken: $auto = new Auto(). Nu wil ik op een gegeven moment een Ford maken, maar die class is hetzelfde als de class Auto. Dus ik zou kunnen zeggen $ford = new Auto(). Ik zou ook een class Ford kunnen maken die ik de class Auto laat extenden en waar ik verder geen andere methods in plaats. Of misschien is het het handigst om de Auto class abstract te maken. Daar zat ik dus even over te denken. Maar laat anders maar zitten, ik verzin wel wat... thanks voor het meedenken in ieder geval.
Dit is niet eens een hele gekke gedachte Ozzie. alleen hoef je het hier niet abstract te maken. Wat je wel kan doen is een interface maken en deze implementeren in al die klasses. zo maak je gebruik van het programmeren naar een interface toe en niet naar een implementatie. ( Ook een OO principe )
OFTEWEL je kan een inversion of control ( IoC ) container gebruiken.
Ik kan de algemene Auto class een AutoInterface laten implementeren. Als ik dan een Ford class zou maken en die extend weer de Auto class, dan is ook in de Ford class de AutoInterface geimplementeerd.
Mijn vraag is dus (nog steeds). Moet ik voor een specifieke toepassing, de Ford, een aparte class maken die de Auto class extend? Of moet ik gewoon zeggen dat Ford een Auto class is?
<?php
// optie 1
$ford = new Auto();
// optie 2
class Ford extends Auto {
}
$ford = new Ford();
?>
Dit is natuurlijk een fictief voorbeeld, maar in de praktijk zou je bijvoorbeeld dit kunnen krijgen:
Je wilt niet een klasse die doet wat jij hem verteld hebt volgens een bepaalde implementatie. Je wilt een object waarvan het niet uitmaakt wie wat hoe of waar het is zolang hij bepaald gedrag overneemt.
Naar mijn mening is php niet echt een taal die polymorfisme goed tot zijn recht laat komen en de manier waarom je dit in Java of C# bijv. kan doen is veel beter dan kan je bijv doen
Auto ford = new Ford();
Auto is hierbij de interface en Ford is het object waaruit je dit wilt creëren
Omdat een configuratie bestand gewoon een configuratie bestand is en geen auto, fiets, persoon of een echt object naar mijn mening dus zoals Wouter zegt meer dan een array teruggeven met alle waardes hoef je niet te doen.
dus gewoon heel simpel een bestand met config.php
<?php
Return array(
'foo' => 'bar',
'a' => 'b'
);
?>
( dit doen veel grote frameworks ook en soms is het niet verkeerd om een beetje af te kijken )