Goed OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Peter Wessels

Peter Wessels

05/08/2008 09:40:00
Quote Anchor link
Beste Mensen,

Ik ben van plan om een spel in OOP te maken, maar mijn vraag is hoe kan ik het maken zonder dat het gewoon een boel functies worden?

Mvg,
Peter
 
PHP hulp

PHP hulp

26/12/2024 04:08:01
 
- SanThe -

- SanThe -

05/08/2008 09:44:00
Quote Anchor link
Goede tutorials en dergelijke lezen.
 
Storeman storeman

storeman storeman

05/08/2008 10:42:00
Quote Anchor link
Kijk eens naar het Zend Framework, dit is een van de betere voorbeelden hoe te werken met objecten.

Er wordt goed gebruik gemaakt van Interfaces en Extensies, daarnaast zijn er nog een aantal inteeressante patterns in gebruikt ( factory, decorator, view).

Je zou gewoon eens een paar simpele formuliertjes kunnen maken en een database verbinding op kunnen zetten en lekker door die code heen bladeren. Interessante materie!
 
Peter Wessels

Peter Wessels

05/08/2008 13:43:00
Quote Anchor link
SanThe schreef op 05.08.2008 09:44:
Goede tutorials en dergelijke lezen.


Ik heb heel erg veel tutorials erover gelezen, maar welke functies (van een class b.v. contructor) moet je gebruiken om niet allemaar een paar functies te krijgen?
 
Douwe

Douwe

05/08/2008 13:44:00
Quote Anchor link
Hoe bedoel je? Een class is juist een pakket functies en variablen?
 
Peter Wessels

Peter Wessels

05/08/2008 13:48:00
Quote Anchor link
Douwe M schreef op 05.08.2008 13:44:
Hoe bedoel je? Een class is juist een pakket functies en variablen?


Ja, Maar ik wil het in OOP doen, dus niet alleen classes met functies, maar echt goed OOP. Soms lees ik dat over een class dat het alleen maar een paar functies zijn en niet echt OOP.
 
Jelmer -

Jelmer -

05/08/2008 14:24:00
Quote Anchor link
Okee. Goed. Ze het idee van integers, strings, arrays, variabelen, snelheid en al het andere van saai programmeren even uit je hoofd. We denken nu in objecten!

Een gebruiker is niet langer een string of een array met wat strings en nummertjes. Nee-hee! een gebruiker is een object! Een gebruiker heeft een naam, een wachtwoord, een foto! Okee, een naam is een string, en een wachtwoord ook, maar die foto is niet een string. Waar jij aan denkt wanneer je foto en string in dezelfde zin noemt (uitzonderingen daargelaten) is het foto-pad. Maar wij hebben het over een foto! Een object! Ja ja! En wat heeft een foto dan wel niet voor eigenschappen? Een pad, en afmetingen. Een pad? Ja ja! Hmm, een foto is in weze een bestand. Oeh! En wat heeft een bestand voor eigenschappen? Een pad, een datum/tijd van wanneer het voor het laatst is gewijzigd etc. etc. Een datum/tijd? Hey, wat is dat? Een object! oja? Ja, echt wel! Bijvoorbeeld een DateTime object, met een format() method waarmee je hem omzet in een string. En wat methods om er wat dagen bij te rekenen, wat dagen af te halen. etc. etc.
 
Peter Wessels

Peter Wessels

05/08/2008 14:31:00
Quote Anchor link
Jelmer schreef op 05.08.2008 14:24:
Okee. Goed. Ze het idee van integers, strings, arrays, variabelen, snelheid en al het andere van saai programmeren even uit je hoofd. We denken nu in objecten!

Een gebruiker is niet langer een string of een array met wat strings en nummertjes. Nee-hee! een gebruiker is een object! Een gebruiker heeft een naam, een wachtwoord, een foto! Okee, een naam is een string, en een wachtwoord ook, maar die foto is niet een string. Waar jij aan denkt wanneer je foto en string in dezelfde zin noemt (uitzonderingen daargelaten) is het foto-pad. Maar wij hebben het over een foto! Een object! Ja ja! En wat heeft een foto dan wel niet voor eigenschappen? Een pad, en afmetingen. Een pad? Ja ja! Hmm, een foto is in weze een bestand. Oeh! En wat heeft een bestand voor eigenschappen? Een pad, een datum/tijd van wanneer het voor het laatst is gewijzigd etc. etc. Een datum/tijd? Hey, wat is dat? Een object! oja? Ja, echt wel! Bijvoorbeeld een DateTime object, met een format() method waarmee je hem omzet in een string. En wat methods om er wat dagen bij te rekenen, wat dagen af te halen. etc. etc.


Leuk verhaal Jelmer, dat snapte ik al wel een beetje maar is toch iets duidelijker geworden, dankje;). Maar laten we dit eens als voorbeeld nemen:

