Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 6: Objekterzeugung.

Slides:



Advertisements
Ähnliche Präsentationen
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil3.
Advertisements

LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Kritische Betrachtung
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Modelle und Methoden der Linearen und Nichtlinearen Optimierung (Ausgewählte Methoden und Fallstudien) U N I V E R S I T Ä T H A M B U R G November 2011.
Modelle und Methoden der Linearen und Nichtlinearen Optimierung (Ausgewählte Methoden und Fallstudien) U N I V E R S I T Ä T H A M B U R G November 2011.
1 JIM-Studie 2010 Jugend, Information, (Multi-)Media Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
= = = = 47 = 47 = 48 = =
Christos, Kornelia, Jan Christos, Kornelia, Jan Entwicklungsumgebung Versteht unseren Java Programm Code Versteht unseren Java Programm.
Christos, Kornelia, Jan Christos, Kornelia, Jan Entwicklungsumgebung Versteht unseren Java Programm Code Versteht unseren Java Programm.
Java: Objektorientierte Programmierung
Java: Grundlagen der Objektorientierung
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Polymorphie (Vielgestaltigkeit)
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Rechneraufbau & Rechnerstrukturen, Folie 2.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 2.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil2.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Differentielles Paar UIN rds gm UIN
Prof. Dr. Bernhard Wasmayr
DVG Klassen und Objekte
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Prof. Dr. Bernhard Wasmayr VWL 2. Semester
Heute: Scherenzange zeichnen
Rechneraufbau & Rechnerstrukturen, Folie 12.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 12.
20:00.
Die Geschichte von Rudi
„Küsse deine Freunde“ – FlexKom-App teilen
Zusatzfolien zu B-Bäumen
In der Schule.
Eine Einführung in die CD-ROM
Dokumentation der Umfrage
für Weihnachten oder als Tischdekoration für das ganze Jahr
Wir üben die Malsätzchen
Syntaxanalyse Bottom-Up und LR(0)
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 9: Abstraktion.
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 7: Referenzen und Zuweisungen.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 4: Die Schnittstelle einer Klasse.
PROCAM Score Alter (Jahre)
Ertragsteuern, 5. Auflage Christiana Djanani, Gernot Brähler, Christian Lösel, Andreas Krenzin © UVK Verlagsgesellschaft mbH, Konstanz und München 2012.
Geometrische Aufgaben
Vorlesung Mai 2000 Konstruktion des Voronoi-Diagramms II
Symmetrische Blockchiffren DES – der Data Encryption Standard
Zahlentheorie und Zahlenspiele Hartmut Menzer, Ingo Althöfer ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List.
MINDREADER Ein magisch - interaktives Erlebnis mit ENZO PAOLO
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Schutzvermerk nach DIN 34 beachten 20/05/14 Seite 1 Grundlagen XSoft Lösung :Logische Grundschaltung IEC-Grundlagen und logische Verknüpfungen.
Folie Beispiel für eine Einzelauswertung der Gemeindedaten (fiktive Daten)
Imperfekt Wie sagt man das mit Imperfekt
Programmiervorkurs WS 2014 Referenzdatentypen
Unternehmensbewertung Thomas Hering ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List of Figures Tabellenübersicht.
Paul, Morten, Yannick Blue J. Entwicklungsumgebung  versteht Java Programmcode  Für die Entwicklung eigener Software  Durch die Programmierung.
Folie Einzelauswertung der Gemeindedaten
Numbers Greetings and Good-byes All about Me Verbs and Pronouns
Einführung Blue J. Inhaltsverzeichnis  Definition  Vokabeln.
J-Team: Gymnasium Ulricianum Aurich und MTV Aurich Ein Projekt im Rahmen von UlricianumBewegt.de Euro haben wir schon…  8000 mal habt ihr bereits.
Datum:17. Dezember 2014 Thema:IFRS Update zum Jahresende – die Neuerungen im Überblick Referent:Eberhard Grötzner, EMA ® Anlass:12. Arbeitskreis Internationale.
1 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt Wie.
Technische Kommunikation
Sehen, Hören, Schmecken: wenn uns unsere Sinne täuschen
1 Medienpädagogischer Forschungsverbund Südwest KIM-Studie 2014 Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 6: Objekterzeugung.
 Präsentation transkript:

Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 6: Objekterzeugung

