Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Viel sinnvoller ist es, bei <strong>der</strong> Beschreibung einer Klasse noch nicht an die konkrete Implementierung zu denken<br />
son<strong>der</strong>n eine möglichst abstrakte Beschreibung <strong>der</strong>jenigen Informationen zu geben, die wirklich von Interesse<br />
sind. Die Klasse <strong>der</strong> Autoren, zum Beispiel, soll uns Namen, Vornamen, Nationalität, Geburts- und Todesjahr<br />
– falls vorhanden – liefern und umgekehrt zulassen, daß das Todesjahr nachgetragen wird. Alle an<strong>der</strong>en<br />
Informationen dürfen dagegen nicht verän<strong>der</strong>t werden – namensrechtliche Probleme bei Heirat seien außer<br />
Acht gelassen.<br />
Wir stehen also vor <strong>der</strong> Aufgabe, einerseits eine vollständige, genaue und eindeutige Beschreibung einer Klasse<br />
von Objekten zu geben, gleichzeitig aber eine Überspezifikation zu vermeiden. Die Antwort auf dieses Problem<br />
liegt in <strong>der</strong> Theorie <strong>der</strong> abstrakten Datentypen.<br />
3.2.1 Abstrakte Datentypen<br />
Ausgangspunkt <strong>der</strong> Theorie <strong>der</strong> abstrakten Datentypen ist die Feststellung, daß für ein Softwaresystem,<br />
welches die Objekte einer bestimmten Klasse benutzt, weniger die konkrete Realisierung relevant ist, als<br />
die Art <strong>der</strong> Dienstleistungen, welche es bietet. So bietet zum Beispiel die Klasse <strong>der</strong> Autoren an, Namen,<br />
Vornamen, Nationalität, Geburts- und Todesjahr, und ggf. auch das Alter eines Autors abzufragen und das<br />
Todesjahr zu verän<strong>der</strong>n. Wie diese Dienste realisiert werden – also ob z.B. das Alter des Autors berechnet<br />
o<strong>der</strong> gespeichert wird – ist ziemlich unbedeutend. Wichtig ist dagegen, daß diese Dienstleistungen gewisse<br />
Eigenschaften erfüllen, auf die sich das System verlassen darf, wie zum Beispiel, daß das Alter eines Autors<br />
eine ganze Zahl ist, die größer als Null ist (wahrscheinlich wäre 8 sinnvoller, aber man kann ja nie wissen).<br />
Eine abstrakte Datentypspezifikation beschreibt daher eine Klasse nicht durch die konkrete Realisierung son<strong>der</strong>n<br />
durch eine Liste von Dienstleistungen, die für die Außenwelt verfügbar sein sollen, und durch die Eigenschaften<br />
dieser Dienstleistungen. 4 Auf diese Art wird sichergestellt, daß die Außenwelt auf die Objekte einer<br />
Klasse nur mithilfe <strong>der</strong> bekanntgegebenen Dienstleistungen zugreifen kann und nicht etwa über die Implementierung(,<br />
welche sich ja möglicherweise än<strong>der</strong>n kann). Durch diese Form <strong>der</strong> Datenkapselung wird sichergestellt,<br />
daß sich jede Komponente eines Softwaresystems ausschließlich um ihre eigenen Geschäfte kümmert und in<br />
die Aufgaben <strong>der</strong> an<strong>der</strong>en nicht hineinpfuscht. Nur dieses Geheimnisprinzip garantiert die Integrität eines<br />
Moduls in einer Umwelt ständiger Verän<strong>der</strong>ungen.<br />
Für eine vollständige formale Spezifikation eines abstrakten Datentyps sind vier Fragen zu beantworten:<br />
• Welche Typen werden eingeführt?<br />
• Welche Funktionen (Dienstleistungen) werden eingeführt?<br />
• Was sind die Vorbedingungen für die Anwendbarkeit <strong>der</strong> Funktionen?<br />
• Welche Axiome (Eigenschaften) erfüllen die Funktionen?<br />
Typen und Funktionen beschreiben die Syntax des abstrakten Datentyps, Vorbedingungen und Axiome seine<br />
Semantik. Diese Beschreibung wird in einer rein mathematischen Form gegeben, um die gewünschte Genauigkeit<br />
und Eindeutigkeit sicherzustellen.<br />
Wir wollen die Bedeutung dieser vier Teile am Beispiel <strong>der</strong> vollständigen Spezifikation endlicher Listen<br />
(vgl. Abschnitt 2.3.5) illustrieren. Eine Liste wird als Struktur betrachtet, die folgende Dienste zur Verfügung<br />
stellt: trage ein neues Element ein (cons), greife auf das erste Element zu (head), entferne das erste Element<br />
(tail), prüfe ob die Liste leer ist (empty), erzeuge eine neue Liste (new), usw. Listen und ihre Dienstleistungen<br />
werden in sehr vielen Anwendungen benötigt und können auf viele verschiedene Arten implementiert werden,<br />
je nachdem, ob über die obengenannte Dienstleistungen hinaus noch weitere Dienstleistungen wie z.B. das<br />
Zusammensetzen von Listen (& in Abschnitt 2.3) angeboten werden sollen o<strong>der</strong> nicht.<br />
4 Anstelle von “Dienste” sagt man auch “Operationen” o<strong>der</strong> “Merkmale” (in Englisch “features”).