[oop] eigenschappen worden niet getoond/construct
Maar als een deel van de constructor wel goed is uitgevoerd, en het andere deel niet goed, weet je niet waar de fout zit. Daarom kan je beter een exception gooien of een standaardwaarde instellen, dan kan je alles tenminste goed afhandelen.
Niet doen:
Wel doen:
Code (php)
Dat zou ik ook aanraden. Buiten de functies lijst je de eigenschappen (de this-variabelen) op; niets meer. Dat is trouwens een goede plek om commentaar te zetten bij de variabelen.
Een waarde toekennen aan een eigenschap doe je enkel en alleen in methodes (functies).
De constructor is een vrij zinnige plek om dat te doen. Daar dient een constructor zowat voor.
Je twee voorbeelden hebben exact dezelfde werking uiteindelijk, toch? Betekent dit dat wat je wil zeggen is dat je alleen om het overzichtelijk toe te kunnen voegen van commentaar voorbeeld nummer twee moet gebruiken? :)
Code (php)
anders zou je een nieuwe setter moet gaan maken voor een flexibele invoer van $_maxvoer, wat veel meer werk geeft
Mee eens, maar niet alle attributen zijn van dit soort ;).
nee, maar properties die altijd aanwezig moeten zijn, kun je het beste in de construct zetten. zo verplicht je de boel die waardes aan te nemen, en het kost een stuk minder code. je zou natuurlijk altijd een setter kunnen maken om dat aan te passen, maar wat je niet hoeft te doen moet je ook niet doen in OOP
Stephan G op 10/09/2013 11:06:23:
...is dat je alleen om het overzichtelijk toe te kunnen voegen...
Wel, ik vertaal gewoon wat de auteur vertelt.
Wat de auteur vertelt, en waar ik me ook altijd aan houd, heeft met historische OOP-principes te maken.
Het ding aan principes ... je houdt je er aan. Zelfs wanneer het je een beetje minder uitkomt.
Tot zover dit.
-----
Maar als je het toch wil weten ...
Als je wil weten waarom ik me er aan houd, heeft dit te maken met mijn C / C++ achtergrond.
Uiteindelijk komt het neer op geheugenbeheer.
In C moet je eerst geheugen vrij maken vooraleer je het kan gebruiken.
Bij elke variabele zeg je eerst welk dataType er in moet komen. Het datatype van een variabele kab achteraf niet veranderd worden.
Een integer neemt altijd even veel geheugen in. (het is wel afhankelijk van de compiler-versie en het aantal bit van je computer...), bv. 2 byte.
Een (double) float neemt 4 byte in. ...
Je weet altijd op voorhand precies hoeveel geheugen je gebruikt.
Iets speciaals daarbij is de string. Je weet uiteraard op voorhand niet hoe lang een tekst zal zijn.
Dus, is er een Char pointer. Dit is zoals een windows-snelkoppeling. Het bevat niet de tekst zelf, maar bevat een adres waar je de tekst kan vinden.
Een string is dan een ketting van aaneengeschakelde char's.
Bon, een voorbeeld, in C
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
class mijn_klasse {
private:
int score; // 2 byte
float gemiddelde // 4 byte
char* uitleg; // 2 byte pointer, die een adres kan bevatten naar een string
public:
mijn_klasse() { // constructor
uitleg = malloc(10 * sizeof(char)); // gaat ruimte alloceren (vrij maken) ter grootte van 10 karakters
}
}
private:
int score; // 2 byte
float gemiddelde // 4 byte
char* uitleg; // 2 byte pointer, die een adres kan bevatten naar een string
public:
mijn_klasse() { // constructor
uitleg = malloc(10 * sizeof(char)); // gaat ruimte alloceren (vrij maken) ter grootte van 10 karakters
}
}
Zolang de constructor niet is aangeroepen, weet je precies hoe veel geheugen het object vraagt. Namelijk 8 byte, in dit geval.
Code (php)
1
2
3
2
3
mijn_klasse a; // declareren van a.
print sizeof(a) ; // zat 8 byte zeggen
a = new mijn_klasse();// nu pas worden die 10 extra karakters ingenomen. Nu pas worden de int en float klaar gemaakt zodat ze kunnen gebruikt worden.
print sizeof(a) ; // zat 8 byte zeggen
a = new mijn_klasse();// nu pas worden die 10 extra karakters ingenomen. Nu pas worden de int en float klaar gemaakt zodat ze kunnen gebruikt worden.
Vergeet niet: Programma's draaien lang. Gedurende minuten. Php niet; dat draait maar x aantal microseconden.
In programma's is het dus relevant dat een object pas geheugen gaat vrijmaken net vooraleer je ze nodig hebt.
Dat is, volgens mij, de hoofdreden die aan de basis ligt van dit principe.
Gewijzigd op 10/09/2013 11:57:58 door Kris Peeters
Nou, in ieder geval bedankt voor de uitleg :). Nuttige info! Ken zelf geen C dus leerzaam is het zeker. Ben en was het overigens ook volledig met je eens hoor, maar vind het over het algemeen belangrijk om informatie zo ver mogelijk te ontleden, opdat iedereen die 't leest 't ook volledig snapt en 't niet alleen maar aan hoeft te nemen.