2 In dieser Lektion… …werden wir sehen, wie man Objekte erzeugt … … und ein Paar verwandte Themen (mehr über Invarianten, Void-Referenzen, Ausführung eines Systems, Korrektheit…) Einfaches Beispiel von Erzeugungsinstruktionen: origin, p1, p2: POINT … create origin create p1 make_cartesian (3, 4) create p2 make_polar (5, Pi/4)

3 Objekte erzeugen In früheren Beispielen haben Zurich, Polybahn etc. jeweils vordefinierte Objekte bezeichnet. Wir werden jetzt unsere eigenen Objekte erzeugen Unser Ziel: Eine Route von Polyterrasse nach Opernhaus zu erzeugen

4 Beispiel: ROUTE_BUILDING Pseudocode Bezeichnet eine Instanz der Klasse ROUTE class ROUTE_BUILDING inherit ZURICH_OBJECTS feature build_route -- Eine Route bauen und damit arbeiten. do -- Opera_route erzeugen und Teilstrecken hinzufügen Zurich add_route (Opera_route) Opera_route reverse -- Weiter mit Opera_route arbeiten end Opera_route : ROUTE -- Eine Route von Polybahn nach Opernhaus. end Pseudocode

5 «Pseudocode» bezeichnet Sätze in natürlicher Sprache, die noch nicht geschriebenen Programmcode darstellen. Beispiel: -- Opera_route erzeugen und Teilstrecken hinzufügen Wir schreiben Pseudocode als Kommentar und in Anführungszeichen Stil : wenn der wirkliche Code geschrieben wird, ist es eine gute Idee, den Pseudocode als normalen Kommentar im Programm zu behalten

6 Bezeichner, Entitäten, Variablen Ein Bezeichner ist ein vom Programmierer gewählter Name, um ein gewisses Programmelement zu repräsentieren. Beispiele sind: Eine Klasse, z.B. ROUTE Ein Feature, z.B. i_th Ein Laufzeitwert, wie etwa ein Objekt oder eine Objektreferenz, z.B. Opera_route Ein Bezeichner, der einen Laufzeitwert bezeichnet, wird Entität genannt Eine Entität, deren Wert sich ändern kann, ist eine Variable Während der Ausführung können Entitäten an Objekte gebunden sein Identifier Entity Attached Variable

7 An ein Objekt gebundene Entitäten Im Programm: eine Entität, wie z.B. Opera_route Im Speicher, während der Ausführung: ein Objekt OBJEKT Felder Opera_route (ROUTE ) Referenz (ROUTE_BUILDING ) Generierende Klasse OBJEKT Generierende Klasse

8 ROUTE_BUILDING class ROUTE_BUILDING inherit ZURICH_OBJECTS feature build_route -- Eine Route bauen und damit arbeiten. do -- Opera_route erzeugen und Teilstrecken hinzufügen Zurich add_route (Opera_route) Opera_route reverse -- Weiter mit Opera_route arbeiten end Opera_route : ROUTE -- Eine Route von Polyterrasse nach Opernhaus. end

9 Opera_route (ROUTE) Referenz (ROUTE_BUILDING ) Woher kommt dieses? Dieses Objekt wurde erzeugt Der Grundzustand einer Referenz Können wir in einer Instanz von ROUTE_BUILDING annehmen, dass Opera_route an eine Instanz von ROUTE gebunden ist?

10 Standard-Referenzen Anfangs ist Opera_route nicht an ein Objekt gebunden: Es ist eine Void-Referenz OBJEKT Opera_route Void-Referenz ( ROUTE_BUILDING )

