Wiki: Mathe und Info

Unterrichtsmaterialien für Mathematik und Informatik

Benutzer-Werkzeuge

Webseiten-Werkzeuge


info:sek-ii:q1:oop:l2-sichtbarkeit

Sichtbarkeit von Klassenelementen

Was versteht man eigentlich unter dem Geheimnisprinzip?1)
Wenn man die Motorhaube eines neueren Autos öffnet, dann sieht man recht wenig vom Motor. Einblick in das eigentliche Geschehen im Motor hat man nicht, wesentliche Teile des Motors werden sogar durch Abdeckungen schwer zugänglich gemacht. Man kann allenfalls überprüfen, ob man genug Öl oder Bremsflüssigkeit hat. Diese Vorgehensweise, den Motor eines Autos nur noch für Spezialisten zugänglich zu machen, wird ganz bewusst von den Autobauern gewählt. Ein Motor ist heutzutage so kompliziert, dass Laien keine Veränderungen daran vornehmen sollen.

Beim Autobau wird somit - zumindest in bestimmten Bereichen - das Geheimnisprinzip angewandt. Bestimmte Eigenschaften des Motors können nur über speziell hierfür vorgesehene Schnittstellen ermittelt werden. So kann der aktuelle Ölstand nur an einem hierfür vorgesehenen Messstab abgelesen werden. Änderungen am aktuellen Motorzustand können direkt ebenfalls nur an bestimmten hierfür vorgesehenen Stellen vorgenommen werden. Motoröl lässt sich nur in die hierfür vorgesehene Öffnung einfüllen. Alles weitere über das Innere des Motors bleibt für den normalen Autofahrer unzugänglich und in diesem Sinne geheim.

Bei der objektorientierten Software-Entwicklung geht man v(ÖL)lig analog vor.

Fachkonzept Datenkapselung
Software-Objekte (als Programmeinheiten) werden so konzipiert, dass Details über den inneren Aufbau verborgen werden und Änderungen von Objektzuständen nur über dafür vorgesehene Methoden erfolgen können. Das Verbergen des inneren Aufbaus wird realisiert, indem man keinen direkten Zugriff auf die Attribute zur Verwaltung der internen Daten eines Objekts ermöglicht. Man nennt diese Vorgehensweise auch Datenkapselung.
Man geht also auch hier nach dem Geheimnisprinzip vor. Software-Objekte sollen - genau wie Automotoren - von Benutzern nur in der vorgesehenen Weise genutzt werden, keinesfalls soll die interne Struktur durch Benutzer verändert werden. Das hat den Vorteil, dass ein Objekt als Software-Baustein genau das Verhalten hat, das von den Entwicklern des Bausteins realisiert wurde.
Zugriffsmodifikatoren / Zugriffsrechte
Um interne Daten kapseln zu können, werden Zugriffsmodifikatoren / Zugriffrechte festgelegt. Der Entwickler einer Klasse hat die Möglichkeit, Attribute und Methoden einer Klasse als öffentlich oder privat zu deklarieren. Lesende und schreibende Zugriffe auf Attribute bzw. Methoden eines Objekts sind nur möglich, wenn diese öffentlich sind. Private Attribute bzw. Methoden können dagegen nur bei der Implementierung der betreffenden Klasse benutzt werden.
Klasse Mensch

In der dargestellten Klasse Mensch ist ein sehr einfaches Modell implementiert, bei dem ein Mensch nach der Erzeugung ein zufälliges Alter besitzt.

class Mensch {
  int alter;
 
  Mensch() {
    alter = int(random(100));
  }
}

Macht euch klar, dass das Attribut alter nicht geschützt ist, indem ihr in der Direkteingabe einen Menschen erstellt, und sowohl lesend als auch schreibend auf das Attribut zugreift. Zur Ausgabe des Attributs könnt ihr die Funktion println verwenden. Diese gibt den Wert in der Konsole aus (Fenster unten in der IDE).

Mensch m1 = new Mensch();
 
m1.alter = 250;
 
println("Alter: " + m1.alter);
Getter und Setter / Spezielle Zugriffsmethoden

Verfolgt man die Strategie, alle Attribute als privat zu deklarieren, so besteht keine Möglichkeit, direkt schreibend oder lesend auf Attributwerte zuzugreifen. Um dennoch kontrollierten Zugriff zu erlauben, werden spezielle öffentliche Zugriffsmethoden, die sogenannten getter und setter, bereitgestellt. Das Klassendiagramm wird daher um solche Zugriffsmethoden erweitert:

Im Klassendiagramm werden die Zugriffsrechte auf die Attribute und Methoden je nach Notation unterschiedlich dargestellt. In den hier verwendeten Beispielen werden öffentliche Elemente mit einem grünen, ausgefüllten Kreis ($\color{green}{\bullet}$) und private Elemente mit einem roten, leeren Quadrat ($\color{red}{\square}$) gekennzeichnet.

Muss man UML-Diagramme händisch erstellen, verwendet man die Symbole + für öffentlich und - für privat. Außerdem kann man dann bestimmte Formatierungen weg lassen.

"Professionelles" UML-Diagramm
MenschintalterMensch()intgetAlter()voidsetAlter(intalter)
"per Hand" erstelltes UML-Diagramm
Mensch-intalter+Mensch()+intgetAlter()+voidsetAlter(intalter)

Die Methode setAlter(int alter) benutzt man, um den Wert des Attributs zu ändern. Wird dabei z.B. ein unsinniger Wert als Parameter übergeben, so kann dies von der Methode entsprechend behandelt werden. Möchte man lesenden Zugriff auf ein Attribut erlauben, dann muss ebenfalls eine Methode dazu bereitgestellt werden. In diesem Fall liefert getAlter() einfach den Wert des Attributes zurück.

// Beispielimplementation
 
int getAlter() {
  return this.alter;
}
 
void setAlter(int alter) {
  if (alter > 0) {
    this.alter = alter;
  }
}
Getter und Setter

Ändere den Code so ab, dass ein direkter, unkontrollierter Zugriff darauf nicht mehr möglich ist. Ergänze eine get- und eine set-Methode so, dass das Alter erfragt und geändert werden kann. Beim Abfragen des Alters soll der Wert 18 zurück gegeben werden, falls das Alter unter 18 ist. Ansonsten soll das tatsächliche Alter zurück gegeben werden. Beim Setzen des Alters sollen nur positive Werte im Bereich von 0 bis 100 möglich sein. Bei Eingabe eines ungültigen Wertes soll das Alter auf 0 gesetzt werden.

Private oder Public?
Stilfrage
Oft erscheint die Konvention Attribute als privat zu definieren überflüssig. In vielen Fällen wird man get- und set-Methoden schreiben, die nichts anderes machen als den Attributwert zurück zu geben oder zu überschreiben. Dennoch sollte man sich an diese Konvention halten. Begründet warum dies eine gute Idee ist. Überlegt euch dazu, wie sich die Benutzung einer Klasse ändert, wenn man im Nachhinhein bemerkt, dass beim Ändern von Attributwerten nur bestimmte Werte zugelassen werden sollten.
1)
Inhalt dieser Seite von inf-schule.de unter CreativeCommons BY-SA 3.0 - teilweise leicht abgewandelt
info/sek-ii/q1/oop/l2-sichtbarkeit.txt · Zuletzt geändert: 2023-12-07 16:48 von yannik.wehr