Obligatorische Literatur Einführung in die objektorientierte Programmierung (OOP) ► ► ► Prof. Dr. rer. nat. Uwe Aßmann Lehrstuhl Softwaretechnologie Fakultät für Informatik TU Dresden Version 08-1.0, 10.10.08 ► 1) Objekte 2) Klassen 3) Allgemeines über Objektorientierte Programmierung Softwaretechnologie, © Prof. Uwe Aßmann Zuser Kap 7, Anhang A Störrle, einleitende Kapitel Java: ■ Balzert, LE 3-5 ■ Boles, Kap. 1-6 Optional: ■ 1 A. Kay. The History of Smalltalk. Second Conference on the History of Programming Languages. ACM. http://portal.acm.org/citation.cfm?id=1057828 2 Prof. Uwe Aßmann, Softwaretechnologie Ziele ► Objekte verstehen als identitätstragende Entitäten mit Methoden und Zustand Klassen als Modellierungskonzepte verstehen ► Verstehen, wie Objekte und Klassen im Speicher dargestellt werden ► ■ Objekte: Die Idee Mengen-, Schablonensemantik Prof. Uwe Aßmann, Softwaretechnologie 3 Softwaretechnologie, © Prof. Uwe Aßmann 4 Die zentralen Fragen Modeling the Real World Car ... 1 4 Engine Wheel Wie können wir die Welt möglichst einfach beschreiben? 2 Side-wheels Objektorientierte Entwicklung modelliert die reale Welt, um sie im Rechner zu simulieren Wie können wir die Beschreibung im Computer realisieren? Herkunft: Simula 1967 (Nygaard, Dahl). Ziel: technische Systeme simulieren Smalltalk 1973 (Kay, Goldberg) Frage: Worauf muss man besonders achten? Prof. Uwe Aßmann, Softwaretechnologie 5 Verschiedene Antworten ► ► ► ► Die Welt einfach modellieren Funktionale Sprachen (wie Haskell, ML) ■ Die Antwort der Objektorientierung: durch Software-Objekte Funktionen berechnen Werte ohne Zustand Imperative modulare Sprachen (wie Modula, C, Ada 83) ■ Funktionen berechnen Werte mit Zustand ■ Statische Aufrufbeziehungen zwischen den Funktionen Identifikation von Objekten in Systemen Kapselung von Funktionen in Objekten (Verantwortungsbereiche) Objektorientierte Sprachen (wie C++, Java, C#, Ada95) ■ Funktionen berechnen Werte und Objekte mit Zustand ■ Dynamisch veränderliche Aufrufbeziehungen Klare Schnittstellen zwischen Teilsystemen (Benutzungsprotokolle zwischen Objekten) Logische Sprachen (Prolog, Datalog, F-Logik, OWL) ■ Prädikate beschreiben Aussagen (Wahrheiten) ■ Deklarative Logik beschreibt inferierbares Wissen auf einer Faktenbasis Kein expliziter Steuer- oder Datenfluß, ist implizit ■ 6 Prof. Uwe Aßmann, Softwaretechnologie Verschiedene Abstraktionsebenen (Hierarchie) Vorgefertigte Teile - Wiederverwendung (Baukastenprinzip, Rahmenwerke) Prof. Uwe Aßmann, Softwaretechnologie 7 Prof. Uwe Aßmann, Softwaretechnologie 8 Objekte ► ► ► ► Grundkonzepte der Objektorientierung Wie ist das Objekt bezeichnet (Name)? Wie verhält es sich zu seiner Umgebung? Welche Informationen sind „Privatsache“ des Objekts? Ein System besteht aus vielen Objekten. ► ► Identität: „DD-0X5A“ ► Ein Objekt hat ein definiertes Verhalten. ■ Menge genau definierter Operationen (Funktionen, Methoden, Prodeduren) ■ Operation wird beim Empfang einer Nachricht (Message) ausgeführt. ■ Operationen drücken die Zuständigkeit eines Objektes für gewisse Aufgaben des Systems aus Ein Objekt hat einen inneren Zustand. ■ Ausgedrückt durch sog. Attribute, die Werte annehmen können ■ Resultat einer Operation hängt vom aktuellen Zustand ab Ein Objekt besteht also aus einer Menge von Operationen auf einem Zustand ■ Verhalten: „gelbes Licht“ Objekte gruppieren Operationen, die über einen Zustand kommunizieren Zustand: Normalbetrieb Objekt zur Repräsentation einer Ampel 9 Prof. Uwe Aßmann, Softwaretechnologie Grundkonzepte der Objektorientierung ► ► Die Identität ist unabhängig von anderen Eigenschaften. ■ Es können mehrere verschiedene Objekte mit identischem Verhalten und identischem inneren Zustand im gleichen System existieren. ■ ► OOSE Jacobson Zustand des Objekts ist Privatsache Zustand wird nach aussenhin verborgen; niemand kann sich Annahmen auf den Zustand machen, ausser denen, die das Objekte freiwillig angibt ... OMT Rumbaugh et al. 1995: Booch / Rumbaugh / Jacobson Objekte müssen zu Objektnetzen verknüpft werden Prof. Uwe Aßmann, Softwaretechnologie OOD Booch Ca. 1990: Ein Objekt lebt in einem Objektnetz (Noone is an island) ■ 10 Unified Modeling Language UML Ein Objekt verwaltet ein Geheimnis (Geheimnisprinzip, Kapselung des Zustandes) ■ 12. Abteilungsrunde DD-0X5A: Ampel Prof. Uwe Aßmann, Softwaretechnologie Ein Objekt hat eine eindeutige Identität (Schlüssel, key, object identifier) ■ Objekt zur Repräsentation eines Termins 1997: 1999: 2001: 11 UML 1.1 UML 1.3 UML 1.4 2002: UML 1.4.1 2004: UML 2.0 ► UML ist Industriestandard der OMG (Object Management Group) http://www.omg.org/uml ► Achtung: wir verwenden hier jUML (Java-äquivalent), aUML (für Analyse), dUML (für Design). Prof. Uwe Aßmann, Softwaretechnologie 12 Wie sieht ein Objekt in (j)UML aus? ► ► Wie sieht ein Objekt in UML aus? Bsp.: Eine Einkommenssteuererklärung wird von einem Steuerzahler ausgefüllt. Sie wird zuerst mit Standardwerten initialisiert, dann in Iterationen ausgefüllt: abgespeichert und wiedergelesen. Zuletzt wird sie beim Finanzamt eingereicht. Die Werte aller Attribute bildet den Objektzustand ► ► Attribute und/oder Operationen (Methoden, Funktionen, Prozeduren) können weggelassen sein Objekte können anonym sein oder einen Variablennamen (Identifikator) tragen anonym Identität :Finanzamt fin:Finanzamt st:Steuererklärung submit() name:String = „Dresden I“ number:int = 1 iteration:int = 5 submit() create() store() reread() :Steuererklärung number:int = 1 iteration:int = 5 Zustand name:String = „Leo Rott“ maritalStatus:String = „verh“ Funktionen sandra:Steuerzahler pay() 13 Prof. Uwe Aßmann, Softwaretechnologie Wie sieht ein Objekt im Speicher aus? (vereinfacht) ► Der Speicher setzt sich zusammen aus ■ ■ ■ ■ Keller benamt zahler:Steuerzahler 100 104 :Steuerzahler 108 112 116 Symboltabelle (Stringspeicher) Leo Rott verh Die Halde wächst dynamisch mit wachsender Menge von Objekten ■ Symboltabelle (symbol table, halbdynamisch: statischer und dynamischer Teil, enthält alle Zeichenketten (Strings)) Code-Speicher für Methoden (statisch) Halde (Objektspeicher) Wie sieht ein Objekt im Speicher aus? (vereinfacht) ► Halde (heap, dynamisch wachsender Objektspeicher) Keller (stack, Laufzeitkeller für Methoden und ihre Variablen) Code-Speicher (Methoden) pay() { .... } create() { .. } store() { .. } reread() { .. } 14 Prof. Uwe Aßmann, Softwaretechnologie verschiedene Lebenszeiten Halde (Objektspeicher) :Steuerzahler 100 name:String Symboltabelle Leo Rott verh 104 maritalStatus:String 108 pay() 112 number:int = 1 116 iteration:int = 5 120 create() 124 store() :Steuererklärung 120 128 reread() 124 :Steuererklärung Code-Speicher pay() { .... } create() { .. } store() { .. } reread() { .. } new() { .. } 128 Prof. Uwe Aßmann, Softwaretechnologie 15 Prof. Uwe Aßmann, Softwaretechnologie 16 Was passiert bei der Objekterzeugung im Speicher? Objekterzeugung (Allokation) ► Eine Methode im Code-Speicher spielt eine besondere Rolle: der Allokator (Objekterzeuger) new() ■ zahler2 = new Steuerzahler(“Sandra Klug”, “ledig”); Erzeugt in der Halde ein neues Objekt, mit . Platz für die Attribute. Der Allokator arbeitet spezifisch für den Typ eines Objekts und kennt die Platzbedarf eines Objekts . Platz für die Zeiger auf die Methoden . Initialisierung: Der Allokator erhält die Initialwerte von Attributen als Parameter Symboltabelle Halde (Objektspeicher) Leo Rott verh Sandra Klug ledig 100 name:String 104 maritalStatus:String 108 pay() In Java: zahler2 = new Steuerzahler(“Sandra Klug”, “ledig”); ► Code-Speicher 112 number:int = 1 pay() { .... } create() { .. } store() { .. } reread() { .. } new() { .. } 116 iteration:int = 5 120 create() 124 store() 128 reread() 132 name:String Neu 136 maritalStatus:String 140 pay() Prof. Uwe Aßmann, Softwaretechnologie 17 Allokation und Aufruf eines Objektes in Java ► Objekte durchlaufen im Laufe ihres Lebens viele Zustandsveränderungen, die durch Aufrufe verursacht werden // Typical life of a young man juri = new Man(); // Allokation: lege Objekt im Speicher an while (true) { juri.cry(); // Yields: juri.state == crying juri.drink(); // Yields: juri.state == drinking juri.sleep(); // Yields: juri.state == sleeping juri.fillDiapers(); // Yields: juri.state == fillingDiapers } Prof. Uwe Aßmann, Softwaretechnologie 19 Prof. Uwe Aßmann, Softwaretechnologie :Steuerzahler 18 Zustandsänderungen im Ablauf eines Java-Programms class Clock { int hours, minutes; public void tick() { minutes++; if (minutes == 60) { minutes = 0; hours++; public void tickHour() { for (int i = 1; i<= 60; i++) { tick(i); // object calls itself } } public void reset() { hours = 0; minutes = 0; } public void set(int h, int m) { hours = h; minutes = m; } ... Clock cl1 = new Clock(); // cl1.hours == cl1.minutes == cl1.reset(); // cl1.hours == cl1.minutes == Clock cl2 = new Clock(); // cl2.hours == cl2.minutes == cl2.reset(); // cl2.hours == cl2.minutes == cl1.set(3,59); // cl1.hours == 3; cl1.minutes cl1.tick(); // cl1.hours == 4; cl1.minutes cl1 = null; // object cl1 is dead Prof. Uwe Aßmann, Softwaretechnologie } } } undef 0 undef 0 == 59 == 0 20 Allokation, Aufruf und Deallokation einer Steuererklärung in Java ► Was können Objekte darstellen? Ein Codemuster ist ein Lösungsschema für wiederkehrende Programmierprobleme ► ■ erkl = new Einkommensteuererklärung(); // Allokation: lege Objekt im Speicher an erkl.initialize(); Codemuster (Idiom) // fill with default values FirstIteration boolean firstIteration = true; while (true) { if (firstIteration) { firstIteration = false; } else { erkl.rereadFromStore(); // Read last state } erkl.edit(); // Yields: erkl.state == editing erkl.store(); // Yields: erkl.state == stored } erkl.shipToTaxOffice(); erkl = null; // object dies Prof. Uwe Aßmann, Softwaretechnologie 21 Objektnetze ► ► Simulierte abstrakte Dinge (Anwendungsobjekte, fachliche Objekte, Geschäftsobjekte, business objects) ■ ► Rechnungen, Löhne, Steuererklärungen, Buchungen, etc. Konzepte und Begriffe ■ ► Autos, Menschen, Häuser, Maschinen, Weine, Steuerzahler, etc. Farben, Geschmack, Regionen, politische Einstellungen, etc. Handlungen. Objekte können auch Aktionen darstellen ■ ■ Entspricht der Substantivierung eines Verbs (Reifikation, reification) sog. Kommandoobjekte, wie Editieren, Drucken, Zeichnen, etc. Ein Link von einem Objekt zum nächsten heisst Referenz (Objekt-Assoziation) ► ► ... können als Objektnetze in UML dargestellt werden In Java werden also Referenzen durch Attribute mit dem Typ eines Objekts (also kein Basistyp wie int); in UML durch Pfeile cl1:Clock class TwinClock { TwinClock twin; public void tick() { minutes++; if (minutes == 60) { minutes = 0; hours++; } twin.tick(); } void setTwin(TwinClock t) { twin = t; } } ... TwinClock cl1 = new TwinClock(); // cl1.twin == undefined TwinClock cl2 = new TwinClock(); // cl2.twin == undefined cl1.setTwin(cl2); // cl1.twin == cl2 cl2.setTwin(cl1); // cl2.twin == cl1 Prof. Uwe Aßmann, Softwaretechnologie 22 Prof. Uwe Aßmann, Softwaretechnologie Objektwertige Attribute in Objektnetzen Objekte existieren selten alleine; sie müssen zu Objektnetzen verflochten werden ■ Simulierte reale Objekte der realen Welt (der Anwendungsdomäne) cl1:Clock twin:Clock=cl2 tick() setTwin(t:Clock) cl1:Clock twin:Clock=cl2 tick() setTwin(t:Clock) tick() setTwin(t:Clock) twin twin cl2:Clock cl2:Clock twin:Clock=cl1 tick() 23 setTwin(t:Clock) cl2:Clock twin:Clock=cl1 tick() setTwin(t:Clock) Prof. Uwe Aßmann, Softwaretechnologie tick() setTwin(t:Clock) 24 Phasen eines objektorientierten Programms ► Phasen eines objektorientierten Programms Die folgende Phasengliederung ist als Anhaltspunkt zu verstehen; oft werden einzelne Phasen weggelassen oder in der Reihenfolge verändert Aufbauphase Allokation von Objekten im Speicher Initialisierung Vernetzung der Objekte (Aufbau des Objektnetzes) Arbeitsphase: die Objekte arbeiten zusammen, um das Ziel zu erreichen Umbauphase: Rekonfiguriere das Objektnetz Abbauphase Abbau des Objektnetzes Abfallsammlung auf der Halde (garbage collection, in Java autom.) 25 Prof. Uwe Aßmann, Softwaretechnologie class Clock { // assume a combination of previous Clock and TwinClock public void tick() { .. } public void tickHour() { .. } public void setTwin(Clock c) { .. } public void reset() { .. } public void set(int h, int m) { .. } Allokation } ... Clock cl1 = new Clock(); // cl1.hours == cl1.minutes == undefined Clock cl2 = new Clock(); // cl2.hours == cl2.minutes == undefined Initialisierung cl1.reset(); // cl1.hours == cl1.minutes == 0 cl2.reset(); // cl2.hours == cl2.minutes == 0 Vernetzung cl1.setTwin(cl2); cl2.setTwin(cl1); // cl1.twin == cl2 // cl2.twin == cl1 cl1.set(3,59); cl1.tick(); // cl1.hours == 3; cl1.minutes == 59 // cl1.hours == 4; cl1.minutes == 0 cl1 = null; cl2 = null; // object cl1 is dead // object cl2 is dead Arbeitsphase Abbauphase Prof. Uwe Aßmann, Softwaretechnologie 26 Klasse und Objekt Klassen ► Ein weiterer Grundbegriff der Objektorientierung ist der der Klasse. ► Fragen: Welcher Begriff beschreibt das Objekt? ■ Welchen Typ hat das Objekt? ■ In welche Klasse einer Klassifikation fällt das Objekt? ■ Zu welcher Menge gehört das Objekt? Klasse: „Ampel“ Objekt: „DD-0X5A“ Softwaretechnologie, © Prof. Uwe Aßmann 27 Prof. Uwe Aßmann, Softwaretechnologie 28 Beispiel: Ampel-Klasse und AmpelObjekte ► Klassen als Begriffe, Mengen und Schablonen Objekte, die zu Klassen gehören, heißen Ausprägungen der Klasse ► Begriffsorientierte Sicht: ■ ► DD-0Y3C:Ampel DD-0X5B:Ampel DD-0X5A:Ampel <<instance-of>> ► Mengenorientierte Sicht: ■ Eine Klasse enthält eine Menge von Objekten ■ Eine Klasse abstrahiert eine Menge von Objekten Schablonenorientierte (ähnlichkeitsorientierte) Sicht: ■ <<instance-of>> <<instance-of>> Ampel ■ Ausprägung einer Klasse (Das Wort Instanz ist kein korrektes Deutsch) Prof. Uwe Aßmann, Softwaretechnologie 29 Merkmale von Klassen und Objekten ► ■ ■ ■ ► ► Prof. Uwe Aßmann, Softwaretechnologie ► 30 Zustandsinvariante Methoden: ■ Damit haben alle Objekte der Klasse die gleichen Merkmale Attribute (attributes, Daten). Attribute haben in einem Objekt einen objektspezifischen Wert. . Die Werte bilden in ihrer Gesamtheit den Zustand des Objektes, der sich über der Zeit ändert. Operationen (Methoden, Funktionen, Prozeduren, functions, methods). Prozeduren, die den Zustand des Objektes abfragen oder verändern können. Diese Merkmale sind für alle Objekte einer Klasse gleich. Invarianten, Bedingungen, die für alle Objekte zu allen Zeiten gelten Da ein Objekt aus der Schablone der Klasse erzeugt wird, sind anfänglich die Werte seiner Attribute die des Klassenprototyps. Durch Ausführung von Methoden ändert sich jedoch der Zustand, d.h., die Attributwerte. ■ ► 31 Anfragen (queries, Testbefehle). Diese Prozeduren geben über den Zustand des Objektes Auskunft, verändern den Zustand aber nicht. Prüfer (checker, Prüfbefehle). Diese Prozeduren liefern einen booleschen Wert. Sie prüfen eine Konsistenzbedingung (Integritätsbedingung, integrity constraint) auf dem Objekt, verändern den Zustand aber nicht. . Invarianten-Prüfer . Prüfer von Vorbedingungen für Methoden, Nachbedingungen Zustandsverändernde Methoden: ■ ■ ■ Prof. Uwe Aßmann, Softwaretechnologie Eine Klasse bildet eine Äquivalenzklasse für eine Menge von Objekten . Natürlich ist eine Äquivalenzklasse eine spezielle Menge, die aber durch ein gemeinsames Prädikat charakterisiert ist . Die Klasse schreibt das Verhaltensschema und die innere Struktur ihrer Objekte vor (Äquivalenz) . Eine Klasse enthält einen speziellen Repräsentanten, ein spezielles Objekt, ein Schablonenobjekt (Prototyp) für ihre Objekte. Ein Objekt wird aus einer Klasse erzeugt (Objektallokation), . in dem der Prototyp in einen neuen, freien Speicherbereich kopiert wird. . Damit erbt das neue Objekt das Verhalten der Klasse (die Operationen), das Prädikat und die Attribute des Prototyps (meistens Nullwerte wie 0 oder null) Arten von Methoden Eine Klasse hat Merkmale (features, in Java: members), die sie auf die Objekte überträgt. ■ Eine Klasse stellt einen Begriff dar. Dann charakterisiert die Klasse ein Konzept Modifikatoren . Attributmodifikatoren ändern den (lokalen) Zustand des Objekts . Netzmodifikatoren ändern die Vernetzung des Objektes Repräsentationswechsler (representation changers) transportieren das Objekt in eine andere Repräsentation . z.B. drucken den Zustand des Objekts in einen String, auf eine Datei oder auf einen Datenstrom. Allgemeine Methoden. Prof. Uwe Aßmann, Softwaretechnologie 32 Klasse als Venn-Diagramm in der mengenorientierte Sicht ► ► Klasse in schablonenorientierter Sicht Professoren und Studenten Klassen bilden Mengen; Objekte werden durch Enthaltensein ausgedrückt Merke die Verbindung zu Datenbanken: ■ Objekte entsprechen Tupeln mit eindeutigem Identifikator (OID, surrogate) ■ Klassen entsprechen Relationen mit Identifikator-Attribut Ampel DD-0X5A:Ampel DD-0Y3C:Ampel Professor Student Schill:Professor Schneider:Student Aßmann:Professor Müller:Student Härtig:Professor Weckermann:Student DD-0X5B:Ampel 33 Prof. Uwe Aßmann, Softwaretechnologie Klasse in schablonenorientierter Sicht ► ► Ausprägungen werden durch Klassen-Objekt-Assoziationen ausgedrückt created-from ist die inverse Relation zu instance-of ► DD-0Y3C:Ampel <<instance-of>> <<created-from>> <<created-from>> ► 34 Der Prototyp wird vor Ausführung des Programms angelegt (im statischen Speicher) und besitzt . eine Tabelle mit Methodenadressen im Codespeicher (die Methodentabelle). Der Aufruf einer Methode erfolgt immer über die Methodentabelle des Prototyps . Eine Menge von Attributwerten (Klassenattribute) und einen Objekt-Extent (Objektmenge), eine Menge von Objekten (vereinfacht als Liste realisiert), die alle Objekte der Klasse erreichbar macht ■ DD-0X5B:Ampel visitLecture() eat() drinkBeer() work() sleep() getName() Um die 3 unterschiedlichen Sichtweisen auf Klassen zusammen behandeln zu können, gehen wir im Folgenden von folgenden Annahmen aus: Jede Klasse hat ein Prototyp-Objekt (eine Schablone) ■ <<created-from>> giveLecture() eat() drink() work() sleep() getName() Wie sieht eine Klasse im Speicher aus? DD-0X5A:Ampel Ampel Student Prof. Uwe Aßmann, Softwaretechnologie ► <<instance-of>> Professor In einer Datenbank entspricht der Objekt-Extent der Relation, die Klasse dem Schema <<instance-of>> Prof. Uwe Aßmann, Softwaretechnologie 35 Prof. Uwe Aßmann, Softwaretechnologie 36 Wie erzeugt man ein Objekt für eine Klasse? (Verfeinerung) ► zahler2 = new Steuerzahler(“Sandra Klug”, “ledig”); ► Man kopiert den Prototyp in die Halde: Wie erzeugt man ein Objekt für eine Klasse? (Verfeinerung) ► Man reserviert den Platz des Prototyps in der Halde kopiert den Zeiger auf die Methodentabelle (Vorteil: Methodentabelle kann von allen Objekten einer Klasse benutzt werden) und füllt die Prototypattributwerte in den neuen Platz ■ ■ ■ Prototypen im statischen Speicher 010 name:String == null 014 maritalStatus:String == null 018 methodTable:Method[] pay() Prof. Uwe Aßmann, Softwaretechnologie 018 methodTable:Method[] Code-Speicher (Methoden) 132 name:String 136 maritalStatus:String 37 140 prototype:Class Prof. Uwe Aßmann, Softwaretechnologie name:String == null 132 name:String 014 maritalStatus:String == null 136 maritalStatus:String 018 methodTable:Method[] 140 prototype:Class extent:List(Object) 144 name:String 148 maritalStatus:String 152 taxnumber:int == 12940 156 prototype:Class 160 name:String 164 maritalStatus:String 168 prototype:Class methodTable:Method[] 172 name:String extent:List(Object) 176 maritalStatus:String 180 prototype:Class 184 name:String 188 maritalStatus:String 192 taxnumber:int == 12941 196 prototype:Class 030 taxnumber:int 034 methodTable:Method[] 038 *** extent:List(Object) 042 046 050 *** Prof. Uwe Aßmann, Softwaretechnologie 38 Klassennetze und Objektnetze 010 026 pay() { .... } fillIn() { .. } store() { .. } reread() { .. } new() { .. } Halde (Objektspeicher) ► Objekte und Klassen können zu Netzen verbunden werden: ■ ■ *** Code-Speicher (Methoden) fillIn() Der Objekt-Extent ist eine Liste der Objekte einer Klasse. Wir benötigen dazu ein neues Attribut des Prototyps 022 Leo Rott verh Sandra Klug ledig pay() Objekt-Extent im Speicher ► 010 name:String == null 014 maritalStatus:String == null pay() { .... } fillIn() { .. } store() { .. } reread() { .. } new() { .. } fillIn() Symboltabelle (Stringspeicher) Prototypen im statischen Speicher Stringspeicher (Symboltabelle) Leo Rott verh Sandra Klug ledig Ergebnis: ► Klassen durch Assoziationen (gerichtete Pfeile) Objekte durch Links (Zeiger, pointer, gerichtete Pfeile) Klassennetze prägen Objektnetze, d.h. legen ihnen Obligationen auf Child mom Mother class Child { ... Mother mom; ... } mom tom:Child jane:Mother mom Child tom = new Child(); tom.mom = jane; ... tom.mom = null; tom:Child 39 Prof. Uwe Aßmann, Softwaretechnologie 40 Mehrstellige Assoziationen Invarianten von Assoziationen ► ► Die Obligationen können aus Multiplizitäten für die Anzahl der Partner bestehen (Kardinalitätsbeschränkung oder Invariante der Assoziation) “Ein Kind kann höchstens eine Mutter haben” ► Eine Mutter kann aber viele Kinder haben Implementierung in Java durch integer-indizierbare Felder mit statisch bekannter Obergrenze (arrays). Allgemeinere Realisierungen im Kapitel “Collections”. ■ Assoziationen und ihre Multiplizitäten prägen also die Gestalt der Objektnetze. class Mother { 0..* ... Mother Child Child[] kid; kid ... } ► class Child { ... Mother mom; ... } 0..1 Child mom Mother jane:Mother mom tom:Child jane:Mother mom Child tom = new Child(); tom.mom = jane; ... tom.mom = null; kid kid jane:Mother tom:Child kid[0] jane:Mother tom:Child tom:Child Mother jane = new Mother(); jane.kid[0] = tom; ... jane.kid[1] = sally; kid[1] 41 Prof. Uwe Aßmann, Softwaretechnologie Prof. Uwe Aßmann, Softwaretechnologie sally:Child 42 Programmierparadigmen Objektorientierte Programmierung ► Funktionale Programmierung: ■ Funktionsdefinition und -komposition, Rekursion Kein Zustandsbegriff fac(n) = if n = 0 then 1 else n * fac(n-1) end ■ ► Imperative Programmierung: Steuerfluß: Anweisungsfolgen, Schleifen, Prozeduren Variablen, Attribute (Zustandsbegriff) k := n; r := 1; while k > 0 do r := r*k; k := k-1 end; ■ My guess is that object-oriented programming will be in the 1980's what structured programming was in the 1970's. Everyone will be in favor of it. Every manufacturer will promote his products as supporting it. Every manager will pay lip service to it. Every programmer will practice it (differently!). And no one will know just what it is ..." ■ ► Formallogische Axiomensysteme (Hornklauseln) Fakten, Deduktionsregeln, Invarianten ■ kein Zustandsbegriff At the end of the day, you have to ■ Resolution put your data and operations fac(0,1). somewhere. fac(n+1, r) :- fac(n, r1), Martin Odersky mult(n+1, r1, r). ■ ■ Tim Rentsch (1982) Softwaretechnologie, © Prof. Uwe Aßmann Logische Programmierung: 43 Prof. Uwe Aßmann, Softwaretechnologie 44 Strukturparadigmen ► Orthogonalität Unstrukturierte Programmierung: Lineare Folge von Befehlen, Sprüngen, Marken (spaghetti code) k:=n; r:=1; M: if k<=0 goto E; r:=r*k; k:=k-1; goto M; E:... ■ ► Strukturiert Modular –– ML Pascal Modula-2 Ada Strukturierte Programmierung: Blöcke, Prozeduren, Fallunterscheidung, Schleifen Ein Eingang, ein Ausgang für jeden Block k := n; r := 1; while k > 0 do r := r*k; k := k-1 end; Objektorientiert ■ ■ ► Funktional Modulare Programmierung: Sammlung von Typdeklarationen und Prozeduren Klare Schnittstellen zwischen Modulen DEFINITION MODULE F; PROCEDURE fac(n:CARDINAL):CARDINAL; ... ■ ■ ► Haskell Imperativ Java C++ Objektorientierte Programmierung: Kapselung von Daten und Operationen in Objekte Klassen, Vererbung und Polymorphie public class CombMath extends Number { int fac(int n) ... ■ 45 Prof. Uwe Aßmann, Softwaretechnologie –– Logisch ■ OWL 46 Prof. Uwe Aßmann, Softwaretechnologie Kooperative Ausführung durch parallele Objekte (Sequenzdiagramm) Funktion und Daten • Separation von Funktion und Daten Zeit 12. Projektbesprechung M. Huber (Teiln.1) ... P. Fischer (Teiln. n) Raum R12 Neu Kollision? Funktionshierarchie Kollision? Datenbasis Reservierung • Integration von Funktion und Daten vormerken vormerken ► In den Strukturparadigmen: ■ strukturiert: ■ modular: Modul = (grosse) Funktionsgruppe + lokale Daten ■ objektorientiert: Prof. Uwe Aßmann, Softwaretechnologie Separation von Funktion und Daten Objekt = (kleine) Dateneinheit + lokale Funktionen 47 Kooperierende Objekte mit lokaler Datenhaltung Einfacher Übergang zu Parallelverarbeitung und Verteilung Prof. Uwe Aßmann, Softwaretechnologie 48 Objektorientierte Programmiersprachen Geschichte der OO-Programmierung ALGOL Simula C Smalltalk C++ Eiffel Pascal UCSD Pascal LISP BASIC CLOS Visual Basic Object Pascal (Delphi) Ada-95 Scheme Java C# 49 Die Programmiersprache Java ► Allan Kay: The Reactive Engine, Dissertation, Univ. Utah, 1969 ► Smalltalk: Allan Kay, Adele Goldberg, H. H. Ingalls, Xerox Palo Alto Research Center (PARC), 1976-1980 ► C++: Bjarne Stroustrup, Bell Labs (New Jersey), 1984 ► Eiffel: Bertrand Meyer, 1988 ► Java: Ken Arnold, James Gosling, Sun Microsystems, 1995 ► C#: Anders Heijlsberg, Microsoft (auch Schöpfer von Turbo Pascal) Prof. Uwe Aßmann, Softwaretechnologie Vorläufer von Java: OAK (First Person Inc.), 1991-1992 » Betriebssystem/Sprache für Geräte, u.a. interaktives Fernsehen ■ ► Java ist relativ einfach und konzeptionell klar. ► Java vermeidet “unsaubere” (gefährliche) Konzepte. ■ Strenges Typsystem » Java Applets für das World Wide Web ■ Kein Zugriff auf Speicheradressen (im Unterschied zu C) » 1996: Netscape Browser (2.0) Java-enabled ■ Automatische Speicherbereinigung 1995: HotJava Internet Browser ■ 2005: Java 1.5 mit Generizität ■ Weiterentwicklungen: ► Java ist unabhängig von Hardware und Betriebssystem. ■ » Java als Applikationsentwicklungssprache (Enterprise Java) ► » Java zur Gerätesteuerung (Embedded Java) ► » Java Smartcards sogenanntes multi-threading Java bietet die Wiederbenutzung von Klassenbibliotheken (Frameworks, Rahmenwerken) an ■ 51 Java Swing Library Java ermöglicht nebenläufige Programme. ■ ► Java Bytecode in der Java Virtual Machine Java ist angepaßt an moderne Benutzungsoberflächen. ■ » Java Beans, Enterprise Java Beans (Software-Komponenten) Prof. Uwe Aßmann, Softwaretechnologie 50 Warum gerade Java? Java™ - Geschichte: ■ Ole-Johan Dahl + Krysten Nygaard, Norwegen, 1967 Scala Prof. Uwe Aßmann, Softwaretechnologie ► Simula: Ada-83 Self Groovy ObjectTeams ► z.B. Java Collection Framework Prof. Uwe Aßmann, Softwaretechnologie 52 Objektorientierte Klassenbibliotheken (Frameworks, Rahmenwerke) ► Klassenbibliotheken sind vorgefertigte Mengen von Klassen, die in eigenen Programmen (Anwendungen) benutzt werden können ■ Java Development Kit (JDK) . Collections, Swing, ... Test-Klassenbibliothek Junit ■ Praktikumsklassenbibliothek SalesPoint ■ ► ► ■ ■ ► Eine Anwendung besteht nur zu einem kleinen Prozentsatz aus eigenem Code (Wiederverwendung bringt Kostenersparnis) 53 Warum ist das alles wichtig? Übung: Starte die JVM mit dem –verbose flag Grosse Bibliothek benötigt grossen Einarbeitungsaufwand Prof. Uwe Aßmann, Softwaretechnologie 54 The End Anfangsfrage: Wie können wir die Welt möglichst einfach beschreiben? Antwort: durch Objekte ■ ■ ► JVM startet langsam. Beim Start lädt sie zuerst alle Klassen (dynamic class loading), anstatt sie statisch zu einem ausführbaren Programm zu binden ■ ► Anders in C#! Man muss eine gewisse Zeit investieren, um die Klassenbibliothek kennenzulernen Man muss eine Menge von Klassenbibliotheken kennen Prof. Uwe Aßmann, Softwaretechnologie ► Keine konforme Vererbung: Man kann bei der Wiederbenutzung von Bibliotheksklassen Fehler machen und den Bibliothekscode invalidieren Basisdatentypen (int, char, boolean, array) sind keine Objekte Nachteil: Klassenbibliotheken sind komplexe Programmkomponenten. ■ ► ► Durch Vererbung kann eine Klasse aus einer Bibliothek angepasst werden ■ ► Probleme von Java ..und ihre Klassen, die sie abstrahieren . ... die Beziehungen der Klassen (Vererbung, Assoziation) .. ihre Verantwortlichkeiten Daher bietet Objektorientierung für Anwendungen, die mit der realen Welt zu tun haben, eine oftmals adäquate Entwicklungsmethodik an ■ ■ Die die Software einfach, d.h. analog zur Welt organisiert Und daher viele Probleme vermeidet und die Entwicklung erleichtert Prof. Uwe Aßmann, Softwaretechnologie 55 Prof. Uwe Aßmann, Softwaretechnologie 56