11 Warum müssen wir Objekte erzeugen? Können wir nicht annehmen, dass eine Deklaration der Form Opera_route : ROUTE eine Instanz von ROUTE erzeugt und sie an Opera_route bindet? (Die Antwort darauf folgt bald…)

12 Zur Laufzeit ist eine Referenz Entweder an ein gewisses Objekt gebunden Oder void Zustände von Referenzen Um eine Void-Referenz zu bezeichnen: Benutzen Sie das reservierte Wort Void Um herauszufinden, ob x void ist, können Sie folgende Abfrage benutzen: x = Void Die inverse Abfrage (ist x an ein Objekt gebunden?): x /= Void

13 Das Problem mit Void-Referenzen Der Grundmechanismus von (O-O) Programmen ist der Featureaufruf x. f (a, …) Da Referenzen void sein können, kann x möglicherweise an kein Objekt gebunden sein In solchen Fällen ist der Aufruf fehlerhaft! Feature f anwenden Auf das an x gebundene Objekt Evtl. mit Argumenten

14 Beispiel: Aufruf auf ein Ziel, das void ist Void-Referenz class ROUTE_BUILDING inherit ZURICH_OBJECTS feature build_route -- Eine Route bauen und damit arbeiten. do -- Opera_route erzeugen und Teilstrecken hinzufügen Zurich add_route (Opera_route) Opera_route reverse end Opera_route : ROUTE -- Eine Route von Polybahn nach Opernhaus. end

15 Ausnahmen (exceptions) Beispiele von abnormalen Ereignissen (failures) während der Ausführung: Void call: Opera_route. reverse, wobei Opera_route void ist Der Versuch, a / b auszurechnen, wobei b den Wert 0 hat Die Konsequenz ist ein Abbruch; es sei denn, das Programm hat Code, um sich von der Ausnahme zu erholen (rescue Klausel in Eiffel, catch in Java) Jede Ausnahme hat einen Typ, der in den Laufzeit- Fehlermeldungen von EiffelStudio ersichtlich ist, z.B. Feature call on void target Arithmetic underflow Zusicherungsverletzung

16 Objekte explizit erzeugen Um eine Ausnahme zu vermeiden: Verändern Sie die Prozedur build_route, so dass sie ein Objekt erzeugt und an Opera_route bindet, bevor es reverse aufruft

17 Warum müssen wir Objekte erzeugen? Können wir nicht annehmen, dass eine Deklaration der Form Opera_route : ROUTE eine Instanz von ROUTE erzeugt und sie an Opera_route bindet? (Die Antwort darauf folgt bald…)

18 Opera_route (ROUTE) Referenz (ROUTE_BUILDING ) Woher kommt dieses? Dieses Objekt wurde erzeugt Der Grundzustand einer Referenz Können wir in einer Instanz von ROUTE_BUILDING annehmen, dass Opera_route an eine Instanz von ROUTE gebunden ist?

19 ROUTE_BUILDING class ROUTE_BUILDING inherit ZURICH_OBJECTS feature build_route -- Eine Route bauen und damit arbeiten. do -- Opera_route erzeugen und Teilstrecken hinzufügen Zurich add_route (Opera_route) Opera_route reverse end Opera_route : ROUTE -- Eine Route von Polybahn nach Opernhaus. end

20 Einfache Objekte erzeugen Um Opera_route zu erzeugen, müssen wir zuerst Objekte erzeugen, welche die Stationen, Linien und Teilstrecken (legs) repräsentieren Polyterrasse Opernhaus STATION Central LINE LEG ROUTE LINE LEG

21 Teilstrecken Eine Instanz der Klasse LEG hat: Referenzen zu einer Anfangstation, Endstation und einer Linie; dürfen nicht Void sein Eine Referenz zur nächsten Teilstrecke; Void am Schluss (LEG ) next (STATION ) destination (Void, oder andere Instanz von LEG) (STATION )(LINE ) origin line

