Door
Reshad F
op 04-11-2012 15:49
gewijzigd op 04-11-2012 17:57
4.043 views
Hello OOP specialisten vooral :)
Ik ben na lange tijd maar weer is achter de PHP classes oefeningen gedoken.
Voor een nieuwe oefening dacht ik een navigatie menu te maken d.m.v. een Navigation class. Waar ik nu precies naar benieuwd ben, wat moet er zoal in en waar moet ik rekening mee houden. zijn er dingen die minimaal in een navigaton class moeten komen? ( denk hierbij aan de interface class ) etc...
alle tips zijn welkom :)
[offtopic]
ik post de vraag ook op andere fora dus wees niet verrast als je het tegenkomt, uiteraard zal ik het uiteindelijke resultaat overal neerzetten.
[/offtopic]
ik wil het eerst werkend hebben met gewone menu zonder subitems) omdat ik de class nu nog zo klein en schoon mogelijk wil houden alleen maar om te oefenen. Uiteraard is het later nog uit te breiden.
Als je OO bouwt moet je het altijd bouwen met het oog op de toekomst: Wat kan er in de toekomst veranderen en hoe maak ik het zo simpel mogelijk om die verandering toe te passen. Daarom moet je nu al gaan nadenken hoe het straks wordt.
Wat hier mis is dat de Navigatie klasse nu meerdere taken heeft => mag niet in OO. Vervolgens ga je hier maar uit van 1 menu item, richt je je blik niet op de toekomst en is je code veel te gespecialiseerd voor deze applicatie i.p.v. als een component die in elke applicatie kan werken.
Ik zou gewoon alles groeperen als een Element met een ElementInterface die geldt voor elk HTML element die je maar kunt bedenken. Die heeft methoden als appendChild(child:ElementInterface) en setAttribute(name:string, value:string).
Je kunt dan een AnchorElement maken en een NavItem element. Elk NavItem kan via appendChild een nieuw NavItem bevatten, om zo subitems te maken, maar ook een Anchor element die vervolgens weer wat tekst kan bevatten of een nieuw element als een SpanElement.
Als laatst heb je dan een NavItem die de hele navigatie voorstelt en gebruik je een RendererInterface met daaronder HTMLRenderer en XMLRenderer of YamlRenderen of wat je maar wilt, die de uiteindelijke HTML code maakt.
[hr]
Dit idee is gebaseerd op [google]knpmenu[/google], die ik vaak met het Symfony2 Framework (icm KnpMenuBundle) gebruik, maar dan nog wat verder gedacht.
Het ziet er goed uit vooral pim's voorbeeldje wat ik wel snap ( kwa code ) en deels ook kwa werking.. maar de connectie met de appendChild enz zie ik er zo 1,2,3 niet in.
Ja dus? Dat is nog steeds niet correct OO. Alles is een object in OOP, onthoud dat altijd goed.
In dit geval is Navigation, een object, een zelfstandig werkwoord. Dat klopt al, maar, een menu-item, dat is ook een apart object.
->setMenuItem() is geen apart object maar een method in je Navigatie functie!!!
Omdat een menu-item ook nog steeds een apart object is, doe je het, zoals ik al zei, beter in een aparte class!!!
hmm @Raoul als ik deze twee nu wil scheiden. moet/kan ik dan gewoon de item methods in een andere class zetten en de class aanroepen in mijn navigation constructor?
en vervolgens in mijn display(); methode de methodes ervan ook aanroepen?