Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Entwurfsprinzip 3.3.2 (Punktnotation) Alle Aufrufe von Funktionen, Prozeduren und Komponentenzugriffen<br />
auf ein Objekt werden in Eiffel einheitlich in <strong>der</strong> Notation entity.operation(argumente) ausgedrückt.<br />
Eine Operation entity.operation(argumente) greift auf ein Objekt über den Verweis zu, <strong>der</strong> durch entity<br />
bezeichnet wird. Damit dies fehlerfrei geschehen kann, muß das zugehörige Objekt natürlich existieren, d.h. <strong>der</strong><br />
zu entity gehörende Verweis darf nicht leer sein. Dies gilt für alle Operationen, insbeson<strong>der</strong>e auch für Zugriffe<br />
auf Komponenten. Der Versuch, auf ein Merkmal eines leeren Verweises zuzugreifen, ist einer <strong>der</strong> häufigsten<br />
Ursachen für Laufzeitfehler, die bei <strong>der</strong> Eiffel-Programmierung auftauchen.<br />
In “klassischen” Programmiersprachen wie Pascal wird anstelle von entity.operation(argumente) die Notation<br />
operation(objekt,argumente) benutzt. Bei einer ersten Betrachtung scheint diese Form symmetrischer<br />
zu sein als die von Eiffel. Jedoch benutzt Pascal beim Zugriff auf Komponenten eines Verbundes ebenfalls die<br />
Punktnotation und verlangt also vom Benutzer, die Unterscheidung zwischen Zugriff und Funktion vorzunehmen.<br />
Eiffel ist da einheitlicher. Der spezielle Grund für die Punktnotation, bei <strong>der</strong> das Objekt am Anfang<br />
jedes Aufrufs genannt wird, ist wie<strong>der</strong>um die objektorientierte Denkweise: es ist das wichtigste zu sagen,<br />
auf welchem Objekt eine Operation ausgeführt wird. Aus diesem Grunde soll das Objekt durch die Notation<br />
beson<strong>der</strong>s hervorgehoben werden.<br />
3.3.2 Definition von Routinen<br />
Nachdem wir gesehen haben, wie man Routinen aufruft, wollen wir nun zeigen, wie man sie definiert. Dazu<br />
muß als wichtigstes herausgehoben werden, daß Routinen prinzipiell nur als Dienstleistungen einer Klasse<br />
definiert werden können und nicht etwa als unabhängige “Unterprogramme”. 9 Routinen werden daher gleichberechtigt<br />
zu den Attributen einer Klasse als Features aufgeschrieben. Abbildung 3.10 zeigt eine abstrahierte<br />
Implementierung <strong>der</strong> in Beispiel 3.3.1 benutzten Routinen innerhalb <strong>der</strong> Klasse PERSON.<br />
class PERSON<br />
feature<br />
name, vornamen: STRING;<br />
geburtsjahr, todesjahr: INTEGER;<br />
nationalität: STRING;<br />
vater, mutter: PERSON;<br />
anzahl vornamen: INTEGER is -- Anzahl <strong>der</strong> Vornamen bestimmen<br />
do<br />
Result := Anzahl <strong>der</strong> Vornamen in vornamen<br />
end; -- anzahl vornamen<br />
alter(jahr:INTEGER): INTEGER is -- Alter im gegebenen Jahr bestimmen<br />
do<br />
Result := jahr - geburtsjahr<br />
end; -- alter<br />
setze todesjahr(jahr:INTEGER) is -- todesjahr auf jahr setzen<br />
do<br />
todesjahr := jahr<br />
end -- setze todesjahr<br />
end -- class PERSON<br />
Abbildung 3.10: Klassendefinition mit Routinen<br />
Neben den Attributen name, vornamen, geburtsjahr, todesjahr, nationalität, vater und mutter<br />
enthält die Klasse PERSON drei Routinen, die man an dem Vorhandensein <strong>der</strong> Schlüsselwortfolge is...do...end<br />
erkennt. Diese Folge begrenzt den Rumpf einer Routine. Eine Routine kann formale Argumente in Klammern<br />
9 Die im Abschnitt 3.3.4 vorgestellten Operationen, die auf allen Klassen Gültigkeit haben, sind daher in Eiffel als Dienstleistungen<br />
einer Klasse ANY realisiert, die ihre Konzepte auf alle Klassen vererbt.