22 Die Schnittstelle der Klasse LEG (erste Version) class LEG feature origin, destination : STATION -- Anfang und Ende der Teilstrecke. line : LINE -- Die Linie, der die Strecke angehört. next : LEG -- Nächste Teilstrecke in der Route. make (o, d : STATION ; l : LINE) -- Anfang, Ende und Linie setzen. require linie_existiert: l /= Void auf_der_linie: l has_station (o) and l has_station (d) ensure stationen_gesetzt: origin = o and destination = d linie_gesetzt: line = l link (other : LEG) -- other zur nächsten Teilstrecke der Route machen. ensure naechste_gesetzt: next = other end

23 -- Erzeuge Opera_route und fülle sie mit Stationen. ROUTE_BUILDING class ROUTE_BUILDING inherit ZURICH_OBJECTS feature build_route -- Eine Route bauen und damit arbeiten. do Zurich add_route (Opera_route ) Opera_route. reverse end Opera_route: ROUTE -- Eine Route von Polybahn nach Opernhaus. end Pseudocode

24 Eine Instanz von LEG erzeugen class ROUTE_BUILDING inherit ZURICH_OBJECTS feature build_route -- Eine Route bauen und damit arbeiten. do Zurich add_route (Opera_route) Opera_route. reverse end Opera_route: ROUTE -- Eine Route von Polybahn nach Opernhaus. end -- Erzeuge Opera_route und fülle sie mit Stationen. create leg1 -- Mehr Teilstrecken erzeugen und Opera_route fertig bauen Erzeugungs- instruktion Jetzt ein gewöhnlicher Kommentar Neuer Pseudocode leg1 : LEG -- Erste Teilstrecke der Opera_route.

25 Erzeugungsinstruktion Grundoperation, um Objekte während der Laufzeit zu erzeugen: Erzeugt ein neues Objekt im Speicher Bindet eine Entität daran leg1 (LEG) next create leg1 origin line destination

26 Der Typ eines erzeugten Objektes Jede Entität ist mit einem gewissen Typ deklariert: leg1 : LEG Eine Erzeugungsinstruktion create leg1 produziert während der Laufzeit ein Objekt dieses Typs

27 Eine Route mit zwei Teilstrecken Wir möchten jetzt, dass leg1 von Polyterrasse nach Central geht, und eine weitere Teilstrecke nach Opernhaus fortfährt. Als Erstes deklarieren wir die entsprechenden Attribute: leg1, leg2 : LEG Polyterrasse Opernhaus Central

28 build_route Vordefiniert in ZURICH_OBJECTS Immer noch Pseudocode! build_route -- Eine Route bauen und damit arbeiten. do -- Erzeuge die Teilstrecken und setze die Stationen und die Linien. create leg1 leg1 make ( Polyterrasse, Central, Polybahn ) create leg2 leg2 make (Central, Opernhaus, Line4 ) -- Verbinde die erste Teilstrecke mit der zweiten. leg1 link (leg2 ) -- Opera_route erzeugen und ihr die eben erstellten Teilstrecken zuweisen Zurich add_route (Opera_route) Opera_route reverse end

29 Nochmals: warum müssen wir Objekte erzeugen? Können wir nicht annehmen, dass eine Deklaration der Form Opera_route : ROUTE eine Instanz von ROUTE erzeugt und sie an Opera_route bindet?

30 Void-Referenzen sind nützlich! (PERSON) spouse Verheiratete Personen:

31 Void-Referenzen sind nützlich! (PERSON) spouse Ledige Personen:

32 Void-Referenzen sind nützlich! (PERSON) spouse Auch bei verheirateten Personen…... sollten wir nicht jedes Mal, wenn wir eine Instanz von PERSON erzeugen, auch ein Objekt für spouse erzeugen? (Warum?)

33 Der Gebrauch von Void-Referenzen (PERSON) spouse Jedes PERSON –Objekt wird mit einer Void-Referenz spouse erzeugt.

34 Der Gebrauch von Void-Referenzen (PERSON) spouse Jedes PERSON –Objekt wird mit einer Void-Referenz spouse erzeugt.

