Ik ben nieuw met OOP, maar na het lezen van een aantal artikelen en boeken wil ik me toch eens gaan wagen aan het schrijven van een OO PHP-script. Voordat ik begin met scripten, vroeg ik me af of hetgeen ik bedacht heb ook daadwerkelijk klopt. Ik zie vaak berichten en scripts voorbij komen waarin de OO gedachtegang compleet misgeslagen wordt.
Wat ik wil maken is een weblog in de allereenvoudigste vorm: ik wil de mogelijkheid hebben om een bericht te plaatsen, aan te passen, en vervolgens moeten de berichten weergegeven worden.
Uit het OOA&D boek van Head First wordt er aangeraden een feature list op te stellen, en daaruit de zelfstandig naamwoorden en werkwoorden te halen om zo een idee te krijgen van je klassen en methoden. Om dat lijstje kort te maken:
- Bericht moet geplaatst kunnen worden
- Bericht moet aangepast kunnen worden
- Berichten moeten weergegeven worden
Hieruit haal ik dat ik maar een klasse nodig heb, Bericht.
Klopt het een beetje wat ik aan het denken ben, of sla ik de plank mis? Graag hoor ik jullie meningen hierover, alvast bedankt!
?
Onbekende gebruiker
22-12-2009 21:08
Zoals je het nu bedacht hebt, ga je de goede kant op. Probeer eens een abstracte vorm van je klasse op te stellen en ben niet bang om het te laten keuren =]
Zouden plaatsen en aanpassen niet beter bij de bovenliggende class kunnen (tenzij je in plaatsen() een andere class aanroept). Bij de Bericht class kan je dan methods doen setTitel() e.d.
Ik zou er nog een extra klasse bij maken die het verwerken doet.
Iets van een berichtController ofzo.
Een bericht kan niet iets met zichzelf doen, dus daar heb je dan een Controller voor nodig.
Overigens is weergeven niet echt iets om door je Model te laten doen.
Je heb het Object (model) Bericht, die kan je aanpassen of aanmaken via de klasse (controller) BerichtController, die je dan weer door een View kan laten zien.
Meestal is het handig om Views gewoon in een file te stoppen, of je kan hele mooie template engines maken, zodat je het met een functie kan aanroepen.
Wat nico zegt is inderdaad ook een mogelijkheid. Heel erg abstract genomen is het niet de taak van een bericht om zichzelf op te slaan. Dat is de taak van iets dat berichten onthoudt. (en waarschijnlijk heeft dat iets ook als taak om berichten terug te vinden) Zo kan je ook een class verzinnen die als taak heeft om berichten weer te geven.
Waarom zou je daar aparte classes voor maken? Voor het weergeven zou het bijvoorbeeld zo kunnen zijn dat je een bericht als HTML wilt tonen, maar ook als plaatje (via GD, bijvoorbeeld voor in de signature op een forum) Om je code lekker modulair en onafhankelijk te houden maak je dan twee aparte classes die beiden los van elkaar kunnen bestaan. Dat wat ze wel met elkaar in gemeen hebben is dat ze de data van een bericht willen hebben: het bericht.
Dat bericht moet ergens vandaan komen. Uit een database, uit een formulier, uit een tekstbestand? Daar kan je ook weer aparte classes voor maken: classes voor de bronnen van de berichten. De bronnen zoals database zouden ook weer de taak op zich kunnen nemen om berichten te onthouden. Een formulier heeft die taak niet echt.
Wat is nu het voordeel van al die aparte classes? De code is in alle situaties ongeveer zo:
<?php
$bron = new Berichten_Store(); // kan database zijn, of flat file, of...
$doel = new Berichten_Painter(); // kan een class zijn die berichten kan schrijven naar een plaatje, of naar HTML.
$bericht = $bron->read();
// $bericht is nu een object Bericht, met daarin alle data van het bericht.
$doel->paint($bericht);
?>
Je kan nu de class voor $bron en de class voor $doel onafhankelijk van elkaar veranderen. Deze code blijft hetzelfde.
Voor iemand die net begint met OOP, is MVC misschien al een beetje verregaand jongens. Ik denk dat je opzet voor een beginner zeker goed genoeg is, je zal al snel zien dat het combineren van verschillende classes vele voordelen met zich meebrengt. Dus probeer het eerst even zo en kijk nadien even naar MVC (of Model View Controller).
Waarom, waarom eerst dingen anders leren, om het daarna weer anders te leren doen.
Als je voor de rest echt niks te doen heb รก fin, maar ik neem aan dat hij toch ook wel een leven heeft voor de rest.
Als teveel hooi op je vork nemen lijdt tot mislukkig, is dat enkelt een teken dat je geen doorzettingsvermogen hebt, en dat je het eigenlijk toch niet wilt,
Voor de rest graag weer on-topic