OOP in de praktijk

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Niek

Niek

02/01/2010 20:16:00
Quote Anchor link
Ik heb een vraagje naar het in de praktijk brengen van verschillende klassen. In deze tutorial van markkaz ( 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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if(isset($_POST['post']) {
$gebruiker->reactie_plaatsen($gastenboek, $_POST['reactie']);
}

else {
//formulier weergeven
}
?>


Alvast bedankt.
 
PHP hulp

PHP hulp

25/05/2024 18:38:18
 
Joris van Rijn

Joris van Rijn

02/01/2010 20:22:00
Quote Anchor link
Onderaan staat een mooi stukje:
Gebruik

al doorgelezen?
 
Niek

Niek

02/01/2010 20:56:00
Quote Anchor link
``Joris,, schreef op 02.01.2010 20:22:
Onderaan staat een mooi stukje:
Gebruik

al doorgelezen?


Jazeker, jij ook? Daar staat namelijk niet in hoe een externe gebruiker in de praktijk een bericht toe kan voegen.
 
Niels K

Niels K

02/01/2010 21:01:00
Quote Anchor link
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..)
 
Niek

Niek

02/01/2010 21:04:00
Quote Anchor link
Niels, bedankt voor je reactie, maar ook in dat artikel wordt het gebruik hetzelfde geillustreerd als in het eerste artikel.
 
Nicoow Unknown

Nicoow Unknown

02/01/2010 22:08:00
Quote Anchor link
Wouw,, je kan al zelf nadenken..
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>


Zoiets werkt denk ik wel,,
Moet je zelf maar even kijken.
 
Steen

steen

02/01/2010 23:14:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$gebruiker->reactie_plaatsen


Gebruiker en reactie zijn aparte objecten...
 
Nicoow Unknown

Nicoow Unknown

02/01/2010 23:21:00
Quote Anchor link
@steen,
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.
 
Joren de Wit

Joren de Wit

02/01/2010 23:37:00
Quote Anchor link
@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...
 
Niek

Niek

03/01/2010 12:32:00
Quote Anchor link
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
 
Joren de Wit

Joren de Wit

03/01/2010 13:12:00
Quote Anchor link
Nee, die static method staat daar absoluut niet gelukkig. Dit kun je al zien aan de parameters die geaccepteerd worden, een Gebruiker en een Gastenboek. Van die twee hoor een Reactie niets te weten en laat staan dat hij weet hoe hij ermee om hoort te gaan.

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.
 
Niek

Niek

03/01/2010 13:17:00
Quote Anchor link
Maar waar instantieer ik dan een nieuwe Reactie, als reactiePlaatsen() van Gastenboek die als parameter opneemt?

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
 
Mark Kazemier

Mark Kazemier

06/01/2010 10:20:00
Quote Anchor link
Mooi om te zien dat mijn artikelen ook op PHPHulp.nl gelezen worden :D

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.
 
Producted

Producted

09/01/2010 16:55:00
Quote Anchor link
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.
 
Yearupie Achternaamloos

Yearupie Achternaamloos

09/01/2010 17:12:00
Quote Anchor link
Producted schreef op 09.01.2010 16:55:
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.
 
Jelmer -

Jelmer -

09/01/2010 20:27:00
Quote Anchor link
"Gebruiker" class kan je in dit geval misschien beter zien als "Identiteit", want het is een behoorlijk passief object. Een actief object gebruiker-object maken heeft niet zoveel zin.

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.
 
Producted

Producted

10/01/2010 14:25:00
Quote Anchor link
Yearupie schreef op 09.01.2010 17:12:
Producted schreef op 09.01.2010 16:55:
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-)
 
Joren de Wit

Joren de Wit

10/01/2010 14:48:00
Quote Anchor link
@Producted: je reactie doet wel vermoeden dat je niet inziet waar het hier om gaat. Het formulier heeft in dit geval vrij weinig met het onderwerp te maken omdat het hier gaat om de code die bijvoorbeeld de verwerking van een formulier op zich neemt.

De reactie_plaatsen() method verzorgt dan ook niet de weergave van het benodigde formulier, maar juist (een deel van) de afhandeling ervan...
 
Mark Kazemier

Mark Kazemier

13/01/2010 10:24:00
Quote Anchor link
Zoals al wordt aangegeven, heeft het plaatsen van de reactie inderdaad weinig met het formulier te maken. Dat is op een veel te laag / technisch niveau gedacht. Het idee van OOP is dat je op een hoger niveau denkt en de vaste dingen binnen je programma probeert te vangen binnen objecten.

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.