35 Der Gebrauch von Void-Referenzen (PERSON) spouse Jedes PERSON –Objekt wird mit einer Void-Referenz spouse erzeugt und danach werden die spouse - Referenzen durch entsprechende Instruktionen gebunden

36 Der Gebrauch von Void-Referenzen (PERSON) spouse Jedes PERSON –Objekt wird mit einer Void-Referenz spouse erzeugt und danach werden die spouse - Referenzen durch entsprechende Instruktionen gebunden

37 Der Gebrauch von Void-Referenzen (PERSON) spouse Jedes PERSON –Objekt wird mit einer Void-Referenz spouse erzeugt und danach werden die spouse - Referenzen durch entsprechende Instruktionen gebunden

38 (Nochmal) das Problem mit Void-Referenzen Der Grundmechanismus von (O-O) Programmen ist der Featureaufruf x. f (a, …) Da Referenzen void sein können, kann x möglicherweise an kein Objekt gebunden sein. In solchen Fällen ist der Aufruf fehlerhaft! Feature f anwenden Auf das an x gebundene Objekt Evtl. mit Argumenten

39 Void-Aufrufe – Die ganze Geschichte In ISO Eiffel werden Void-Aufrufe dank dem Begriff des gebundenen Typs (attached type) nicht mehr vorkommen. Der Compiler lehnt jeden Aufruf x. f ab, bei dem x in einer Ausführung void sein könnte. Dies ist ein grosser Fortschritt, der allerdings auch Kompatibilitätsprobleme für bereits existierenden Code mit sich führt. Deshalb wird dies schrittweise ab EiffelStudio 6.2 eingeführt. Andere Sprachen kennen dies nicht, aber Spec#, eine auf C# basierende Sprache aus der Forschungsabteilung von Microsoft, spielte eine Vorreiterrolle mit ihren non-null types. In diesem Kurs benutzen wir immer noch die alten Regeln.

40 Void safety – um mehr zu wissen B. Meyer, E. Stapf, A. Kogtenkov: Avoid a Void: The Eradication of Null Dereferencing, in Reflections on the Work of C.A.R. Hoare, 2010, auf docs.eiffel.com/book/papers/void-safety-how-eiffel-removes-null-pointer-dereferencing oder verfügbar

41 Es lohnt sich, Fehler statisch zu entdecken Relativer Kosten, einen Fehler zu beheben Source: Boehm RequirementsDesignCodeDevelopment Testing Acceptance Testing Operation

42 (Nochmals) Die Schnittstelle der Klasse LEG class LEG feature origin, destination: STATION -- Anfang und Ende der Teilstrecke. line: LINE -- Die Linie, der die Strecke angehört. next : LEG -- Nächste Teilstrecke in der Route. make (o, d : STATION; l: LINE) -- Anfang, Ende und Linie setzen. require linie_existiert: l /= Void auf_der_linie: l.has_station (o) and l.has_station (d) ensure stationen_gesetzt: origin = o and destination = d linie_gesetzt: line = l link (other : LEG) -- other zur nächsten Teilstrecke der Route machen. ensure naechste_gesetzt: next = other end

43 Referenzen in verketteten Strukturen Die Liste wird durch eine next -Referenz, die void ist, beendet. ( LEG ) next ( LEG ) next ( LEG ) next

44 build_route Vordefiniert in ZURICH_OBJECTS Immer noch Pseudocode! build_route -- Eine Route bauen und sie auf der Karte hervorheben. do -- Erzeuge die Teilstrecken und setze die Stationen und die Linien: create leg1 leg1 make ( Polyterrasse, Central, Polybahn ) create leg2 leg2 make (Central, Opernhaus, Line4) -- Verbinde die erste Teilstrecke mit der zweiten. leg1. link (leg2 ) -- Opera_route erzeugen und ihr die eben erstellten Teilstrecken zuweisen Zurich add_route (Opera_route) Opera_route reverse end

