Goed OOP
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
Goede tutorials en dergelijke lezen.
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!
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?
Hoe bedoel je? Een class is juist een pakket functies en variablen?
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.
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.
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.
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?
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.
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)
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
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();
}
?>
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();
}
?>
Jonathan schreef op 05.08.2008 14:33:
Als je dit in de praktijk zou brengen is dit toch veels te genormaliseerd? Dan zou het er zo uitzien:
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.
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)
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
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();
}
?>
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)
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 -
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?
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 -
Bedankt Jelmer, door je verhaal is het een stuk duidelijker geworden, die ediit was ook zeer nuttig, dankje;)
Grappig dat jouw verhaal heel erg lijkt op de tutorial die ik net schreef Jelmer, terwijl ik je berichten niet had gezien
Blijkbaar hebben we dan beiden een redelijk gelijke opvatting ervan. Lijkt mij een goed teken :P
Ja dat denk ik ook.
Ja, Ik heb je tutorial ook goed doorgelezen phperik;).
Laatste PHP tutorials: Object geörienteerd denke..
OOP begint inderdaad vanuit OO denken, minder vanuit de techniek op zich.