Behandelde onderwerpen
In andere files vind je informatie over:
[TODO: links aanvullen]
Een Abstract Data Type (ADT) is:
Tot nu toe hebben we, om een plaats op een scherm aan te geven, steeds twee integer waarden gebruikt. Dit leidt tot lange parameter- en attribuutlijsten, en als we willen rekenen met zulke coördinaten (bv. twee coördinaten bij elkaar optellen) dan moeten we aparte bewerkingen doen op de x en y elementen.
class line {
private:
int start_x;
int start_y;
int end_x;
int end_y;
public:
. . .
// move the line
void shift( int x, int y ){
start_x += x;
start_y += y;
end_x += x;
end_y += y;
}
};
Codevoorbeeld 06-01 - Een lijn klasse met een shift() functie
Om een plaats op een scherm aan te geven is het handig om een vector klasse te maken die een x- en y-coördinaat bevat. Een lijn kan worden geimplementeerd met twee van zulke vectoren:
N.B. De hier geintroduceerde vector-klasse is een andere vector dan de std::vector<>. Misschien is het goed om van onze ‘lijn-vector’ in de toekomst een ‘lijn-coordinate’ klasse te maken? Het gebruik van meerdere vector-klassen maakt het begrip ‘namespace’ wel snel belangrijk en duidelijk.
Image: UML voor een lijn klasse die twee vectoren bevat
class vector {
private:
int x;
int y;
public:
vector( int x, int y ):
x( x ), y( y )
{}
};
class line {
private:
vector start;
vector end;
. . .
};
Codevoorbeeld 06-02 - Een vector klasse, en een lijn klasse met vectoren i.p.v. losse integers
Omdat de x en y private zijn moeten we nog wat aanpassingen maken om er nuttig gebruik van te kunnen maken. Een manier is om zogenaamde getter en setter methoden toe te voegen: klasse functies die als enige taak hebben de waarde van een privé attribuut op te halen of te wijzigen.
class vector {
private:
int x;
int y;
public:
. . .
int x_get(){ return x; }
int y_get(){ return y; }
void x_set( int new_x ){ x = new_x; }
void y_set( int new_y ){ y = new_y; }
};
vector a( 1, 2 ), b( 3, 4 );
// add b to a
a.x_set( a.x_get() + b.x_get() );
a.y_set( a.y_get() + b.y_get() );
Codevoorbeeld 06-03 - Vectoren bij elkaar optellen door middel van getters en setters
In plaats van het gebruik van getters en setters, kunnen we de attributen x en y publiek toegankelijk te maken. Dit maakt het werken met een locatie object veel makkelijker, maar het datatype is nu wel een belangrijk deel van zijn ‘abstractie’ kwijt:
De keuze tussen ofwel publieke attributen, ofwel getters en setters, is lastig. Er zijn in de software engineering verschillende meningen hierover, variërend van
Tips
Als je in een getter of setter meer doet dan alleen de waarde ophalen of wegschrijven, is het duidelijk dat je geen publieke attributen moet gebruiken. Als dat niet zo is, dan moet je het gemak van publieke attributen afwegen tegen de toekomstige flexibiliteit die getters en setters bieden. Helaas laat de toekomst zich lastig voorspellen.
Voor de vector klasse is besloten om de x en y attributen publiek te maken, omdat
N.B. Helemaal sluitend is dit argument niet, want op een kleine processor en met een klein scherm is het wellicht beter om ruimte te besparen door 8-bit waarden op te slaan in plaats van integers die minimaal 16 bit zijn. En op grotere systemen is het soms juist handiger om doubles te gebruiken voor schermcoördinaten, omdat je dan met meer dan pixel-nauwkeurigheid kan rekenen voor de plaats van een object.
class vector {
public:
int x;
int y;
. . .
};
vector a( 1, 2 ), b( 3, 4 );
// add b to a
a.x += b.x;
a.y += b.y;
Codevoorbeeld 06-04 - Vectoren bij elkaar optellen via publieke attributen