OOP in de praktijk
http://development.blog.markkazemier.nl/2009/06/introductie-oop-gastenboek-bouwen/ ) wordt uitgelegd hoe je een OO gastenboek schrijft. Mijn vraag is nu, hoe breng je dit nu in de praktijk? Is het niet zo dat je dan procedurele code moet toepassen, zoals in dit geval:
Alvast bedankt.
Ik heb een vraagje naar het in de praktijk brengen van verschillende klassen. In deze tutorial van markkaz ( Code (php)
Alvast bedankt.
Gebruik
al doorgelezen?
``Joris,, schreef op 02.01.2010 20:22:
Onderaan staat een mooi stukje:
Gebruik
al doorgelezen?
Gebruik
al doorgelezen?
Jazeker, jij ook? Daar staat namelijk niet in hoe een externe gebruiker in de praktijk een bericht toe kan voegen.
http://development.blog.markkazemier.nl/2009/06/oop-gastenboek-uitbreiden-met-database/
Hier staat hij met database, Misschien dat je daar wat kan vinden.. (Kheb hem zelf nog niet doorgelezen..)
Hier staat hij met database, Misschien dat je daar wat kan vinden.. (Kheb hem zelf nog niet doorgelezen..)
Niels, bedankt voor je reactie, maar ook in dat artikel wordt het gebruik hetzelfde geillustreerd als in het eerste artikel.
Met PHP ontsnap je niet aan procedurele code.
Uiteindelijk moet het altijd vanuit een file worden aangeroepen.
Dus je index.php zal er zoiets uitzien denk ik:
(niet getest)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
$gastenboek = new Gastenboek('gastenboek.txt');
?>
<html>
<head>
<title>Gastenboek</title>
</head>
<body>
<div id="weergave">
<?php
echo $gastenboek->weergeven();
?>
</div>
<div id="reageren">
<?php
if ($_SERVER['REQUEST_METHOD'] == "post") {
$gebruiker = new Gebruiker($_POST['naam'], $_POST['email'], $_POST['website']);
$gebruiker->reactie_plaatsen($gastenboek, $_POST['reactie']);
echo 'Reactie toegevoefd.';
} else {
?>
<form method="post" action="index.php">
Naam: <input type="text" name="naam"><br />
E-Mail: <input type="text" name="email"><br />
Website: <input type="text" name="website"><br />
Bericht:<br />
<textarea name="reactie"></textarea>
<br />
<input type="submit" value="Reactie Plaatsen!">
<?php
}
?>
</div>
</body>
</html>
$gastenboek = new Gastenboek('gastenboek.txt');
?>
<html>
<head>
<title>Gastenboek</title>
</head>
<body>
<div id="weergave">
<?php
echo $gastenboek->weergeven();
?>
</div>
<div id="reageren">
<?php
if ($_SERVER['REQUEST_METHOD'] == "post") {
$gebruiker = new Gebruiker($_POST['naam'], $_POST['email'], $_POST['website']);
$gebruiker->reactie_plaatsen($gastenboek, $_POST['reactie']);
echo 'Reactie toegevoefd.';
} else {
?>
<form method="post" action="index.php">
Naam: <input type="text" name="naam"><br />
E-Mail: <input type="text" name="email"><br />
Website: <input type="text" name="website"><br />
Bericht:<br />
<textarea name="reactie"></textarea>
<br />
<input type="submit" value="Reactie Plaatsen!">
<?php
}
?>
</div>
</body>
</html>
Zoiets werkt denk ik wel,,
Moet je zelf maar even kijken.
Opzich wel,, maar aan de andere kant,,
Gebruiker is nu een soort controller van de reactie.
Opzich klopt het wel,,
Je bent zelf een gebruiker,,
JIJ plaatst de reactie.
Deze reactie doet simpelweg het gastenboek aanroepen en een reactie plaatsen.
Het kan dus wel.
Maar ik had zelf ook een andere manier gekozen.
Maar met OOP is er niet één goede manier,, zijn er veel meer,,
En nog veel meer foute manieren.
@Nico: ik ben het met steen eens, reactie_plaatsen() hoort geen method van de Gebruiker class te zijn. In de uitleg zoals jij hem geeft beschouw je een Gebruiker object niet zoals je zou moeten doen. Het Gebruiker object is alleen verantwoordelijk voor zichzelf en kan alleen zijn eigen eigenschappen beïnvloeden. Hij heeft er geen idee van hoe een bericht geplaatst moet worden...
Blanche schreef op 02.01.2010 23:37:
@Nico: ik ben het met steen eens, reactie_plaatsen() hoort geen method van de Gebruiker class te zijn. In de uitleg zoals jij hem geeft beschouw je een Gebruiker object niet zoals je zou moeten doen. Het Gebruiker object is alleen verantwoordelijk voor zichzelf en kan alleen zijn eigen eigenschappen beïnvloeden. Hij heeft er geen idee van hoe een bericht geplaatst moet worden...
Daar ben ik het mee eens. Ik heb geprobeerd dit op te lossen, is de manier waarop ik dit doe juist?
http://pastebin.com/m284aa815
Ik heb het toevoegen van een reactie een static functie gemaakt van Reactie, omdat ik niet het idee heb dat dit bij Gebruiker hoort.. Het werkt wel, maar is het juist wat ik doe?
Gewijzigd op 01/01/1970 01:00:00 door Niek
Het zou veel logischer zijn om de reactiePlaatsen() method van je Gastenboek class te gebruiken en die een Reactie en Gebruiker als parameter te laten accepteren. Het Gastenboek weet immers wel dat er een Reactie en Gebruiker moeten zijn en je kunt je ook voorstellen dat het Gastenboek weet hoe e.e.a. opgeslagen moet worden.
Doe ik dat dan op deze manier?
http://pastebin.com/m1afeb0da
Hier maak ik een Reactie object buiten de klasses om, en voer het als parameter in bij de reactiePlaatsen() methode van Gastenboek.
Gewijzigd op 01/01/1970 01:00:00 door Niek
Het in de praktijk brengen van de code heb ik opzettelijk een beetje aan de lezer overgelaten, ik houd er namelijk niet van om alles voor te kauwen. Hoe dan ook, het gebruikte artikel is een onderdeel van 9 artikelen over het OOP gastenboek. De latere artikelen gaan dieper in op hoe het verder in praktijk te brengen. Zo wordt bijv. ook het MVC principe later in de tutorials uitgelegd.
Ik las hierboven ook een bericht dat je in PHP altijd procedurele code moet gebruiken ook als je OOP programmeert. Dit is niet specifiek voor PHP, je hebt altijd normale commandos in je code, ook in je klassen, gewoonweg omdat er anders niets gedaan kan worden.
De keuze om het reactie_plaatsen() in de gebruiker klasse te plaatsen is inderdaad ook niet de beste keuze. De gebruiker heeft niets te maken met reacties plaatsen, dus dat zou eigenlijk een save() methode moeten zijn van de reactie klasse of een reactie_plaatsen methode van de Gastenboek klasse.
Blanche schreef op 02.01.2010 23:37:
@Nico: ik ben het met steen eens, reactie_plaatsen() hoort geen method van de Gebruiker class te zijn.
Waarom niet? Jij klikt toch ook met je muis op de knop "Bericht plaatsen"? Als je het form met de tekst er in laat staan gaat er niks gebeuren hoor.
Producted schreef op 09.01.2010 16:55:
Waarom niet? Jij klikt toch ook met je muis op de knop "Bericht plaatsen"? Als je het form met de tekst er in laat staan gaat er niks gebeuren hoor.
Blanche schreef op 02.01.2010 23:37:
@Nico: ik ben het met steen eens, reactie_plaatsen() hoort geen method van de Gebruiker class te zijn.
Waarom niet? Jij klikt toch ook met je muis op de knop "Bericht plaatsen"? Als je het form met de tekst er in laat staan gaat er niks gebeuren hoor.
Het gaat hier over OOP, ik vermoed dat jij dat nog niet kent.
Daarnaast, je zegt het zelf al: de gebruiker klikt op de knop. Dat op de knop klikken is al een onderdeel van de handeling "reactie plaatsen", maar je code rijkt niet zover (die begint pas wanneer de knop ervoor zorgt dat het formulier wordt verstuurd, dat Apache wordt aangeroepen, en dat je code wordt gestart) dus die actie kan je gewoon niet goed modelleren in dit geval.
Misschien wel in een testcase trouwens, dan zou zo'n method op zich nog wel kunnen wanneer je de gebruiker automatiseert.
Yearupie schreef op 09.01.2010 17:12:
Het gaat hier over OOP, ik vermoed dat jij dat nog niet kent.
Producted schreef op 09.01.2010 16:55:
Waarom niet? Jij klikt toch ook met je muis op de knop "Bericht plaatsen"? Als je het form met de tekst er in laat staan gaat er niks gebeuren hoor.
Blanche schreef op 02.01.2010 23:37:
@Nico: ik ben het met steen eens, reactie_plaatsen() hoort geen method van de Gebruiker class te zijn.
Waarom niet? Jij klikt toch ook met je muis op de knop "Bericht plaatsen"? Als je het form met de tekst er in laat staan gaat er niks gebeuren hoor.
Het gaat hier over OOP, ik vermoed dat jij dat nog niet kent.
Omdat ik niet actief/nieuw ben op phphulp, betekent het niet dat ik nieuw ben met PHP. 8-)
De reactie_plaatsen() method verzorgt dan ook niet de weergave van het benodigde formulier, maar juist (een deel van) de afhandeling ervan...
Waarschijnlijk is het beter om een methode save() in de Bericht klasse te maken dan een bericht_plaatsen in de gebruikersklasse. Zoals ik ook al aangegeven heb, wordt dit in de latere artikelen nog verandert. De reden dat het nu zo zit is omdat het een illustratie is van hoe je uit een beschrijving van je systeem je ontwerp kan halen. Natuurlijk zijn er vervolgens verschillende manieren om het te implementeren waarvan er ook meerdere goed zijn vanuit een OOP oogpunt.