45 Die Schnittstelle der Klasse LEG (erste Version) class LEG feature origin, destination : STATION -- Anfang und Ende der Teilstrecke. line : LINE -- Die Linie, der die Strecke angehört. next : LEG -- Nächste Teilstrecke in der Route. make (o, d : STATION ; l : LINE) -- Anfang, Ende und Linie setzen. require linie_existiert: l /= Void auf_der_linie: l has_station (o) and l has_station (d) ensure stationen_gesetzt: origin = o and destination = d linie_gesetzt: line = l link (other : LEG) -- other zur nächsten Teilstrecke der Route machen. ensure naechste_gesetzt: next = other end

46 Der Invariante der Klasse LEG linie_existiert: line /= Void anfang_auf_der _linie : line has_station (origin) ende_auf_der_linie : line has_station (destination)

47 create leg leg make (station1, station2, line) Die Notwendigkeit von Erzeugungsprozeduren Erzeugung und Initialisierung eines LEG Objektes: Die Invariante der Klasse: invariant linie_existiert: line /= Void anfang_auf_der_linie: line has_station (origin) ende_auf_der_linie: line has_station (destination) Nach der Erzeugung: Invariante nicht erfüllt!

48 Erzeugungsprozeduren Eine bessere Lösung: Deklarieren Sie make als Erzeugungsprozedur, um Initialisierung mit Erzeugung zu verbinden: create leg1 make (Polyterrasse, Central, Polybahn) -- Gleicher Effekt wie die zwei vorherigen Instruktionen Einfachheit: Initialisierung bei Erzeugung. Korrektheit: Die Invariante wird von Anfang an erfüllt. Erzeugungsprozeduren heissen auch Konstruktoren (z.B. in Java oder C#)

49 Die Schnittstelle der Klasse LEG class LEG create make feature origin, destination: STATION -- Anfang und Ende der Teilstrecke. line: LINE -- Linie, der die Strecke angehört. next : LEG -- Nächste Teilstrecke der Route. make (o, d : STATION; l: LINE) -- Anfang, Ende und Linie setzen. require linie_existiert: l /= Void auf_der_linie: l has_station (o) and l has_station (d) ensure stationen_gesetzt: origin = o and destination = d linie_gesetzt: line = l link (other : LEG) -- other zur nächsten Teilstrecke der Route machen. ensure naechste_gesetzt: next = n invariant linie_existiert: line /= Void auf_der_linie: line has_station (origin) and line has_station (destination) end Auflistung der Erzeugungsprozeduren Jetzt auch als Erzeugungsprozedur verfügbar

50 Erzeugungsprinzip Dies erlaubt dem Autor der Klasse, zu erzwingen, dass alle von Klienten erzeugten Instanzen korrekt initialisiert werden. Falls eine Klasse eine nicht-triviale Invariante hat, muss sie eine oder mehrere Erzeugungsprozeduren definieren, die sicherstellen, dass jede Instanz nach der Ausführung einer Erzeugungsinstruktion die Invariante erfüllt.

51 Erzeugungsprozeduren Auch wenn keine starke Invariante vorhanden ist, sind Erzeugungsprozeduren nützlich, um Initialisierung und Erzeugung zu kombinieren. class POINT create default_create, make_cartesian, make_polar feature … end Gültige Erzeugungsinstruktionen: create your_point default_create create your_point create your_point make_cartesian (x, y) create your_point make_polar (r, t ) Vererbt an alle Klassen, macht standardmässig nichts

52 Objekterzeugung: Zusammenfassung Um ein Objekt zu erzeugen: Falls die Klasse keine create-Klausel hat, benutzen Sie die Grundform: create x Falls die Klasse eine create-Klausel hat, die eine oder mehrere Prozeduren auflistet, benutzen Sie create x make (…) wobei make eine der Erzeugungsprozeduren ist und(…) für allfällige Argumente steht.

53 Korrektheit einer Instruktion Um mit dem Prinzip Design by Contract (Entwurf gemäss Vertrag) übereinzustimmen, müssen wir von jeder Instruktion genau wissen: Wie man die Instruktion richtig benutzt: die Vorbedingung Was wir dafür garantiert bekommen: die Nachbedingung Zusammen definieren diese beiden Eigenschaften (zusammen mit der Invarianten) die Korrektheit eines Sprachmechanismus Wie lautet die Korrektheitsregel für eine Erzeugungsinstruktion?

54 Korrektheit einer Erzeugungsinstruktion Korrektheitsregel für Erzeugungsinstruktionen Vor der Erzeugungsinstruktion: 1. Die Vorbedingung der Erzeugungsprozedur (falls vorhanden) muss erfüllt sein Nach der Erzeugungsinstruktion mit dem Ziel x vom Typ C : 2. x /= Void gilt 3. Die Nachbedingung der Erzeugungsprozedur ist erfüllt 4. Das an x gebundene Objekt erfüllt die Invariante von C

55 Aufeinanderfolgende Erzeugungsinstruktionen Die Korrektheitsregel erfordert nicht, dass x void ist: create x -- Hier ist x nicht void. … create x x Zuerst erzeugtes Objekt Danach erzeugtes Objekt

56 Der Effekt einer Erzeugungsinstruktion x ist nach der Erzeugungsinstruktion nicht void (egal ob es vorher void war oder nicht) Das eben erzeugte Objekt ist an x gebunden Falls es eine Erzeugungsprozedur gibt, ist ihre Nachbedingung für das neue Objekt erfüllt Das Objekt erfüllt die Klasseninvariante

57 Eine Wurzelprozedur kann: Neue Objekte erzeugen Auf diesen Features aufrufen, die wiederum neue Objekte erzeugen können Etc. Die Ausführung eines Systems beginnt mit der Erzeugung eines Wurzelobjektes, das eine Instanz einer vom System vorgesehenen Klasse (die Wurzelklasse) ist, mittels einer definierten Erzeugungsprozedur dieser Klasse (die Wurzelerzeugungprozedur oder einfach Wurzelprozedur) Wie alles beginnt…

58 Wurzelobjekt Wurzelprozedur obj1 obj2 r1 r2 create obj1 r1 create obj2 r2 Ausführung eines Systems

59 Das aktuelle Objekt (current object) Zu jeder Zeit während einer Ausführung gibt es ein aktuelles Objekt, auf welchem das aktuelle Feature aufgerufen wird. Zu Beginn ist dies das Wurzelobjekt Während eines qualifizierten Aufrufs x. f (a), ist das neue aktuelle Objekt dasjenige, das an x gebunden ist.. Nach einem solchen Aufruf übernimmt das vorherige aktuelle Objekt wieder diese Rolle.

60 Der Entwurfsprozess Ein System ist eine bestimmte Gruppe von gewissen Klassen, wobei eine Klasse als Wurzelklasse dient. Die Klassen können auch ausserhalb des Systems wertvoll sein: sie sind dann wiederverwendbar.

61 Erweiterbarkeit & Wiederverwendbarkeit Erweiterbarkeit: Die Einfachheit, mit welcher es möglich ist, ein System den Wünschen eines Benutzers entsprechend anzupassen. Wiederverwendbarkeit: Die Einfachheit, bestehende Software für neue Applikationen wiederzuverwenden. Ältere Software-Engineering-Ansätze, die auf einem Hauptprogramm und Unterprogrammen beruhen, beachten diese Bedürfnisse weniger.

62 Die Wurzel (root) ausfindig machen Wie spezifiziert man die Wurzelklasse und die Wurzel- Erzeugungsprozedur eines Systems? Benutzen Sie EiffelStudio

63 Was wir in dieser Vorlesung gesehen haben Klasseninvarianten Das Konzept Design by Contract Den Begriff einer Ausnahme Objekterzeugung Erzeugungsprozeduren Die Beziehung zwischen Erzeugungsprozeduren und Invarianten Den Vorgang einer Systemausführung