Ik maak een criminals (jeweetwel, niet dat ik dat maak hoor maar b.v.), en ik wil een functie maken als bank. Dan moet ik daar dan een aparte class voor maken, niet? Dan moet ik er functies inzetten zoals: telop('20'), dan doet hij er 20 geld bij op, niet? Dus dan word de pagina bank een object, niet? En als ik wi weten hoeveel geld hij heeft dan moet ik een class laden waaruit ik gegevens van de gebruiker kan lezen, niet?
 
- -

- -

05/08/2008 14:33:00
Quote Anchor link
Jelmer schreef op 05.08.2008 14:24:
Okee. Goed. Ze het idee van integers, strings, arrays, variabelen, snelheid en al het andere van saai programmeren even uit je hoofd. We denken nu in objecten!

Een gebruiker is niet langer een string of een array met wat strings en nummertjes. Nee-hee! een gebruiker is een object! Een gebruiker heeft een naam, een wachtwoord, een foto! Okee, een naam is een string, en een wachtwoord ook, maar die foto is niet een string. Waar jij aan denkt wanneer je foto en string in dezelfde zin noemt (uitzonderingen daargelaten) is het foto-pad. Maar wij hebben het over een foto! Een object! Ja ja! En wat heeft een foto dan wel niet voor eigenschappen? Een pad, en afmetingen. Een pad? Ja ja! Hmm, een foto is in weze een bestand. Oeh! En wat heeft een bestand voor eigenschappen? Een pad, een datum/tijd van wanneer het voor het laatst is gewijzigd etc. etc. Een datum/tijd? Hey, wat is dat? Een object! oja? Ja, echt wel! Bijvoorbeeld een DateTime object, met een format() method waarmee je hem omzet in een string. En wat methods om er wat dagen bij te rekenen, wat dagen af te halen. etc. etc.

Als je dit in de praktijk zou brengen is dit toch veels te genormaliseerd? Dan zou het er zo uitzien:

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
<?php
class Gebruiker
{
    $sNaam = 'Jonathan';
    $sWachtwoord = 'ZegIkLekkerNiet';
    $oFoto = new Foto();
}


class Foto
{
    $oBestand = new Bestand();
    $iBreedte = 1337;
    $iHoogte = 42;
}


class Bestand
{
    $sPad = 'pad/naar/je/bestand.jpeg';
    $iLaatsGewijzigd = new DatumTijd();
    $iLaatstGeopend = new DatumTijd();
}


class DatumTijd
{
    $iDatumTIjd = timestamp();
}

?>
 
Peter Wessels

Peter Wessels

05/08/2008 14:39:00
Quote Anchor link
Jonathan schreef op 05.08.2008 14:33:
Jelmer schreef op 05.08.2008 14:24:
Okee. Goed. Ze het idee van integers, strings, arrays, variabelen, snelheid en al het andere van saai programmeren even uit je hoofd. We denken nu in objecten!

Een gebruiker is niet langer een string of een array met wat strings en nummertjes. Nee-hee! een gebruiker is een object! Een gebruiker heeft een naam, een wachtwoord, een foto! Okee, een naam is een string, en een wachtwoord ook, maar die foto is niet een string. Waar jij aan denkt wanneer je foto en string in dezelfde zin noemt (uitzonderingen daargelaten) is het foto-pad. Maar wij hebben het over een foto! Een object! Ja ja! En wat heeft een foto dan wel niet voor eigenschappen? Een pad, en afmetingen. Een pad? Ja ja! Hmm, een foto is in weze een bestand. Oeh! En wat heeft een bestand voor eigenschappen? Een pad, een datum/tijd van wanneer het voor het laatst is gewijzigd etc. etc. Een datum/tijd? Hey, wat is dat? Een object! oja? Ja, echt wel! Bijvoorbeeld een DateTime object, met een format() method waarmee je hem omzet in een string. En wat methods om er wat dagen bij te rekenen, wat dagen af te halen. etc. etc.

Als je dit in de praktijk zou brengen is dit toch veels te genormaliseerd? Dan zou het er zo uitzien:

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
<?php
class Gebruiker
{
    $sNaam = 'Jonathan';
    $sWachtwoord = 'ZegIkLekkerNiet';
    $oFoto = new Foto();
}


class Foto
{
    $oBestand = new Bestand();
    $iBreedte = 1337;
    $iHoogte = 42;
}


class Bestand
{
    $sPad = 'pad/naar/je/bestand.jpeg';
    $iLaatsGewijzigd = new DatumTijd();
    $iLaatstGeopend = new DatumTijd();
}


class DatumTijd
{
    $iDatumTIjd = timestamp();
}

?>


