Momenteel ben ik bezig met een klein experimentje. Ik ben begonnen met een idee een loginsysteem te maken dat zoveel mogelijk OO geprogrammeerd is. Uiteraard is uitgaan van deze stelling verkeerd, omdat als je jezelf VERPLICHT alles oo te gaan doen dan zit je met de verkeerde instelling, het is namelijk de bedoeling om oo toe te passen waar het handig is, als dataholder of voor de reusabillity. Dit was ook mijn bedoeling, het experimentje diende ervoor dat ik kon zien wat er gebeurde.
Zoals ik had verwacht is er aan mijn verwachtingen voldaan en heb ik een OO-overkill gedaan, ik heb mezelf in de knoop gedraaid (geweldig!). Ik ben wel trots op het resultaat en zal alles doen om de stommiteiten die ik erin heb gegooid er uit te halen, en uiteindelijk het systeem hier op sima te posten.
Misschien vraag je jezelf nu af: waarom ik trots ben op het resultaat. Het antwoord daarop is eenvoudig, mijn index-pagina is echt kicke!
Ik vind, als het systeem zo in elkaar steekt, bovenstaande instelling (praktisch alleen maar engels gebruiken ipv te programmeren) geweldig! Alleen is het pokkemoeilijk te verwezenlijken (heb ik gemerkt).
Nu zijn mijn vragen: 1. Wie hier heeft al eens te maken gehad met OO-overkill? (situatie een beetje schetsen als het kan) 2. Wat zou een mogelijke oplossing zijn om niette veel OO te willen programmeren? 3. Waarom denk je dat zoveel mensen de laatste tijd OO willen gebruiken (omdat het zo cool is?) 4. Denk je dat het verkeerd is als mensen zoveel OO te willen gebruiken? (of hoort dit bij het leerproces) 5. Waarom the f*** wil onderstaand ding maar niet werken?
--
Zoals je hierboven ziet is vraag 5 ook een beetje een hulpvraag, omdat ik (zoals ik vermelde) mezelf in de knoop heb gedraaid.
Het probleem is als volgt:
Ik heb een Layout klasse (die een Decorator is voor TemplatePower) die meerdere layouts kan 'dragen': de index-layout (met bijbehorende template), en de onderverdeelde (error, login, registreer...) met bijbehorende template.
Het probleem is dat een Layout meerdere Layout objecten kan hebben (beetje recursief). Als ik het eindproduct render dan laat ik eerst basis dingen genereren (<html><head><title>...) en vervolgens giet ik de layout in de body.
Zoals je ziet worden de extra layout-objecten bijgehouden in de array $extraLayouts. Deze is ook daadwerkelijk gevuld. Het enige probleem is dat als ik $v->render() aanroep er niets gebeurd...
$this->tpl[0] is de 'moeder'-template van elk object. De andere zijn onderverdeeld met een key. Dus eigenlijk zou het dus getOutputContent moeten aanroepen, dit doet het echter niet. Hij geraakt niet eens door de 'sizeof' if bij de aanroepn van 'sub-Layouts'. Terwijl de objecten wel geset zijn (met hun eigen templates). Een beetje verwarrend dus.
public function addLayout($key, Layout $layout) {
$this->extraLayouts[$key] = $layout;
$this->tpl[$key] = $layout->template();
// dit bewijst dat $this->tpl[0] voor de childs zijn geset! (aangezien bovenstaande methode) ***
}
publicfunction addLayout($key, Layout $layout){
$this->extraLayouts[$key]=$layout;
$this->tpl[$key]=$layout->template();
// dit bewijst dat $this->tpl[0] voor de childs zijn geset! (aangezien bovenstaande methode) ***
}
***: hierdoor ben ik dus extreem in de war. Het is geset, maar dan toch niet.
^ als iemand op puntje 5 kan antwoorden?
Ik denk dat ik best een nieuwe klasse aanmaak ChildLayout die erft van Layout en de render methode overschrijft. Spijtig genoeg heb ik hierbij het probleem niet verholpen (wel het feit dat hij tweemaal <html><head> etc zal renderen).
1. Wie hier heeft al eens te maken gehad met OO-overkill? (situatie een beetje schetsen als het kan)
phpclasses.org - geeft (vaak) goed weer hoe het niet moet. Daarentegen zitten er ook hele aardige classes tussen, maar andere zijn gewoon regelrecht troep.
2. Wat zou een mogelijke oplossing zijn om niet te veel OO te willen programmeren?
Je bedoelt misschien "een mogelijk reden" om niet te veel OO te willen programmeren? Omdat niet alle zaken zich lenen om OO geschreven te worden. OO is een middel, geen doel an sich.
3. Waarom denk je dat zoveel mensen de laatste tijd OO willen gebruiken (omdat het zo cool is?)
Dit zou de nieuwe stijl programmeren moeten zijn / worden? Er zijn de laatste tijd ook een aantal talen verschenen die OO ondersteunen (.NET-varianten etc).
4. Denk je dat het verkeerd is als mensen zoveel OO te willen gebruiken? (of hoort dit bij het leerproces)
Als ze een keer hun handen branden en hier van terugkomen is dat niet erg (je leert dan een hoop). Maar als je OO blijft toepassen bij alles wat je doet... Ik zou gewoon het beste van de twee werelden gebruiken (OO en niet-OO).
5. Waarom the f*** wil onderstaand ding maar niet werken?
Fenrir geeft me hier goede adviezen/regels/voorbeelden over.
een belangrijke opmerking van hem was:
quote:
Citaat:
Veel mensen op sitemasters maken een class en denken meteen dat ze object georienteerd programmeren.
OOP is als je een hoofddoel hebt voor ogen en die dan onderverdeeld in een aantal classen [een class per functie voor je hoofddoel]. Daarom is OO programmeren in php vaak nutteloos...
Een schets van OO programmeren:
HoofdDoel = forum
classen:
Onderdeel 1 => bekijk forum
Onderdeel 2 => bewerk forum
Onderdeel 3 => verwijder forum
Onderdeel 4 => bekijk topic
enz.
OOP is pas nuttig als je het gebruikt bij talen die object georienteerd zijn zoals bijv. Ruby
Wat ik wil vragen (aan nemesiskoen en anderen "OOP experten") of dit waar is
Veel mensen op sitemasters maken een class en denken meteen dat ze object georienteerd programmeren.
OOP is als je een hoofddoel hebt voor ogen en die dan onderverdeeld in een aantal classen [een class per functie voor je hoofddoel]. Daarom is OO programmeren in php vaak nutteloos...
Een schets van OO programmeren:
HoofdDoel = forum
classen:
Onderdeel 1 => bekijk forum
Onderdeel 2 => bewerk forum
Onderdeel 3 => verwijder forum
Onderdeel 4 => bekijk topic
enz.
Tot zover ben ik er mee eens Op de regel ,,Daarom is OO programmeren in php vaak nutteloos'' na.
Citaat:
OOP is pas nuttig als je het gebruikt bij talen die object georienteerd zijn zoals bijv. Ruby
Oneens. PHP word steeds meer OO. (Je kan er in ieder geval steeds meer mee doen denkend aan PHP 5) Dit zal waarschijnlijk steeds verder uitgebreid worden zodat PHP later ook OO genoemd kan worden.
Ik ben het zeker eens dat veel zaken OO worden gedaan terwijl dit zeker niet nodig is. Soms kan je evengoed een gewone functie gebruiken.. een class is handig als je interactie tussen de objecten wilt IMO.
Ibrahim - 01/05/2006 12:05 (laatste wijziging 01/05/2006 12:10)
PHP expert
ik ben offtopic gegaan maar even hierop reageren:
Citaat:
Tot zover ben ik er mee eens Op de regel ,,Daarom is OO programmeren in php vaak nutteloos'' na.
waarom zou je in php voor elk onderdeel een class maken? heeft niet echt zin he...
genoeg over dit
maar ik kan nemesiskoens vragen niet beantwoorden, want ik script niet OOP
ik kan wel eentje beantwoorden (mening):
de reden dat mensen laatste tijd 'OOP' willen scripten is eigelijk omdat als men iets nieuws ziet het ook wilt leren (tenminste als ze een cool voorbeeld zien wat het kan) dat is hetzelfde met Ajax (Hits: 2463)
OOP scripting is een beetje een rare uitdrukking als je het acroniem voluit schrijft. Dat ter zijde:
Citaat:
waarom zou je in php voor elk onderdeel een class maken? heeft niet echt zin he...
Er is een verschil tussen 'voor alles een klasse maken' en oo-voordelen uit php halen.
Een goed voorbeeld hiervan is een templateparser. Sure, je _kan_ een function-based-tpp maken maar door het als een object te benaderen ziet het er logischer/duidelijker uit. Idem bij het uitlezen van xml.
Ik merk ook dat mijn klassen in java zich meer lenen voor reussability, maar php moet daarom niet volledig hiervoor onderdoen. Bij java word je half en half geforceerd om oo te programmeren, bij php heb je een keuze, en reussability is er zeker!
Omdat php 'struct' niet kent, of voor zover ik weet toch niet (php heeft hashing-tables in de plaats) zal oo zich binnen php verlenen tot het nabootsen hiervan. Dus dataholders die eigenlijk een array zijn die op een eenvoudige manier kan aangesproken worden.
<?php
class ItemHandler {
private $items = array();
/**
* @desc: adds an element to the items array
* @return: void
* @accept: FormElement
**/
public function add(FormElements $what) {
$this->items[] = $what;
}
/**
* @desc: returns the amount of items in the items array
* @return: int
* @accept: void
**/
public function count() {
return count($this->items);
}
/**
* @desc: returns one item of the items array
* @return: FormElement
* @accept: mixed
**/
public function get($what = NULL) {
return $this->items[$what]->toString();
}
}
Voor de geïnteresseerden: ik ben eruit geraakt. Heel eenvoudig opgelost: de $tpl array tot een 1 $tpl object gemaakt en een sublayout klasse geschreven die heel eenvoudig is:
<?php
class SubLayout extends Layout {
public function __construct() {}
public function render() {
return $this->tpl->getOutPutContent();
}
}
<?php
class SubLayout extends Layout {
publicfunction __construct(){}
publicfunction render(){
return$this->tpl->getOutPutContent();
}
}
Hij is exact gelijk aan Layout, alleen erft hij de private methods niet over (wat goed is) en veranderd hij de render-methode (wat de bedoeling was).
Nu kan ik in al mijn bestanden gewoon $template aanroepen, deze wordt aangemaakt via index.php en representeert de template van elk bestand appart (bepaald door $_GET[$action], een variabele $_GET dus:)).
Ik ben wel tevreden over het systeempje, ook al zitten er belachelijk veel klassen in (en sommige, momenteel, vrij nutteloze) is het wel grappig. Heb op een minuutje een registreer-pagina gemaakt met foutafhandeling en de waardes blijven in het tekstvlak staan als er iets mocht mislopen:)
Nu nog even een login-pagina en een paar dummy 'controles' toevoegen en de grondlaag is gelegd!
Ibrahim - 02/05/2006 17:56 (laatste wijziging 02/05/2006 17:57)
PHP expert
mag ik vragen wat voor nut het heeft een __construct functie te maken als je er niets inzet ? Heeft het een speciale reden, want volgens mij hoeft een __construct niet perse...
__construct hoeft zeker niet, maar ik zet hem daar omdat ik later nog argumenten zal meegeven. Dit kon jij natuurlijk niet weten, maar deze zal in de toekomst nog argumenten opvragen als ik een oneindige template-boomstructuur ga uitwerken (maar dat is nu nog niet nodig).
Een andere reden dat ik hem soms aanmaak (bij bv. de moederklasse Layout) is omdat ik een singleton wilde maken van Layout (je hebt tenslotte maar 1 layout), toen wilde ik sublayouts maken en dacht ik deze als een Layout object te benaderen dus werd Layout niet meer Singleton. Ik veranderde de 'private function __construct() {}' in 'public function __construct() {}'. (waarom niet...) En het is blijkbaar handig geweest omdat ik hem nu terug naar singleton heb veranderd.
Maar je hebt gelijk, __construct _moet_ er niet staan.
Ja/nee, stijn zit fout omdat het een public constructor is en dus niets met singleton te maken heeft. Ik heb hem daar geplaatst omdat ik weet dat ik hem later (eigenlijk heb ik hem nu al nodig, ben heel de dag bezig geweest en de constructor is al in gebruik) zou nodig hebben (nu dus).
Hoewel het belachelijk veel apparte klassen zijn bewijst het toch wel dat het scripten veel sneller gaat (misschien het parsen een miliseconde trager...). Ik heb op enkele seconden een login en loguit pagina gemaakt. De loguit pagina bestaat uit 2 regels php-code:)
Over die OO-overkill:
Je moet de dingen alleen in een class steken als het zin heeft.
Nu komt de vraag wanneer het zin heeft:
Wanneer het verschillende functies is die je wilt bundelen.
Wanneer het functies zijn die je meerdere keren gebruikt.
Wanneer je de class de volgende keer niet meer moet herschrijven voor andere sites.
Ik heb dus een template-class, gemaakt door haytjes (promo )
Ik heb een inloggen-class, maar die is niet zeer groot, hij controleert alleen als iemand ingelogd is (dmv cookies). en heeft een functie $f_inloggen->login($id); en $f_inloggen->uitloggen()
Ik heb een class voor mysql, zodat alles wat makkelijker gaat
en dat is het. (Dus alleen het broodnodige om een nieuwe site 1 tandje sneller op te zetten)
Over die 4 regels zit je fout. Mijn script is minimaal drie regels lang. Die laatst '?>' mag niet als je nergens anders escaped voor html. Het zal geen error geven maar eigenlijk moet je het weglaten. (heb ik het ooit een keer met proximus over gehad)
For files that contain only PHP code, the closing tag ("?>") is never permitted. It is not required by PHP. Not including it prevents trailing whitespace from being accidentally injected into the output.
heb net 2 uur zitten zoeken achter de stomste fout ooit. Ik heb zowat alles herschreven en bewerkt omdat ik ergens een ampersant had weggelaten. Ik dacht dat alle objecten in php per referentie werden doorgegeven vanaf PHP5; oftewel klopt de php documentatie niet (of ik ben verkeerd ingeligt), oftewel zit er een fout in de php engine want dit was dus niet het geval. Ik MOEST een ampersant zetten, anders kon er geen actie op worden uitgevoerd. In sommige gevallen wel maar als ik daarvoor dan een of andere complexe actie er doorgooide dan kon hij het ineens weer niet meer zonder ampersant...
strange...
Overigens heb ik weer met slechts 64 regels code (met vele enters ertussen om het leesbaar te houden) een bewerk_profiel pagina kunnen maken. Met een validator (dus als er iets niet goed is ingevult: error), de waardes blijven bewaart als ze zijn ingevuld en ze worden via 1 commando opgeslagen. Heel uitgebreide bewerk-pagina dus:) Dus het werpt zijn vruchten af, alleen moet je daarvoor eerst massa's andere pagina's aanmaken:)