Title: Eiffel
1Eiffel
- Ein Vortrag im Rahmen des Seminars
- Programmiersprachen
Christian Niehaus
2Gliederung
- Entstehungsgeschichte von Eiffel
- Allgemeines zu Eiffel
- Besondere Aspekte von Eiffel
- Einfach- und Mehrfachvererbung
- Dynamisches Binden und Polymorphismus
- Selektiver Export von Features
- Programming by Contract
- Fehlerbehandlung und Exceptions
- Fazit
3Gliederung
- Entstehungsgeschichte von Eiffel
- Allgemeines zu Eiffel
- Besondere Aspekte von Eiffel
- Einfach- und Mehrfachvererbung
- Dynamisches Binden und Polymorphismus
- Selektiver Export von Features
- Programming by Contract
- Fehlerbehandlung und Exceptions
- Fazit
4Entstehungsgeschichte
- Entwickelt 1985 durch Bertrand Meyer und Jean
Marc Nerson - Namensgeber ist Gustave Eiffel, der Konstrukteur
des Eiffelturms - Streng objektorientierte Programmiersprache nach
Vorbild von Simula - Seit 1987 kommerzielle Vermarktung
- Heute zahlreiche frei verfügbare Eiffel-Compiler
im Internet
5Gliederung
- Entstehungsgeschichte von Eiffel
- Allgemeines zu Eiffel
- Besondere Aspekte von Eiffel
- Einfach- und Mehrfachvererbung
- Dynamisches Binden und Polymorphismus
- Selektiver Export von Features
- Programming by Contract
- Fehlerbehandlung und Exceptions
- Fazit
6Allgemeines
- Compiler-Sprache
- Gehört zur Klasse der objektorientierten Sprachen
- Programm als System miteinander interagierender
Klassen - Unterstützung von
- (Mehrfach-) Vererbung
- Dynamisches Binden
- Polymorphismus
- Datenabstraktion / Abstrakte Klassen
7Allgemeines
- Fünf Basistypen INTEGER, REAL, DOUBLE,
CHARACTER, BOOLEAN - Alle anderen Datentypen müssen als Klassen
realisiert werden - Automatische Speicherverwaltung
- Automatische Zuweisung von Speicherbereichen an
neu erstellte Objekte - Automatische Bereinigung des Speichers mittels
Garbage Collector
8Klassen
- Klasse besteht aus sog. Features
(Methoden/Funktionen, Variablen und Konstanten) - Alle Variablen sind Teil eines Objekts, keine
globalen Variablen - Auch Hauptprogramm in Form einer Klasse
class HELLO creation hello_world feature hello
_world is do print (Hello
World) end end
9Gliederung
- Entstehungsgeschichte von Eiffel
- Allgemeines zu Eiffel
- Besondere Aspekte von Eiffel
- Einfach- und Mehrfachvererbung
- Dynamisches Binden und Polymorphismus
- Selektiver Export von Features
- Programming by Contract
- Fehlerbehandlung und Exceptions
- Fazit
10Vererbung
- Kindklasse erbt die Features von Vaterklasse
- Immer Vererbung aller Features, kein selektives
Erben nur einzelner Features - Kindklasse ist konform zur Vaterklasse
Klasse AUTO ist konform zu Klasse FAHRZEUG Klasse
FAHRZEUG ist nicht konform zu Klasse AUTO Klasse
AUTO ist komform zu sich selbst Klasse FAHRZEUG
ist konform zu sich selbst
11Mehrfachvererbung
- Eine Klasse kann in Eiffel beliebig viele
Vaterklassen haben - Vererbungsgraph hat keine klassische Baumstruktur
mehr
class STUDENTISCHE_HILFSKRAFT inherit STUDENT,
LEHRSTUHLMITARBEITER ...
12Möglichkeiten der Feature-Übernahme
- Unveränderte Übernahme von geerbten Features
- Umbenennen von geerbten Features (rename)
- Redefinition von geerbten Features (redefine)
- Effecting von geerbten Features
- Zusammenfügen von geerbten Features (join)
- undefine von geerbten Features
13Umbenennen von Features
- Feature erhält einen neuen Namen, unter dem es
auch weitervererbt werden kann - Alter Name des Features kann anderweitig vergeben
werden - Keine Änderung der Funktionalität
- Mögliche Gründe
- Name eines geerbten Features passt vom Sinn her
nicht mehr in die Kindklasse - Namenskonflikt durch Mehrfachvererbung
14Beispiel rename
class STUDENTISCHE_HILFSKRAFT inherit
STUDENT rename personennummer as
matrikelnummer inherit LEHRSTUHLMITARBEITER ren
ame personennummer as mitarbeiternummer end ....
15Redefinition von Features
- Änderung von
- Implementierung
- Signatur
- Zusicherungen eines Features
- Neue Signatur muss konform zur alten sein, d.h.
- Anzahl Parameter darf sich nicht ändern
- Neue Typen von Parametern und Rückgabewert müssen
konform zu bisherigen Typen sein
16Beispiel Redefinition
class KREIS inherit ELLIPSE redefine berechn
e_umfang end feature berechne_umfang is
do -- hier neue Implementierung
einfügen ... end
17Effecting
- Implementieren eines sog. deferred Features
- Feature wird dadurch zu effektivem Feature
- Arbeitet nach denselben Regeln wie Redefinition
- Wird zusammen mit Redefinition unter dem
Oberbegriff Redeklaration zusammengefasst
18Join
- Automatisches Zusammenfassen von mehreren
geerbten deferred Features zu einem einzigen
Feature - Features müssen dabei identische Namen und
Signaturen haben - Zusammenfassen von Features mit unterschiedlichen
Signaturen nicht möglich
berechne_alter
19undefine
- Zurückversetzen eines effektiven Features in den
deffered Zustand - Dabei keine Änderung der Signatur des Features
20Gliederung
- Entstehungsgeschichte von Eiffel
- Allgemeines zu Eiffel
- Besondere Aspekte von Eiffel
- Einfach- und Mehrfachvererbung
- Dynamisches Binden und Polymorphismus
- Selektiver Export von Features
- Programming by Contract
- Fehlerbehandlung und Exceptions
- Fazit
21Statischer und dynamischer Typ
- Variable besteht Typ, Name und Wert
- Ist Typ eine Klasse, so besteht Wert aus einem
Verweis auf ein Objekt - Typ untergliedert sich dann in statischen und
dynamischen Typ - statischer Typ ist derjenige Typ, der bei
Variablendeklarion festgelegt wurde - dynamischer Typ ist der Typ desjenigen Objekts,
auf das die Variable derzeit referenziert - Statischer Typ ist während gesamter Laufzeit fest
- Dynamischer Typ kann sich während Laufzeit ändern
Variable
statischer Typ
dynamischer Typ
22Polymorphismus
- Statischer und dynamischer Typ müssen nicht
übereinstimmen - Variable kann während Laufzeit Objekte
unterschiedlicher Typen annehmen - Dynamischer Typ muss aber stets konform zu
statischem Typ sein
23Beispiele Polymorphismus
Variable
Objekt
24Dynamisches Binden
bewegen
meinFahrzeug.bewegen
fahren
25Gliederung
- Entstehungsgeschichte von Eiffel
- Allgemeines zu Eiffel
- Besondere Aspekte von Eiffel
- Einfach- und Mehrfachvererbung
- Dynamisches Binden und Polymorphismus
- Selektiver Export von Features
- Programming by Contract
- Fehlerbehandlung und Exceptions
- Fazit
26Selektiver Export von Features
- Häufig sollen Features nicht für beliebige andere
Objekte sichtbar sein - Features können selektiv nur für Objekte
bestimmter Klasse sichtbar gemacht werden - Dazu Anpassung des Exportstatus
- Exportstatus eines Features kann bei dessen
Deklaration mittels sog. Exportliste festgelegt
werden
class A feature B, C x INTEGER y
REAL methode_1 is do ... end
27Beispiele Exportliste
28Änderung des Exportstatus
- Exportstatus wird an Unterklassen weitervererbt
- Exportstatus geerbter Features kann in der
Unterklasse nachträglich geändert werden
29Gliederung
- Entstehungsgeschichte von Eiffel
- Allgemeines zu Eiffel
- Besondere Aspekte von Eiffel
- Einfach- und Mehrfachvererbung
- Dynamisches Binden und Polymorphismus
- Selektiver Export von Features
- Programming by Contract
- Fehlerbehandlung und Exceptions
- Fazit
30Programming by Contract
- Dient der Korrektheit und Robustheit des
erstellten Programms - Kommunikation zwischen Objekten beruht auf sog.
Zusicherungen
- Zusicherungen
- Präzise festgelegte Verpflichtungen zwischen
aufrufender Routine (client) und aufgerufener
Routine (supplier) Vertrag zwischen Client und
Supplier - Bestehen aus boolschen Ausdrücken
- Bei Nichterfüllung einer Zusicherung wird
Exception geworfen
31Typen von Zusicherungen
- Vorbedingungen
- Nachbedingungen
- Klasseninvarianten
- Schleifenvarianten
- Schleifeninvarianten
32Vor- und Nachbedingungen
routine_1
routine_2
Vorbedingung
Programmlogik
Nachbedingung
Client
Supplier
33Beispiel Vor- und Nachbedingungen
sqrt (p REAL) REAL is
34Klasseninvariante
- Für gesamtes Objekt gültig (nicht für einzelne
Routinen) - Muss zu jedem Zeitpunkt erfüllt sein, zu dem von
außerhalb auf das Objekt zugegriffen werden kann - Gut geeignet für allgemeine Konsistenzbedingungen
35Schleifeninvariante
- Stellt korrekten Ablauf von Schleifen sicher
- Muss nach Schleifeninitialisierung sowie vor
jedem Durchlauf erfüllt sein - Nichterfüllen führt zu Abbruch der Schleife und
Werfen einer Exception
36Schleifenvariante
- Stellt sicher, dass keine Endlosschleifen
auftreten - INTEGER-Ausdruck, der zu Beginn der Abarbeitung
größer Null sein muss - Muss bei jedem Schleifendurchlauf dekrementiert
werden - Hat Schleifenvariante Null erreicht, so bricht
die Schleife ab
37Gliederung
- Entstehungsgeschichte von Eiffel
- Allgemeines zu Eiffel
- Besondere Aspekte von Eiffel
- Einfach- und Mehrfachvererbung
- Dynamisches Binden und Polymorphismus
- Selektiver Export von Features
- Programming by Contract
- Fehlerbehandlung und Exceptions
- Fazit
38Fehlerbehandlung und Exceptions
- Bei Auftreten eines Fehlers wird sog. Exception
geworfen - Ohne spezielle Fehlerbehandlung führt Exception
zu Abbruch der betreffenden Routine - Ähnlich wie bei Java
39Fehlerbehandlung
- Fehlerbehandlung mittels sog. rescue-Block
- Frei implementierbares Codestück einer Routine
- Wird nur ausgeführt, wenn in betreffender Routine
ein Fehler aufgetreten ist - Geeignet z. B. zum erneuten Initialisieren von
Variablen oder Sicherstellen von Invarianten
40Organisierte Panik
X
41retry-Anweisung
- Darf nur innerhalb eines rescue-Blocks stehen
- Bewirkt einen Neustart der gescheiterten Routine
- Allerdings keine automatische Neu-Initialisierung
der Variablen - Vor retry sollte in rescue-Block dafür gesorgt
werden, dass Vorbedingungen und Invarianten
erfüllt sind
42retry-Anweisung
X
43retry-Anweisung
retry
44Beispiel retry-Anweisung
try_once_or_twice is local already_tried
BOOLEAN do if not already_tried
then method_1 else method_2 end rescue
if not already_tried then already_tried
true retry end end
45Gliederung
- Entstehungsgeschichte von Eiffel
- Allgemeines zu Eiffel
- Besondere Aspekte von Eiffel
- Einfach- und Mehrfachvererbung
- Dynamisches Binden und Polymorphismus
- Selektiver Export von Features
- Programming by Contract
- Fehlerbehandlung und Exceptions
- Fazit
46Fazit
- Mächtige Sprache
- Dennoch schlanke, leicht erlernbare Syntax
- Schwerpunkt liegt auf Korrektheit und Robustheit
des erstellten Codes - Gute Wiederverwendbarkeit und Erweiterbarkeit von
bestehendem Code - sehr strenge Objektorientierung
- sehr komplexe Vererbungsbeziehungen durch
Mehrfachvererbung
47Vielen Dank für Eure Aufmerksamkeit