Information Hiding und Datenkapselung

Kürzlich habe ich auf einer Folie mit dem Titel “Information Hiding” gelesen, dass um diese zu erreichen der Zugriffsmodifizierer private eines der wichtigsten Hilfsmittel sei. Für mich ein weiterer Beleg, dass die Mächtigkeit und der Gewinn der beiden Konzepte ‘Information Hiding’ und ‘Encapsulation’ häufig zu wenig verstanden und differenziert wird. Viele Entwickler verwenden die Begriffe sogar synonym. Tatsächlich sind sie eng miteinander verwandt, lassen sich aber dennoch wunderbar differenzieren. Und letzteres nicht etwa aus Spitzfindigkeit, sondern mit ganz konkretem Nutzen für das konkrete Design. Wer also der Meinung ist, indem er/sie ein Attribut einer Klasse mit private markiere hätte er/sie dem Information Hiding (und der Encapsulation) genüge getan, sollte unbedingt weiterlesen!

In welcher Beziehung stehen Information Hiding und Datenkapselung zueinander? Die meisten Leser dürften mit den zwei ebenso prominenten Begriffen Kohäsion und Kopplung vertraut sein:
Die Kohäsion beschreibt die Zusammenfassung und den impliziten Zusammenhalt von Dingen, die wirklich (nicht sinnvoll weiter trennbar) zusammen gehören. Ein typisches Beispiel sind die Attribute name und vorname, welche zu einer Klasse Person gehören. Die Datenkapselung ist nichts anderes als die Technik, welche diese zwei Attribute in einer Klasse zusammenfasst und mit entsprechenden Zugriffsmodifizierern und -methoden kapselt! Diese Kapslung soll stark und ausgeprägt sein, und darum strebt man auch eine hohe Kohäsion an.
Die Kopplung hingegen richtet den Blick nach “aussen”: Hier strebt man das Ziel an, dass in sich stark gekapselte Klassen möglichst schwache und wenige Beziehungen untereinander (zu anderen Klassen) haben. Die Implementation der einzelnen Klassen soll weitgehend “geheim” sein, so dass man sich nicht zu stark von Implementationsdetails abhängig machen kann. Das wiederum erhöht das Potential der Wiederverwendung und der Austauschbarkeit. Und das alles erreicht man – welche Überraschung – durch ein möglichst starkes Information Hiding in und zwischen den einzelnen Klassen! Das Puzzle der Begriffe passt also wunderbar zusammen!

Für Leute die mit einem Blick auf Quellcode etwas besser verstehen, empfehle ich das folgende, zwar (sehr) stark vereinfachtes Beispiel, das die Konzepte aber wunderbar deutlich differenziert:

class NoEncapsulationOrInformationHiding {
   public ArrayList widths = new ArrayList();
}

class EncapsulationWithoutInformationHiding {
   private ArrayList widths = new ArrayList();

   public ArrayList getWidths(){
      return widths;
   }
}

class InformationHidingWithoutEncapsulation {
   public List widths = new ArrayList();
}

class EncapsulationAndInformationHiding{
   private ArrayList widths = new ArrayList();

   public List getWidths(){
      return widths;
   }
}

Das Beispiel ist dem empfehlenswerten Artikel http://c2.com/cgi/wiki?EncapsulationIsNotInformationHiding entnommen. Aus ihm wird ein weiterer Aspekt deutlich: Während Encapsulation wesentlich durch das technische Hilfsmittel der Zugriffsmodifizierer umgesetzt wird, setzt man das Konzept des Information Hiding mehrheitlich durch reine Designentscheide um: Einerseits durch die Wahl der geeigneten Datentypen, und andererseits durch die zur Verfügung gestellten Methoden, wobei das explizite “weglassen” von Methoden das Information Hiding meist am Effektivsten verbessert. Zur weiteren Vertiefung empfehle ich folgende Artikel:

Und als ein Gedankenspiel empfehle ich die Modellierung einer Klasse welche einen Temperaturwert modelliert und repäsentiert. Sehr schnell wird man die Datenkapelung erkennen: Das Attribut für die Temperatur wird man private deklarieren, und dann eine öffentliche Zugriffsmethode zur Verfügung stellen. Das klingt sehr stark nach einem bekannten Refactoring in der IDE: “Generate Getter/Setter” (oder ähnlich). Das ist sehr einfach und wird auch von vielen Entwicklern schnell verstanden.
Das Prinzip des Information Hiding hingegen beginnt erst an der Stelle, an welcher die simplen Refactoring nicht mehr weiterhelfen: Dann nämlich, wenn man intern die Temperatur in Kelvin speichert, und nach aussen die beiden öffentlichen Methoden getTempInCelcius() und getTempInFahrenheit() anbietet… You got it!

Leave a Reply

Your email address will not be published. Required fields are marked *