En hoe zou het er dan wel uit moeten zien? ( lijkt me heel leerzaam voor mezelf)
 
Jelmer -

Jelmer -

05/08/2008 14:48:00
Quote Anchor link
Als je iets uitdenkt in objecten zou ik gerust zover durven gaan. Zend Framework is nog wat erger hoor, daar zou de Bank-klasse ook nog een driver nodig hebben, een soort van bankbediende. Die was dan verantwoordelijk voor de wijzigingen in bijv het backend. Dus een bediende voor MySQL, eentje voor PostgreSQL, eentje voor een XML RPC.

Wanneer je het uitwerkt zou ik niet verder gaan dan op het moment nodig is, met in je achterhoofd dat je het later zou kunnen uitbreiden. Heb je bijvoorbeeld van een gebruiker altijd alleen maar de bestandsnaam van een foto nodig, dan geef je de gebruiker een method 'get_foto_filename'. Later kan je dan nog een method 'get_foto' toevoegen die dan een foto-object teruggeeft, mocht dat nodig zijn. get_foto_filename kan je dan gemakkelijk herschrijven naar intern een aanroep naar get_foto()->get_filename().

edit: En daarom vind ik het een good practice je methods en variabelen zo gedetailleerd mogelijk te benoemen. Niet met hongaarse notatie, maar met een naam die werkelijk beschrijft wat er in de variabele zit.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
 
Peter Wessels

Peter Wessels

05/08/2008 14:53:00
Quote Anchor link
Maar wil je even vertellen of ik dit nou zo goed snap:

Ik maak een criminals (jeweetwel, niet dat ik dat maak hoor maar b.v.), en ik wil een functie maken als bank. Dan moet ik daar dan een aparte class voor maken, niet? Dan moet ik er functies inzetten zoals: telop('20'), dan doet hij er 20 geld bij op, niet? Dus dan word de pagina bank een object, niet? En als ik wi weten hoeveel geld hij heeft dan moet ik een class laden waaruit ik gegevens van de gebruiker kan lezen, niet?
 
Jelmer -

Jelmer -

05/08/2008 14:59:00
Quote Anchor link
Ten eerste is een bank geen functie, maar een ding. Dus ja, een bank zou heel goed een klasse kunnen worden.

Ten tweede kom je niet bij een bank en zeg je "tel 20 euro bij mijn rekening op". Nee, je zegt "ik wil graag 20 euro storten". Dus ik zou je methods storten & opnemen noemen. Het is aan de bank-klasse om dan vervolgens te bedenken of die 20 euro, of 20 euro - 5 procent rente op je rekening zet.

Ten derde moet je bij het bedenken van een bank niet denken aan pagina's en aanroepen en functies etc. Denk gewoon even aan een echte, hoe die werkt. Later bedenk je - helemaal los van hoe je bank-klasse werkt - welke pagina's je hebt. Vervolgens combineer je die 2 dingen in de werkelijke PHP pagina's. Bank <> presentatie. Daarom zal je als het goed is heel weinig echo's en html in een klasse hebben staan over het algemeen. Het is niet aan de bank-klasse om te bepalen hoe het bank-gebouw (de pagina) eruit ziet.

edit:

Bank
- saldo(Gebruiker $gebruiker) -> geeft float terug
- opnemen(Gebruiker $gebruiker, float $hoeveelheid)
- storten(Gebruiker $gebruiker, float $hoeveelheid)

Intern doet je bank-klasse dan de berekeningen en het praten met de database. Daar zie je van buitenaf niets van.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
 
Peter Wessels

Peter Wessels

05/08/2008 16:43:00
Quote Anchor link
Bedankt Jelmer, door je verhaal is het een stuk duidelijker geworden, die ediit was ook zeer nuttig, dankje;)
 
PHP erik

PHP erik

05/08/2008 17:01:00
Quote Anchor link
Grappig dat jouw verhaal heel erg lijkt op de tutorial die ik net schreef Jelmer, terwijl ik je berichten niet had gezien
 
Jelmer -

Jelmer -

05/08/2008 17:03:00
Quote Anchor link
Blijkbaar hebben we dan beiden een redelijk gelijke opvatting ervan. Lijkt mij een goed teken :P
 
PHP erik

PHP erik

05/08/2008 17:07:00
Quote Anchor link
Ja dat denk ik ook.
 
Peter Wessels

Peter Wessels

05/08/2008 18:49:00
Quote Anchor link
Ja, Ik heb je tutorial ook goed doorgelezen phperik;).
 
Emmanuel Delay

Emmanuel Delay

08/08/2008 12:56:00
Quote Anchor link
Toevallig zie ik hier net
Laatste PHP tutorials: Object geörienteerd denke..

OOP begint inderdaad vanuit OO denken, minder vanuit de techniek op zich.
 



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.