Abstrakte Datentypen Daten und Operationen Mögliche Implementierungen Veränderbare Typen, Ergebnistypen
Einheit von Daten und Operationen Daten und Operationen auf Daten gehören zusammen Konto: Daten: name, nummer, kontostand Datum Operationen überweisen, abheben, Daten: tag, monat, jahr Operationen istschaltjahr, addieretage, Student Daten: name, geburtsdatum, semester Operationen scheinausstellen, einschreiben, Programmierer sollte dies beherzigen Modellierung Programmiersprache muss das unterstützen Klassen, Module, Units
Datenkapselung Daten sollen nur kontrolliert verändert werden Kontostand nur durch überweisen, abheben Datum nur durch adddays, addmonth addsekunde getstunde Daten geheim getminute getsekunde Erzeugung Konstruktoren Ablesung Selektoren ( getter Veränderung Mutatoren ( setter Methoden bilden Kapsel um die Daten addminute addstunde Class UhrZeit Repräsentation im Inneren versteckt Class Konto{ private kontostand; } Class Datum{ private msecseit1970; } Class Student{ private Date geburtsdatum; private String name, vorname; Repräsentation kann man nachträglich ändern, ohne dass der Anwender etwas merkt Ob Uhrzeit ern als msec seit Mitternacht oder als Tripel (h,m,s gespeichert wird ist egal
Benutzersicht - Programmierersicht Klassendiagramme Signaturen aller Methoden public - private # protected Wichtig für Entwurf Implementierung Dokumentation Zusätzliche Spezifikation notwendig 0 getmin( 59 { getmin( = A} addminute(; { getmin( = A1 } Klassendiagramm UML-Notation Uhrzeit # # msecs «constructor» «constructor» Uhrzeit( Uhrzeit( «getter» «getter» getstunde( getstunde( getminute( getminute( getsekunde( getsekunde( «setter» «setter» addstunde( addstunde( n n addminute( addminute( n n addsekunde( addsekunde( n n Die Namen der formalen Parameter sind irrelevant, daher werden wir sie später oft weglassen class Uhrzeit{ protected msecs; public Uhrzeit( { } } public getstunde({ } Implementierung z.b. in Java
Daten und Operationen in der Mathematik Aus der Mathematik kennen wir Ein Gruppe ist eine Menge G mit Operationen : G G G -1 : G G e : G die gewisse Gleichungen erfüllen.. e G -1 Eine Boolesche Algebra ist eine Menge B mit Operationen, : B B B : B B 0,1 : B die gewisse Gleichungen erfüllen Ein Körper ist eine Menge K mit Operationen,-,*, -1 : K K K 0,1 : K Wobei gewisse Gleichungen erfüllt sein müssen. Die Operation -1 ist partiell d.h. nicht überall definiert. Ein Vektorraum über einem Körper K ist eine Menge V mit Operationen, - : V V V 0 : V : K V V Gruppe «constructor» «constructor» Gruppe( Gruppe( «operators» «operators» Gruppe Gruppe mal(gruppe mal(gruppe Gruppe Gruppe invers( invers( Gruppe Gruppe neutral( neutral( Solche mathematischen Gebilde, bestehend aus einer oder mehreren Mengen und Operationen und evtl. noch Gleichungen, nennt man Algebren.
Die komplexen Zahlen Grundmenge C=R R = { (x,y x,y R } Statt (x,y schreibt man auch : xiy Operationen : C C C * : C C C Re, Im : C R Im(z i z Definition der Operationen: (x 1,y 1 (x 2,y 2 = (x 1 x 2,y 1 y 2 (x 1,y 1 * (x 2,y 2 = (x 1 *x 2 - y 1 *y 2, x 1 *y 2 y 1 *x 2 Eine reelle Zahl r kann man mit der komplexen Zahlen (r,0 identifizieren r (r,0. Dabei werden die Operationen erhalten: Re(z r 1 r 2 (r 1,0 (r 2,0 = (r 1 r 2,0 r 1 r 2 r 1 * r 2 (r 1,0 * (r 2,0 = (r 1 * r 2,0 r 1 * r 2 Für die spezielle Zahl i = (0,1 gilt: i * i = (0,1 * (0,1 = (0*0-1*1,0*11*0 = (-1,0-1 Für eine beliebige komplexe Zahl c=(x,y hat man: c = (x,y = (x,o (0,y = x*(1,0 y*(0,1 = x i*y
Spezifikation Grundmenge: R R Operationen: : * : Re : R Im : R Gleichungen: Definierende Gleichungen für add, mult, Re, Im (x 1,y 1 (x 2,y 2 = (x 1 x 2,y 1 y 2 (x 1,y 1 * (x 2,y 2 = (x 1 *x 2 - y 1 *y 2, x 1 *y 2 y 1 *x 2 Re(x,y = x Im(x,y = y Zusätzliche Gleichungen analog wie für R. Gleichungen können bisher nur als Kommentare angegeben werden «constructors» «constructors» ( ( (float, (float, float float «ops» «ops» sum(, prod(, prod(, «getter» «getter» float float getrealteil( getrealteil( float float getimaginärteil( getimaginärteil( String String tostring( tostring(
Implementierung in Java Datentypen modelliert durch Klassen Grundmenge: Kombination von Feldern Operationen Methoden Hier: Grundmenge float float Re getrealteil Im getimaginärteil
Operationen als statische Methoden In der Darstellung der Operation : sind beide Argumente gleichberechtigt. dies modellieren wir, wenn wir add als Klassenmethode (static implementieren:
Ein Testaufruf Statische Methoden wie sum, prod sind Methoden der Klasse. Ein Aufruf verlangt als Adressat der Methode den Namen der Klasse:.sum(z1,z2 Bei dem Aufruf aus der definierenden Klasse, kann der Adressat entfallen. prod(z1,z2
Objektorientierte Modellierung Bei einer Objektmethode ist das Objekt, nicht die Klasse, der Adressat der Methode. Eine Operation vom Typ f : K C 1 C 2 C n D wird in der Klasse K durch eine Java-Methode der folgenden Signatur implementiert: D f (C 1 x 1, C 2 x 2,, C n Das fehlende Argument der Operation ist implizit this K «ops» «ops» D f(c f(c 1, 1,, C n n.. Operationen liefern neuen Wert Ein Aufruf ist ein Expression und liefert einen Wert vom Typ D.
Komplexe Zahlen - OO Die Operationen : * : werden als Objekt-Methoden mit der Signatur plus( z mal( z implementiert. Das erste Argument der Operation ist Empfänger der Methode. this Komplexe Zahlen Zahlen «construktors» «construktors» ( ( (float, (float, float float «Ops» «Ops» plus( plus( mal( mal( «getter» «getter».. Operationen liefern neue komplexe Zahl Ein Aufruf ist ein Expression vom Typ :
als veränderbarer Typ Die Operationen : * : werden jetzt als Anweisungen implementiert: Berechne Ergebnis Speichere es im Empfänger Operationen verändern das Objekt this kein new «Konstruktoren» «Konstruktoren» «Operatoren» «Operatoren» add( add( mult( mult( «Selektoren» «Selektoren» z *= i ; z = z;
Veränderung von Objekten Ein StringBuffer ist eine veränderbare (mutable Variante von String Umwandlungen mit Konstruktoren StringBuffer(String s String(StringBuffer b Methoden verändern this StringBuffer append(stringbuffer sb; StringBuffer insert( offset, String str Der alte name ist verändert
Veränderbare Typen - Ergebnistypen Veränderbare Typen (engl.: mutable Types Methoden verändern ihr Objekt Beispiel: Konto, Telefonbuch, Arrays Konto meins = new Konto( HP,1000; Konto deins = new Konto( Du,200; deins.überweise(meins,500; System.out.prln(meins.getKontoStand(; Ergebnistypen Können nicht verändert werden Methoden liefern immer ein neues Objekt. Altes Objekt bleibt unverändert Beispiel: String,, Der alte name unverändert
Veränderbare - und Ergebnistypen Veränderbare Typen erkennt man an der Signatur der Operationen: Aufgabe: Implementiere f : K C 1 C n K In einer Klasse K als Mutator f(c 1 x 1,,C n x n K fehlt als Argument, Ergebnistyp. Aufrufe sind Anweisungen, sie verändern ihren Aufrufer x.f(a 1,,a n x wird modifiziert In einem Ergebnis- oder Werttyp K (engl.: immutable als: K f(c 1 x 1,,C n x n Aufrufe sind Expressions, sie liefern ein komplett neues Objekt K y = x.f(a 1,,a n ; x bleibt unverändert «Konstruktoren» «Konstruktoren» «Mutatoren» «Mutatoren» add( add( mult( mult( «Selektoren» «Selektoren» veränderbar «Konstruktoren» «Konstruktoren» «Operationen» «Operationen» plus( plus( mal( mal( «Selektoren» «Selektoren».. Ergebnistyp