26.9 Zugriffsrechte und Zugriffsmethoden
Der Zugriff auf öffentliche (public) Variablen beziehungsweise auf für die Nachkommen lesbare Variablen (protected) soll vermieden werden. Damit verhindern wir verschiedene Probleme:
|
Eine öffentliche Variable widerspricht der Kapselung von Daten. Von außen kann jeder stets die Variable ändern, und dies kann zu Fehlern führen, die schwer zu finden sind. |
|
Die interne Repräsentation der Daten wird versteckt und erlaubt es, den Programmcode später noch einmal problemlos zu ändern. Die Klasse muss ihre Arbeitsweise verstecken und den Benutzer der Klasse nicht dazu zwingen, sein Programm immer der Klasse anzupassen. |
|
Auch protected-Variablen haben ihre Schwächen, da die abgeleitete Klasse auf diese Attribute direkt zugreifen kann. Die Basisklasse ist dann für immer an die Variablen gebunden und kann sie niemals in ihrer Bedeutung verändern oder gar auf sie verzichten, da die Variable ja von irgendeiner Unterklasse benutzt werden könnte. |
Diese Probleme können wir leicht umgehen, wenn wir zwei Dinge berücksichtigen:
|
Auf Variablen wird nur lesend zugegriffen. Da dies leider oft nicht streng genug durchgehalten wird, ist es empfehlenswert, für |
|
alle Änderungen an Variablen (auch wenn nur die erbende Klasse Elemente der Basisklasse verändert) Funktionen wie getAttribut() und setAttribut() einzuführen. |
26.9.1 Accessors/Zugriffsmethoden
Zugriffsmethoden erlauben uns, an die Attribute eines Objekts heranzukommen. Das Motiv für ihren Einsatz ist oben schon genannt worden. Die Funktionen getAttribut() und setAttribut() sind solche Accessoren. Die Vorsilben get(-Methode) und set(-Methode) sind auch als eine Art Präfix anzusehen, wie er in der ungarischen Notation vorgesehen ist. Ebenso ist es zweckmäßig, is als Vorsilbe anzusehen, die eine Wahrheitsabfrage macht; isChar() ist ein Beispiel für einen Accessor mit boolean-Ergebnis. Leider haben Accessoren den Nachteil, dass sie den Code aufblähen. Doch angesichts der erhöhten Flexibilität ist dies in Kauf zu nehmen. Wenn sich später einmal die Implementierung ändert, müssen die Programmzeilen nicht verändert werden. Dafür kann sich dann hinter der vermeintlich trivialen Funktion etwas ganz anderes verbergen.
Wenn wir Zugriffsfunktionen einführen, dann müssen wir natürlich auf die beabsichtigten Rechte für die darunter liegenden Attribute achten. Sollen diese nach außen sichtbar sein, so sind auch die Zugriffsfunktionen public. Sind die Werte nur für die Erben wichtig, so sollen die Funktionen protected deklariert werden. Nach Einführung der Zugriffsfunktionen werden die zugehörigen Objektvariablen private gesetzt.
Da die Einführung der Methoden oft sehr aufwändig ist, ist im Entwicklungsteam abzusprechen, ob nicht nur setXXX()-Methoden implementiert werden sollten. Lesender Zugriff kann ein Objekt nicht verändern und ist somit weniger gefährlich. Damit geben wir natürlich die Unabhängigkeit gegenüber der internen Implementierung der Klasse auf. Auf der anderen Seite bieten moderne Entwicklungsumgebungen Tastenkürzel an, mit denen zu einem Attribut automatisch die Zugriffsmethoden erstellt werden.
Allgemeines
Wir müssen versuchen, unseren Programmcode in den Funktionen so weit zu strukturieren, dass er nicht mehr als ein bis zwei Seiten lang ist. Ein längerer Text ist schwer zu durchschauen und bei der Fehlersuche schwerer zu testen. Jedoch ist ein langes switch mit vielen cases weniger schlimm als achtfach geschachtelte Schleifen und Fallunterscheidungen.
|