Twitter und Facebook-Anbindung
X
Tweet Follow @twitterapi
!!! Anbindung an twitter und facebook öffnen !!!

Wenn Ihnen mein Online-Buch gefällt,
dann bedanken Sie sich doch mit einer kleinen Spende...

17 Ein paar Philosophien

17 Ein paar Philosophien

Bevor ich weiter mache, werde ich auf ein paar Konventionen eingehen, welche allgemein üblich sind. Sie brauchen sich zwar nicht dran zu halten, aber ich lege es Ihnen wieder ans Herz, zumal man im Internet viele Projekte findet, welche genau diesen Richtlinien folgen und wenn Sie die Grundideen der Konventionen verstehen, blickt Sie auch schneller durch andere Quelltexte durch.

Zum Seitenanfang
Zum Inhaltsverzeichnis

17.1 Was ist privat und was ist public

17.1 Was ist privat und was ist public

Wie bereits erwähnt, gibt es für Klassen die Möglichkeit, Attribute und Methoden zu veröffentlichen oder sie zu verstecken (Information hiding). Dies geschieht mit den Modifikatoren "private" (verstecken) und "public" (veröffentlichen). Mit verstecken ist gemeint, dass man zwar innerhalb der Methoden einer Klasse, auf die Sachen zugreifen kann, aber von Außen nicht. Wenn man sich also ein Objekt der Klasse erzeugt, kann man nur auf Attribute und Methoden zugreifen, welche öffentlich sind. Aber eigentlich ist das nicht ganz richtig, da man nur im Kontext der Klasse darauf zugreifen kann. Baut man sich also einen Kopierkonstruktor, so kann man auch auf die privaten Attribute des übergebenen Objektes zugreifen, obwohl es so scheint, als würde man von außen zugreifen.

Nun, warum macht man dies? Der Grund ist zum einen, weil man so die Schnittstellen schmaler machen kann, da interne Verwaltungsfunktionen, die Außenwelt nicht interessiert und zum anderen ist es oft nicht erwünscht, dass man einfach so Werte ändert, an welchen evtl. noch andere Sachen mit dran hängen. Beispielsweise könnte es sein, dass bestimmte Werte nicht erlaubt sind oder, um auf die Computerspiele zurück zu kommen, wäre es ungünstig, die Farbe eines Autos zu ändern, ohne die neue Farbe dann auch zu Zeichnen. Die Vorteil die sich daraus ergeben sind, dass der Programmierer, welcher dann die Klasse verwenden soll, weniger falsch machen kann und seine Codevervollstädigung nur die Sachen anzeigt, die er braucht bzw. verwenden soll.

Aus diesen Gründen, macht man Attribute in der Regel alle privat. Methoden werden nur dann veröffentlicht, wenn sie auch wirklich dazu dienen, ein Objekt von außen zur Arbeit zu bewegen. Meistens rufen diese dann private Methoden auf, welche die eigentliche Arbeit verrichten.

Man braucht nicht vor jedes Attribut und vor jede Methode "private" oder "public" schreiben, da solche Anweisungen immer so lange gelten, bis etwas anderes vereinbart wird. Prinzipiell kann man zwar private und öffentliche Sachen mischen, dies ist aber weder üblich, noch fördert es die Lesbarkeit. Somit fasst man jene Attribute und Methoden in Gruppen zusammen.

Wenn man weder "private" noch "public" schreibt, so ist alles automatisch privat (kann aber von Compiler zu Compiler abweichend sein. MS Visual C++ Compiler macht es so). Dies sollte man aber tunlichst unterlassen, da es später zu ungewollten Missverständnissen kommen kann und oder irgendwann aus privaten Sachen, auf einmal öffentliche werden, weil jemand ein paar Zeilen darüber, eine öffentliche Methode deklariert.

In UML stellt man private Attribute und Methoden mit einem "-" dar, wohingegen den öffentlichen Sachen ein "+" vorangestellt wird. Des weiteren gibt es noch die s.g. geschützten Attribute und Methoden, auch "protected" genannt, welche mit einer "#" gekennzeichnet werden. Diese geschützten Sachen spielen aber erst eine Rolle, wenn es um die Vererbung geht und deshalb werde ich erst im übernächsten Kapitel näher darauf eingehen. Ganz grob kann ich aber jetzt schon verraten, dass sich die geschützten Attribute und Methoden, fast so wie die privaten verhalten.

Zum Seitenanfang
Zum Inhaltsverzeichnis

17.2 Getter und Setter

17.2 Getter und Setter

Da man also Attribute üblicherweise privat macht, braucht man gelegentlich trotzdem Möglichkeiten, diese von Außen zu modifizieren. Dafür implementiert man s.g. Get - und Set-Methoden, wobei Set-Methoden jene sind, welche neue Werte setzen und die anderen um die internen Werte abzurufen.

Für die Beispielklasse von vorhin, wäre es also besser gewesen, "m_iZahl1" und "m_iZahl2" privat zu machen und entsprechende Getter und Setter zu schreiben. Für das kleine Testprojekt macht dies nicht viel Sinn, zumal es ein viel höherer Aufwand ist, aber trotzdem werde ich Ihnen dies mal zeigen. Deswegen überarbeite ich die Header-Datei und das Ergebnis sieht dann wie folgt aus.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
					
class CTestKlasse {
	public:
		// Konstruktor
		CTestKlasse(int iValue1, int iValue2);
		// Destruktor
		~CTestKlasse(void);

		// Gibt interne Werte aus
		void	Ausgabe(void);

		int	GetZahl1(void);
		void	SetZahl1(int iValue);
		int	GetZahl2(void);
		void	SetZahl2(int iValue);

	private:
		// Speichert eine Zahl
		int m_iZahl1;
		// Speichert eine andere Zahl
		int m_iZahl2;
};
					

Wie Sie klar sehen, sind die Attribute jetzt in den privaten Bereich verlagert worden und im öffentlichen Bereich, sind jetzt vier neue Methoden hinzugekommen.

Nun fehlen noch die Implementierungen in der CPP und deshalb hier kurz der Quelltext, welcher ergänzt wird.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
					
// Gibt den Wert von Zahl1 zurück /////////////////////////////////////////////
int CTestKlasse::GetZahl1(void) {
	return this->m_iZahl1;
} // GetZahl1 /////////////////////////////////////////////////////////////////


// Ändert den Wert von Zahl1 //////////////////////////////////////////////////
void CTestKlasse::SetZahl1(int iValue) {
	this->m_iZahl1 = iValue;
} // SetZahl1 /////////////////////////////////////////////////////////////////



// Gibt den Wert von Zahl2 zurück /////////////////////////////////////////////
int CTestKlasse::GetZahl2(void) {
	return this->m_iZahl2;
} // GetZahl2 /////////////////////////////////////////////////////////////////


// Ändert den Wert von Zahl2 //////////////////////////////////////////////////
void CTestKlasse::SetZahl2(int iValue) {
	this->m_iZahl2 = iValue;
} // SetZahl2 /////////////////////////////////////////////////////////////////
					
Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012