Anwendungsentwickler-Podcast #6: Häufige Fragen im Fachgespräch – Kapselung

In der sechsten Episode meines Anwendungsentwickler-Podcasts setze ich meine Reihe über häufige Fragen im Fachgespräch fort. Dieses Mal geht es um die Kapselung im Rahmen der Objektorientierung.

Probeabo bei Audible (Affiliate)

Beantwortung der Frage im Fachgespräch

  • Objekte bilden Dinge der realen Welt ab. Sie haben Eigenschaften und Funktionen. Beispiel: Person mit Eigenschaft Geburtstag und Funktion gruesse().
  • In der Objektorientierung nennt man die Eigenschaften Attribute und die Funktionen Methoden.
  • Klassen sind Baupläne für Objekte. Sie definieren, welche Attribute und Methoden jede Instanz der Klasse – das Objekt – hat. Die konkreten Ausprägungen der Werte der Attribute – der Zustand des Objekts – kann (muss aber nicht) bei jedem Objekt unterschiedlich sein.
  • Objekte müssen zu jeder Zeit in einem gültigen Zustand sein, d.h. die Attribute müssen gültige Werte haben.
    • Jedes Objekt ist dafür verantwortlich, seinen gültigen Zustand beizubehalten. Daher muss es den Zugriff auf seine Attribute einschränken können.
  • Außerdem sollte ein Objekt nicht nach außen hin preisgeben, wie es funktioniert, sondern nur, was es macht.
  • Um den Zugriff auf Attribute und Methoden zu steuern, können Sichtbarkeitsmodifizierer verwendet werden.
    • private = nur die Klasse selbst hat Zugriff, protected = die Klasse selbst und von ihr abgeleitete Klassen haben Zugriff, public = alle haben Zugriff.
  • Der Zugriff auf Attribute von außen sollte ausschließlich über spezielle Methoden – Getter und Setter – möglich sein.
    • Setter erlauben die Prüfung der zu setzenden Werte und sorgen damit dafür, dass das Objekt immer in einem gültigen Zustand ist. Beispiel: Geburtsdatum wird vor dem Setzen auf ein gültiges Datum ab 01.01.1900 geprüft.
    • Getter erlauben die Berechnung von Werten, anstatt sie in Attributen abzulegen. Beispiel: Alter einer Person wird zur Laufzeit anhand des Attributs Geburtsdatum ermittelt.

Tiefergehende Diskussion

  • In Java gibt es noch den Sichtbarkeitsmodifizierer package-private (kein expliziter Modifizierer angegeben) = nur die Klasse selbst und Klassen im gleichen Package haben Zugriff.
  • Objekte kapseln Attribute und die zugehörigen Methoden, d.h. die Methoden sollten die Attribute verwenden.
    • Optimalerweise verwenden alle Methoden einer Klasse alle Attribute der Klasse. Man spricht dann von einer hohen Kohäsion.
  • Dieses Prinzip wird auch Single Responsibility Principle genannt: „There should never be more than one reason for a class to change.“
  • Im Vergleich zur prozeduralen Programmierung hat die Kapselung von Attributen und den zugehörigen Methoden den Vorteil der besseren Wiederverwendbarkeit. Eine Klasse kann als Ganzes (wie eine Kapsel) verwendet werden.

Tipps für die Entwicklerpraxis

  • Daumenregel: Alle Attribute private machen.
  • Auch wenn es ggfs. nicht nötig ist, die Sichtbarkeitsmodifizierer immer explizit angeben, damit der Code leichter zu verstehen ist.
  • Getter und Setter erst einführen, wenn sie wirklich benötigt werden (YAGNI).
  • Getter und Setter können von der meisten IDEs generiert werden.
  • In C# werden anstatt Gettern und Settern Eigenschaften (Properties) verwendet.

Literaturempfehlungen

Links

Navigation der Serie<< Anwendungsentwickler-Podcast #2: Häufige Fragen im Fachgespräch – ObjektorientierungAnwendungsentwickler-Podcast #8: Häufige Fragen im Fachgespräch – Vererbung >>

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax