13.07.2015 Aufrufe

Informatik II für ET/MT - Professur für Mikrorechner

Informatik II für ET/MT - Professur für Mikrorechner

Informatik II für ET/MT - Professur für Mikrorechner

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Informatik</strong> <strong>II</strong> <strong>für</strong> <strong>ET</strong>/<strong>MT</strong>INF2­<strong>ET</strong>/<strong>MT</strong>Fortgeschrittene Eigenschaftenobjektorientierter Programmierung●●●VererbungInterfacesExceptionsProf. Dr.­Ing. Christian Hochberger<strong>Professur</strong> <strong>Mikrorechner</strong>Institut <strong>für</strong> Technische <strong>Informatik</strong>Fakultät <strong>Informatik</strong>TU Dresden


Bisheriger Stoff●●●●●Klassen zur Abstraktion und ModularisierungAnwendungen als Komposition von ObjektenBibliotheksklassen <strong>für</strong> viele StandardaufgabenWiederverwendungEntwurfsregeln– Für bessere Kohäsion– Für niedrigere KopplungChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 2


Datenfelder der MedienCDDVDtitelkünstlertitelanzahlspielzeithabIchtitelregisseurspielzeithabIchkommentarkommentarChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 4


Methoden der Medien●CDs und DVDs besitzen folgende Methoden:– setzeKommentar()– gibKommentar()– setzeVorhanden()– gibVorhanden()– ausgeben()●Alle übrigen Datenfelder werden im Konstruktorgesetzt(weil sie sich ja nicht mehr ändern)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 5


ObjektdiagrammMedienverwaltungcdsdvds:Datenbank:ArrayList:CD:CD :CD :CD:ArrayList:DVD :DVD :DVD :DVDChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 6


Methode setzeKommentar()●Klasse CDpublic void setzeKommentar(String text){kommentar=text;}●Klasse DVDpublic void setzeKommentar(String text){kommentar=text;}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 7


Methode gibKommentar()●Klasse CDpublic String gibKommentar(){return kommentar;}●Klasse DVDpublic String gibKommentar(){return kommentar;}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 8


Methodengleichheit●●Klasse CD und DVD sehr ähnlichViele Methoden identisch– setzeVorhanden() + gibVorhanden()– setzeKommentar() + gibKommentar()●Unterschiede nur– im Konstruktor (wegen unterschiedlicher Parameter)– in ausgeben()Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 9


Klasse Datenbank●Methode auflisten():public void auflisten(){for (CD cd : cds) {cd.ausgeben();System.out.println();}for (DVD dvd : dvds) {dvd.ausgeben();System.out.println();}}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 10


Klasse Datenbank (2)●CDs und DVDs erfassen:public void erfasseCD(CD cd){cds.add(cd);}public void erfasseDVD(DVD dvd){dvds.add(dvd);}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 11


Bewertung des Entwurfs●Viele Code­Duplizierungen:– Methoden von CD und DVD– Code­Fragmente in Datenbank●Beispiel: Erweiterung um Bücher– Noch mehr Code­Duplizierungen– Noch mehr gleiche Code­Fragmente in Datenbank●Schlechter Entwurf nach unseren Regeln(aber wie soll man es besser machen)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 12


Vererbung●●Neues Konzept objektorientierter SprachenIdee:– CD und DVD nicht unabhängig voneinander definieren– Stattdessen:●●●Zunächst Klasse definieren, die Gemeinsamkeitenvon beiden enthält (z.B. Medium)Dann CD als Erweiterung von Medium definieren(bei DVD analog)Klasse CD enthält nur die spezifischen Eigenschafteneiner CDChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 13


Vererbung (2)●●●CD und DVD enthalten alle Datenfelder vonMedium + die eigenen Datenfelder(Das gleiche gilt <strong>für</strong> Methoden)Vorteil dieses Konzepts:– Gemeinsame Eigenschaften werden nur einmalbeschriebenSprachregelungen:– Medium ist Superklasse (Oberklasse)– CD und DVD sind Subklassen (Unterklassen)– CD erbt von Medium(manchmal auch: CD erweitert Medium)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 14


Vererbung in KlassendiagrammenMediumtitelspielzeithabichkommentar// MethodenPfeil beschreibtVererbungsbeziehungtitelanzahlCDkuenstler// MethodenDVDregisseur// MethodenPfeilspitze zeigt auf SuperklasseChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 15


VererbungshierarchienChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 16


Vererbung in Javapublic class Medium{private String titel;private int spielzeit;private boolean habIch;private String kommentar;// Konstruktoren und Methoden ausgelassen}public class CD extends Medium{private String künstler;private int titelanzahl;// Konstruktoren und Methoden ausgelassen}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 17


Vererbung und Zugriffsrechte●●private und public Deklarationen von CD oderDVD gelten wie bisherErerbte Felder und Methoden– In Superklasse private:Bleiben private, sind nach außen nicht sichtbar– In Superklasse public:Bleiben public, können von außen genutzt werden●Felder und Methoden in der Superklasse private:– Subklasse kann auch nicht darauf zugreifen!Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 18


Vererbung und Initialisierung●Konstruktor von Medium:public class Medium{private String titel;private int spielzeit;private boolean habIch;private String kommentar;}public Medium(String titel, int länge) {this.titel=titel;spielzeit=länge;habIch=false;kommentar= ;}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 19


Vererbung und Initialisierung (2)●Konstruktor von CDpublic class CD extends Medium{private String künstler;private int titelanzahl;}public CD(String titel, String künstler,int stücke, int länge){super(titel,länge);this.künstler=künstler;titelanzahl=stücke;}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 20


Konstruktor der Superklasse●●●super(...) ruft Konstruktor der Superklasse aufMuss als erstes im Konstruktor geschehenFalls Aufruf von super() im Konstruktor fehlt:– Compiler ruft automatisch vor Beginn des Konstruktorssuper() auf(ohne Argumente)– Schlägt fehl, wenn es diesen Konstruktor nicht gibt– Guter Stil: Aufruf von super() immer hinschreibenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 21


Erweiterung derMedienverwaltungtitelspielzeithabichMediumkommentar// MethodentitelanzahlCDkuenstler// MethodenDVDregisseur// MethodenVideospielspieleranzahlplattform// MethodenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 22


Erweiterung derMedienverwaltung (2)Mediumtitelspielzeithabichkommentar// MethodenCDtitelanzahlkuenstler// MethodenDVDregisseur// MethodenVideospielSpielspieleranzahl// MethodenBrettspielplattform ...// Methoden // MethodenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 23


Subtypen●Klasse Datenbank mit Vererbung:public void erfasseMedium(Medium medium){medien.add(medium);}●●●Keine Unterscheidung von CD und DVD mehrNur ein Parameter vom Typ MediumBisherige Regelung:– Typ des aktuellen Parameters = Typ des formalenParametersChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 24


Subtypen (2)●●Subklassen definieren Subtypen– DVD ist ein Subtyp von MediumSubtypen dürfen immer anstelle des Typs derSuperklasse benutzt werden:Datenbank db=new Datenbank();CD cd=new CD(...);DVD dvd=new DVD(...);db.erfasseMedium(cd);db.erfasseMedium(dvd);●●cd wird wie ein Medium benutztdvd wird wie ein Medium benutztChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 25


Subtypen und Wertzuweisungen●●Variablen können Typen speichern,– die der Deklaration entsprechen– die einem Subtyp der Deklaration entsprechenFahrzeug f1=new Fahrzeug();Fahrzeug f2=new Auto();Fahrzeug f3=new Fahrrad();Beispiel:// Fehlerhafte ZuweisungAuto a1=new Fahrzeug();// Ebenso FehlerhaftAuto a2=new Fahrrad();Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 26


Subtypen als Parameter●Parameterübergabe ähnlich wie Wertzuweisung– Deklarierter (formaler) Parameter ist Medium– Aktueller Parameter ist Medium oder Subtyp davon(CD oder DVD)●Dadurch:Nur eine Methode zum Erfassen neuer MedienChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 27


Polymorphie●●●(Griechisch: Vielgestaltigkeit)Tritt in objektorientierten Sprachen an vielen StellenaufHier: Polymorphe Variablen– Variable kann verschiedene Typen aufnehmen:●●Den deklariertenJeden Subtyp davon– Vereinfachen oft den ProgrammentwurfChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 28


Cast Operator●Datenbank speichert nur Medium– Elemente der ArrayList können nicht an DVD oder CDzugweisen werden●●●Subtyp kann immer als Supertyp benutzt werden.Aber wie geht es andersrum?Benutzung als Medium hat zu Verlust anInformation geführtCast Operator erzwingt Rückverwandlung in SubtypChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 29


Cast Operator (2)Beispiele:Fahrzeug f;Auto a;●a=new Auto();f=a;a=(Auto)f;Fahrzeug f;Auto a;Fahrrad rad;a=new Auto();f=a;//Fehler beim Übersetzenrad=(Fahrrad)a;// Fehler zur Laufzeitrad=(Fahrrad)f;Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 30


Klasse Object●●●●Alle Klassen haben eine SuperklasseOhne explizite Angabe:Klasse Object ist Superklasse(Klasse Object hat selbst keine Superklasse)Object ist Element der StandardbibliothekObject als gemeinsame Superklasse aller Klassenerfüllt zwei Zwecke:– Object enthält Methoden, die alle Klassen erben– Object kann als Universal­Stellvertreter benutzt werdenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 31


Wrapper Klassen●Nur Speicherung von Objekten in Sammlungenmöglich●Was ist mit Werten vom Typ int, boolean, ...●Java definiert Wrapper­Klassen:– Integer gehört zu int, Boolean gehört zu boolean,...– Beispiel:int i=18;Integer iwrap=new Integer(i);– Diese Klassen können in Sammlungen benutzt werdenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 32


Autoboxing●Compiler erkennt, wenn primitiver Typ anstelleeines Objektes benutzt wird– Automatische Umwandlung in Objekt der passendenWrapper­KlasseArraylist zahlen;zahlen=new ArrayList();zahlen.add(42);– Kann an vielen Stellen die Arbeit erleichtern(z.B. Schlüssel in HashMap)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 33


Unboxing●Umkehrung des Autoboxing– Objekt einer Wrapper­Klasse wird anstelle despassenden primitiven Typs verwendet– Objekt wird automatisch in primitiven Typ umgewandeltArraylist zahlen;zahlen=new ArrayList();zahlen.add(42);int ersteZahl=zahlen.remove(0);Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 34


Vererbung in Sammlungstypen●●●●●●Sammlungstypen nutzen selbst auch Vererbung:ArrayList erbt von AbstractListVector und LinkedList erben auch vonAbstractListGemeinsame Funktionalität dieser Sammlungen istin AbstractList implementiertAbstractList erbt von AbstractCollectionAbstractSet erbt auch vonAbstractCollectionChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 35


Zusammenfassung●Vererbung– erlaubt gemeinsame Funktionalität aus verschiedenenKlassen herauszuziehen– ermöglicht Polymorphie(Verwendung von Subtypen anstelle des Supertyps)– kann hierarchisch aufgebaut sein●Alle Klassen gehören zu einer Vererbungshierarchie– Entweder explizite Angabe der Superklasse– Oder implizit Object als SuperklasseChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 36


Zusammenfassung (2)●Subklassen– erben alle Datenfelder und Methoden der Superklasse– fügen den geerbten Datenfeldern und Methoden eigenehinzu– definieren Subtypen, die dann polymorph benutzt werdenkönnen●Vererbung– vermeidet Code­Duplizierung– verbessert Wartbarkeit und WiederverwendbarkeitChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 37


Übersicht: Vererbung (2)●Polymorphe Methoden– Statischer und dynamischer Typ– Überschreiben von Methoden– Dynamische Methodensuche– Generelle ObjekteigenschaftenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 38


Medienverwaltung: Ausgaben●Annahme: Folgende beiden Medien werden in dieMedienverwaltung eingetragen:CD: YES: Time and a Word8 Titel, 40 Minutenhab Ich: jaKommentar: Wichtigstes YES-AlbumDVD: Die ReifeprüfungRegisseur: Mike Nichols105 Minutenhab Ich: NeinKommentar: Muss man kennenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 39


Medienverwaltung: Ausgaben (2)●●Ausgaben in der Version ohne Vererbung:CD: Time and a Word (40 Min)*YesTitelanzahl: 8Wichtigstes YES-AlbumDVD: Die Reifeprüfung (105 Min)Mike NicholsMuss man kennenAusgaben sind den Medien angepasst(CD anders als DVD)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 40


Medienverwaltung: Ausgaben (3)●●Ausgaben der Version mit Vererbung:CD: Time and a Word (40 Min)*Wichtigstes YES-AlbumDVD: Die Reifeprüfung (105 Min)Muss man kennenAusgaben unvollständig– Bei CD fehlt Titelanzahl und Künstler– Bei DVD fehlt Regisseur●Methode ausgeben() in Klasse Medium definiert– Zugriff nur auf Datenfelder, die in Medium deklariert sindChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 41


ausgeben() in den Subklassen●Erster Lösungsansatz:– Verschieben der Methodeausgeben() in dieSubklassen– Methoden können AusgabenDatenbankMedium●individuell aufbereitenNicht übersetzbar:– CD+DVD: Zugriff auf Feldervon Medium nicht erlaubt– Datenbank: Methodeausgeben() nicht gefundenCDDVDausgebenausgebenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 42


ausgeben() nicht gefunden?●●Codefragment aus Klasse Datenbank:// In Methode auflisten()for (Medium medium : medien) {medium.ausgeben();System.out.println();}●Compiler meldet, dass Medium keine Methodeausgeben() enthält (Stimmt ja auch)Subklassen enthalten diese Methode, aber– Woher soll der Compiler das wissen?– Wer garantiert, dass alle Subklassen diese Methodeenthalten?Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 43


Statischer + dynamischer Typ●Beispiel: Fahrzeug f1=new Auto();●Welchen Typ hat die Variable f1?– f1 ist ein Fahrzeug– Das referenzierte Objekt ist aber ein Auto!●Sprachregelung:– Fahrzeug ist der statische Typ von f1(wie die Variable deklariert wurde)– Auto ist der dynamische Typ von f1(Klasse des Objektes, auf das die Referenz weist)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 44


ausgeben() nicht gefunden (2)●Analyse von medium.ausgeben()– Statischer Typ ist Medium– Dynamischer Typ ist CD oder DVD●Compiler prüft beim Übersetzen den statischen Typ– Dynamischer Typ meistens erst zur Laufzeit bekannt– Compiler kann nicht alle Subklassen kennen●Damit medium.ausgeben() funktioniert:– Medium muss Methode ausgeben() enthalten– Statische Typprüfung funktioniert dannChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 45


Überschreiben von Methoden●●●Was passiert, wenn sowohlMedium, als auch CD undDVD ausgeben()enthalten?Alle drei Methoden haben diegleiche Signatur(Parameterliste undRückgabetyp)CD und DVD enthalten nurdie spezialisierten TeileDatenbankMediumausgebenCDDVDausgebenausgebenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 46


Überschreiben von Methoden (2)public class Medium {public void ausgeben() {System.out.print(titel+" ("+spielzeit+" Min)");if (habIch) System.out.println("*");else System.out.println();System.out.println(kommentar);}}public class CD extends Medium {public void ausgeben() {System.out.println(" "+kuenstler);System.out.println(" "+titelanzahl+" Titel");} public class DVD extends Medium {} public void ausgeben() {System.out.println(" Regisseur:"+regisseur);}}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 47


ausgeben() in Medium undSubklassen●Programmlauf ergibt:YesTitelanzahl: 8●Regisseur: Mike NicholsErkenntnisse:– Daten aus Medium fehlen– ausgeben() von CD und DVD wird offensichtlichausgeführt– Typüberprüfung berücksichtigt statischen Typ– Zur Laufzeit werden nur die Methoden des dynamischenTyps ausgeführtChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 48


Dynamische Methodensuche●Mechanismus der Ausführung von Methoden:– Methodensuche (method binding, method dispatch)●Beispiel ohne Vererbung:v1.ausgeben();DVDDVD v1;:DVDInstanz vonausgebenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 49


Methodensuche mit Vererbung●Beispiel mit Vererbung(ausgeben() als Methodevon Medium)Mediumausgebenv1.ausgeben();DVDDVD v1;:DVDInstanz vonChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 50


Regeln <strong>für</strong> die Methodensuche1.Zugriff über Variable2.Referenziertes Objekt wird ermittelt3.Klasse des Objektes wird ermittelt4.Klasse wird nach Methode durchsucht5.Methode gefunden: Aufrufen6.Methode nicht gefunden:Superklasse der Klasse ermitteln, weiter bei 4.(Methode muss gefunden werden, sonst hätte derCompiler nicht übersetzt!)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 51


Methodensuche mit Vererbung (2)●Beispiel mit Vererbung(ausgeben() in DVD undMedium)Mediumausgebenv1.ausgeben();DVDMedium v1;ausgeben:DVDInstanz vonChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 52


Besonderheiten derMethodensuche●●●●Keine besonderen Regeln <strong>für</strong> überschriebeneMethodenDynamischer Typ entscheidet, welche Methodegefunden wird(Variable war vom Typ Medium, trotzdem wurdeMethode aus DVD gefunden)Überschreibende Methoden haben Vorrang vorMethoden aus SuperklassenNur die letzte Version einer Methode wirdausgeführt (die aus der/den Superklassen nicht)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 53


super­Aufrufe in Methoden●●●Ausgabe Problem besteht weiterWie kann ausgeben() von Medium benutztwerden?Lösung:– Überschriebene Methode muss aufgerufen werden– Ähnlich wie bei Konstruktoren– super.Methodenname() ruft eine Methode in derSuperklasse aufChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 54


super()­Eigenschaften●Im Gegensatz zum Konstruktor­Aufruf:– Methode der Superklasse wird explizit benannt– super­Aufruf kann an beliebiger Stelle in Methodegeschehen– super­Aufruf muss nicht erfolgen(und wird auch nicht vom Compiler generiert)●Super­Aufruf ansonsten wie normalerMethodenaufruf– Verschiedene Parameterlisten möglich– Ergebnisse können verwendet werdenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 55


ausgeben() mit super­Aufruf●Modifizierte Methode der Klasse CD:public class CD extends Medium {public void ausgeben() {super.ausgeben();System.out.println(" "+künstler);System.out.println(" "+titelanzahl+" Titel");}}●Ausgabe (fast wie gewünscht):CD: Time and a Word (40 Min)Wichtigstes YES-AlbumYes8 TitelChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 56


Methoden­Polymorphie●Weitere Form der Polymorphie– Polymorphe Methodensuche●Methodenaufrufe in Java polymorph:– Aufgerufene Methode kann vielgestaltig sein– Auswahl der Methode hängt vom Objekttyp ab●Obwohl im Quelltext immer der gleicheMethodenname benutzt wird, können verschiedeneMethoden ausgeführt werdenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 57


Methoden aus Object:toString()●Object als universelle Superklasse implementiertMethoden, die alle Objekte erben:– toString() liefert einen String, der eine textuelleRepräsentation des Objektes darstellt– Methode aus Object liefert String folgender Gestalt:DVD@194df86 (Klassenname@Adresse)●Sehr nützlich– Kann in Subklassen überschrieben werden– Jede Klasse kann so eine individuelle String­DarstellungdefinierenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 58


ausgeben() mit toString()●Zweiteilung:– toString() liefert nur eine textuelle Darstellung– ausgeben() gibt diesen Text auspublic class Medium {public String toString() {String zeile1 = titel + " (" + spielzeit + " Min)";if (habIch) zeile1 += "*";return zeile1 + "\n" + " " + kommentar + "\n";}}public void ausgeben() {System.out.println(toString());}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 59


Klasse CD mit toString()●CD kann auch toString() von Medium benutzenpublic class CD extends Medium {public String toString() {return super.toString() + " " + künstler+ "\n " + titelanzahl + " Titel\n";}}●public void ausgeben() {System.out.println(toString());}toString() flexibler als ausgeben():– Aufrufer kann den String beliebig verwendenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 60


Medienverwaltung:Verbesserte Ausgabe●Medium, CD und DVD brauchen garkeine Methodeausgeben() mehr:public class Datenbank {...public void auflisten() {for (Medium medium : medien){System.out.println(medium.toString());}}}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 61


System.out.println()●Besonderheit– Argument ist String: String wird ausgegeben– Argument ist kein String: Methode toString() desArguments wird aufgerufen●Vereinfachung der Methode auflisten():System.out.println(medium);Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 62


Einfachste Form von auflisten()public class Datenbank {...public void auflisten() {for (Medium medium : medien) {System.out.println(medium);}}}●●●●medium ist DVD oder CDmedium ist kein StringMethode toString() wird aufgerufenPassender Text wird ausgegeben, da CD und DVDdiese Methode (sinnvoll) überschreibenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 63


Zugriffsrechte: protected●Da Vererbung eine spezielle Beziehung zw.Klassen darstellt:– public und private sind nicht ausreichend– Neues Zugriffsrecht: protected●Bedeutung von protected:– Klasse und Subklassen dürfen zugreifen– Andere Klassen dürfen nicht zugreifen– Gilt <strong>für</strong> Datenfelder und Methoden– (protected <strong>für</strong> Datenfelder meist akzeptabel)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 64


public, protected, privateKlientpublicprivateEineKlasseprotectedSubklasse1Subklasse2Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 65


Zuul mit Vererbung●●●Idee: Implementierung eines Teleporter­Raums– Beim Betreten oder Verlassen wird ein zufälliger RaumausgesuchtOriginal Code­Fragment:...naechsterRaum = aktuellerRaum.gibAusgang(richtung);...Mögliche Lösung:...if (aktuellerRaum.gibName().equals("Teleporter-Raum") {naechsterRaum = gibZufälligenRaum();} else {naechsterRaum=aktuellerRaum.gibAusgang(richtung);}...Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 66


Zuul mit Vererbung (2)●●Bessere Lösung (unabhängig vom Raumnamen):...if (aktuellerRaum==teleporterRaum) {naechsterRaum = gibZufälligenRaum();} else {naechsterRaum=aktuellerRaum.gibAusgang(richtung);}...Noch bessere Lösung (mehrere Teleporter möglich):...if (aktuellerRaum.istTeleporterRaum()) {naechsterRaum = gibZufälligenRaum();} else {naechsterRaum=aktuellerRaum.gibAusgang(richtung);}...Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 67


Zuul mit Vererbung (3)●Mit Hilfe von Vererbung noch besser:public class TeleporterRaum extends Raum {public Raum gibAusgang(String richtung) {return gibZufälligenRaum();}private Raum gibZufälligenRaum();// Implementierung ausgelassen}}●Noch besser, weil– Raum nicht angepasst werden muss– Spiel nicht verändert werden mussChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 68


Zusammenfassung●Unterscheidung von statischem und dynamischemTyp– statischer Typ: Typprüfung bei der Übersetzung– dynamischer Typ: Methodensuche zur Laufzeit●Ermöglicht Überschreiben von Methoden– Überschreibende Methode wird auch benutzt, wennSuperklasse diese Methode aufruft●super.methode() erlaubt den Aufruf derüberschriebenen MethodeChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 69


Zusammenfassung (2)●toString() in Object– ist in allen Objekten implementiert– kann von allen Klassen sinnvoll überschrieben werden●protected als neues Zugriffsrecht– Subklassen dürfen zugreifen– Alle anderen dürfen nicht zugreifenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 70


Objektorientierte Spezialitäten●Bisher: Vererbung als wesentliches Element vonobjektorientierten Sprachen– Polymorphie (Klassen und Methoden)●Weitergehende Eigenschaften vonobjektorientierten Sprachen– Abstrakte Klassen + Methoden– Mehrfachvererbung– InterfacesChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 71


Beispiel: Simulation●Simulationen wichtiges Hilfsmittel in derWissenschaft– Ermöglichen Voraussagen– Erlauben hypothetische Eingriffe in die simulierte Welt– Helfen bei der Modellbildung●Typische Simulationen:– Wettervorhersage, Verkehrssimulation, Schaltungen,Kernphysik, Biologie, ...Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 72


Umweltsimulation●Ausgangslage:– Durch ein Naturschutzgebiet soll eine Autobahn gebautwerden.– Durch die Autobahn wird das Naturschutzgebiet in zweikleinere Gebiete zerteilt– Hat diese Trennung Auswirkungen auf die Populationenmit Beute­ und Jäger­Tieren?●Eine Simulation kann diese Frage evtl. klären– Aussagekraft der Simulation bleibt noch zu klärenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 73


Füchse + Hasen●●●●Betrachtung einer Population von Füchsen undHasen auf einem abgeschlossenen FeldModellierung des Zusammenlebens von Beute­ undRaubtierEinfluss der Gebietsgröße auf Überlebenschancenkann studiert werdenAusgangspunkt unserer Betrachtungen:– Lauffähiger Simulator (mit relativ schlechter Struktur)– Zunächst: Verständnis <strong>für</strong> Simulation erlangenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 74


KlassendiagrammChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 75


Aufbau der Simulation●Simulator, Fuchs, Hase, Feld und Position bildendas Modell der Simulation– Feld: Zweidimensionales begrenztes Feld aus Positionen(Spalten und Zeilen)– Position: Kann nur von einem Tier belegt werden– Fuchs: Einfaches Modell eines Jäger­Tiers– Hase: Einfaches Modell eines Beute­Tiers– Simulator: Steuert den Ablauf der SimulationChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 76


Aufbau der Simulation (2)●SimulationsAnsicht, FeldStatistik und Zaehler sindnur <strong>für</strong> die grafische Darstellung nötig– SimulationsAnsicht stellt das Feld grafisch dar– FeldStatistik liefert die Anzahl der Füchse und Hasen– Zähler speichert aktuelle Zahl der Exemplare einerTierart●Offensichtlich keine Vererbung enthaltenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 77


Die Klasse Hasepublic class Hase {private static final int GEBEAR_ALTER=5;private static final int MAX_ALTER=50;private static final double GEBAER_WAHRSCHEINLICHKEIT=0.15;private static final int MAX_WURFGROESSE=5;private int alter;private boolean lebendig;private Position position;public void laufe(Feld naechstesFeld, List neueHasen) {alterErhoehen();if (lebendig) {int geburten=gebaereNachwuchs();for (int i=0; i


Die Klasse Hase (2)if (neuePosition != null) {setzePosition(neuePosition);naechstesFeld.platziere(this, neuePosition);} else {lebendig=false;}}}private void alterErhoehen() {alter++;if (alter>MAX_ALTER) lebendig=false;}private int gebaereNachwuchs() {int geburten=0;if (kannGebaeren() &&rand.nextDouble()


Die Klasse Hase (3)●Statische Variable steuern Lebenszyklus der Hasen– Maximales Alter, Gebärwahrscheinlichkeit, Wurfgröße,min. Alter zum Gebären●Verhalten der Hasen in laufe() definiert– älter werden– evtl. Kinder bekommen– freies Nachbarfeld suchen (keins frei => Hase stirbt)●Starke Vereinfachungen gegenüber echten HasenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 80


Die Klasse Fuchspublic class Fuchs {private static final int GEBEAR_ALTER=10;private int alter;private boolean lebendig;private Position position;private int futterLevel;public void jage(Feld aktuellesFeld, Feld naechstesFeld,List neueFuechse) {alterErhoehen();hungerVergroessern();if (lebendig) {int geburten=gebaereNachwuchs();for (int i=0; i


}}Die Klasse Fuchs (2)Position neuePosition = findeNahrung(aktuellesFeld,position);if (neuePosition == null) {neuePosition=naechstesFeld.freieNachbarposition(position);}if (neuePosition != null) {setzePosition(neuePosition);naechstesFeld.platziere(this,neuePosition);} else {lebendig=false;}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 82


Die Klasse Fuchs (3)private Position findeNahrung(Feld feld, Position pos) {Iterator nachbarn=feld.nachbarpositionen(pos);while (nachbarn.hasNext()) {Position pos=nachbarn.next();Object tier=feld.gibObjektAn(pos);if (tier instanceof Hase) {Hase hase= (Hase)tier;if (hase.istLebendig()) {hase.setzeGefressen();futterLevel=HASEN_NAEHRWERT;return pos;}}}return null;}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 83


Die Klasse Fuchs (4)●●Lebenszyklus von Füchsen wird ebenfalls durchstatische Variablen definiertVerhalten wird durch Methode jage() definiert– älter werden und hungriger werden– evtl. Kinder gebären– Nahrung suchen– keine Nahrung => freies Nachbarfeld suchen●Nahrung suchen prüft, ob Hase auf einemNachbarfeld vorhandenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 84


Operator instanceof●●Spezieller Operator (Rückgabewert boolean)a instanceof B prüft,– ob der dynamische Typ von a die Klasse B ist– oder ob der dynamische Typ von a ein Subtyp vonKlasse B ist(wegen Klassen­Polymorphie)●Kann benutzt werden, um polymorphe Objekte mitgleicher Superklasse zu unterscheiden●Tritt häufig zusammen mit Cast­Operator aufChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 85


Initialisierung●Private Instanzfelder des Simulators:– List hasen, List fuechse– Feld feld, naechstesFeld– int schritt– Simulationsansicht ansicht●●Instanzfelder richtig initialisierenSimulation zurücksetzen– Listen löschen– Felder leer räumen– feld bevölkernChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 86


simuliereEinenSchritt()public void simuliereEinenSchritt() {schritt++;// Platz <strong>für</strong> neugeborene Hasen anlegen.List neueHasen = new ArrayList();// Alle Hasen agieren lassen.for(Iterator it=hasen.iterator(); it.hasNext(); ) {Hase hase = it.next();hase.laufe(naechstesFeld, neueHasen);if(!hase.istLebendig()) {it.remove();}}// Neu geborene Hasen in die Liste der Hasen einfügen.hasen.addAll(neueHasen);Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 87


}Fortsetzung vonsimuliereEinenSchritt()List neueFuechse = new ArrayList();// Alle Füchse agieren lassen.for(Iterator it=fuechse.iterator(); it.hasNext(); ) {Fuchs fuchs = it.next();fuchs.jage(feld, naechstesFeld, neueFuechse);if(!fuchs.istLebendig()) {it.remove();}}// Neu geborene Füchse in die Liste der Füchse einfügen.fuechse.addAll(neueFuechse);Feld temp=feld;feld=naechstesFeld;naechstesFeld=temp;naechstesFeld.raeumen();ansicht.zeigeStatus(schritt, feld);Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 88


Verbesserung der Simulation●●●Offensichtliche Code­Duplizierungen insimuliereEinenSchritt()Enge Kopplung zw. Simulator und Hase, bzw.FuchsBessere Struktur durch Vererbung– Hase und Fuchs haben viele Gemeinsamkeiten– Refactoring durchführen– Superklasse Tier herausziehen– Simulator vereinfacht sichChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 89


Superklasse Tier●Gemeinsame Eigenschaften von Fuchs und Hase– Datenfelder alter, lebendig und Position– Methoden istLebendig() und setzePosition()müssen dann auch in Tier verschoben werden(wg. Zuständigkeitsprinzip)– Anfangswerte werden im Konstruktor von Tier gesetzt●Sichtbarkeit der Datenfelder– könnte protected sein, führt aber zu hoher Kopplung– lieber private und dann sondierende/veränderndeMethoden in Tier einbauenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 90


Superklasse Tier (2)●Verallgemeinerungen von Fuchs und Hase– Hase besitzt Methode setzeGefressen()(wird vom Fuchs in findeNahrung() aufgerufen)– Hase und Fuchs ändern lebendig in alterErhoehen()und hungerVergroessern()– Besser: In Tier eine Methode setzeGestorben()einführen– Kann dann in den Subklassen benutzt werden●Weitere Verbesserungen nicht ohne weiteresmöglichChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 91


Methode agiere() in Tier●●Bisher nur Verbesserungen in den Klassen Fuchsund HaseVerbesserungen in Simulator nur durch weitereVerallgemeinerungen möglich:– Methoden jage() und laufe() werden durchallgemeine Methode agiere() ersetzt– Schnittstelle der Methode muss Übermenge der beidenbisherigen Methoden sein:public void agiere(Feld aktuellesFeld,Feld naechstesFeld, List neueTiere)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 92


Verbesserter Simulatorfor (Iterator it=tiere.iterator(); it.hasNext(); ) {Tier tier=it.next();if (tier.istLebendig()) {tier.agiere(feld, naechstesFeld, neueTiere);} else {it.remove();}}●●Funktioniert aber nur, wenn Tier eine Methodeagiere() mit den richtigen Parametern enthältWas soll diese Methode in Tier tun?(Wir können nichts sinnvolles <strong>für</strong> ein Tier angeben,anders als bei Medium)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 93


Abstrakte Methoden●Bisherige Situation:– Wunsch: Alle Tiere sollen agiere() besitzen– Voraussetzung: Tier muss agiere() enthalten– Subklassen können agiere() überschreiben●●Problem: Superklasse kann die Methode nichtsinnvoll implementierenEffekt:– Superklasse muss leere Methode enthalten– Subklassen können leere Methode überschreiben(müssen es aber nicht!)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 94


Abstrakte Methoden (2)●●Neues Sprachkonstrukt: abstract– Zusätzliche Qualifikation einer Methodendeklaration:abstract public void agiere(Feld feld,Feld naechstes Feld, List neueTiere);Bedeutung:– Deklariert nur den Methodenkopf●●– Enthält keine ImplementierungMethode muss in Subklassen überschriebenwerden!(Aber was passiert, wenn eine Instanz derSuperklasse erzeugt wird?)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 95


Abstrakte Klassen●Abstrakte Methoden dürfen nur in abstraktenKlassen deklariert werden:public abstract class Tier {...abstract public void agiere(Feld feld,Feld naechstesFeld, List neueTiere);}●●Instanzen von abstrakten Klassen nicht erlaubtKonsequenz:– Alle (nicht abstrakten) Subklassen von Tier müssenagiere() überschreibenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 96


Abstrakte Klassen (2)●Sinn abstrakter Klassen– Es können keine Instanzen davon erzeugt werden– Abstrakte Methoden dürfen nur in abstrakten Klassenauftreten– Instanzen können nur erzeugt werden, wenn eine Klasse●auch Implementierungen <strong>für</strong> alle abstrakten Methodender Superklasse anbietetAbstrakte Klassen stellen sicher, dass alleSubklassen dieser Klasse eine bestimmte Methodebesitzen!Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 97


Erweiterung der Simulation●●●Einführung eines neuen Tiers relativ einfach(als Subklasse von Tier)Was aber, wenn man einen Jäger einführen will?(Es sind aber auch beliebige andere Elementedenkbar, die nicht als Tier zu modellieren sind)Einführung einer Klasse Akteur– Enthält Gemeinsamkeiten von Tier und Jaeger– Kann Superklasse <strong>für</strong> alle aktiven Elemente derSimulation seinChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 98


Neue VererbungshierarchieAkteurTierJägerHaseFuchsChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 99


Selektive Darstellung●●Bei sehr vielen verschiedenen Akteuren– Vielleicht will man nicht alle Akteure visualisierenVerwendung von zwei Listen(akteure + zeichenbare)for (Akteur akteur : akteure) {akteur.agiere();}for (Zeichenbar zeichenbar : zeichenbare) {zeichenbar.zeichnen();}●Voraussetzung: Darstellbare Akteure müssenSubklassen von Zeichenbar seinChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 100


Mehrfachvererbung●●●●Zeichenbare Akteure erben von den SuperklassenZeichenbar und AkteurStruktur wird Mehrfachvererbung genanntIm Prinzip beliebig viele Superklassen möglichSubklasse verfügt dann über Eigenschaften allerSuperklassenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 101


Mehrfachvererbung (2)ZeichenbarAkteurTierJägerHaseFuchsAmeiseChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 102


Interface●Mehrfachvererbung oft problematisch– Effiziente Umsetzung sehr schwer– Was passiert, wenn zwei Superklassen verschiedeneDinge gleich benennen?– Nicht in allen OO­Programiersprachen enthalten●Java:– Interfaces statt Mehrfachvererbung– Interfaces sind ähnlich wie Klassen●Definieren Signatur von Methoden (keineImplementierung)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 103


Interfaces in Javapublic interface Akteur {void agiere(Feld feld,Feld naechstesFeld,List neueTiere);}●●●●●interface statt class in der DeklarationMethoden sind abstrakt (enthalten keinen Rumpf)Interfaces enthalten keine KonstruktorenAlle Methoden sind automatisch publicInterfaces können nur konstante Datenfelderenthalten (final)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 104


Interfaces in Java (2)●Einbindung eines Interfaces in eine Klasse:public class Fuchs extends Tier implements Akteur {...}●extends muss vor implements stehen●Mehrfachvererbung <strong>für</strong> Interfaces möglich:public class Jaeger implements Akteur, Zeichenbar {...}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 105


Interfaces als Typen●Subklassen stellen einen Subtyp dar– dadurch Klassen­Polymorphie möglich– Supertyp wird als allgemeiner Stellvertreter allerSubtypen benutzt●Ebenfalls mit Interfaces möglich:– Interfaces stellen eigenen Typ dar– Klassen, die ein Interface implementieren, dürfen andiesen Typ zugewiesen werden– (Es gibt allerdings keine Instanzen von Interfaces)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 106


Abstrakte Klasse oder Interface?●Abstrakte Klasse:– Wenn Datenfelder gebraucht werden– Wenn Teilimplementierungen möglich sind●Wenn beides möglich ist:– Interface bevorzugen– Flexiblere Benutzung dann möglich(weil eine Klasse mehrere Interfaces implementierenkann, aber nur von einer Klasse erben kann)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 107


Übersicht: Fehlerbehandlung + IO●●●Fragen der FehlerbehandlungInformationen über Fehler weitergebenExceptions– Wie sie entstehen– Wie sie behandelt werden●Einfache Dateibehandlung:– Lesen + Schreiben von TextdateienChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 108


FehlersituationenMögliche Ursachen <strong>für</strong> logische Programmfehler:●●●Lösung <strong>für</strong> ein Problem ist nicht korrektimplementiertGewünschte Dienstleistung kann von einem Objektnicht erbracht werdenObjekt wird anders verwendet als geplant. Objektgerät in inkonsistenten ZustandViele dieser Fehler können nicht durch guten Entwurfvermieden werden!Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 109


Beispiel Adressbuch●Anwendung zur Verwaltung persönlicher Kontakte– Namen, Adressen, Telefonnummern, ...– Suche über Name oder Telefonnummer●Funktionen:– Prüfen ob Kontakt bekannt– Kontakt ermitteln (eindeutig) oder suchen (alle)– Kontakt anlegen und löschen– Kontakt ändern– Anzahl Einträge ermittelnChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 110


Dienstleistungsobjekte●Adressbuch typisches Dienstleistungsobjekt– Aktion nur auf Anforderung von außen– Anforderung kommt von Klienten●Mögliche Annahmen <strong>für</strong> den Entwickler einesDienstleisters– Alle Klienten wissen was sie tun und nur sinnvolle undkorrekte Anfragen treten auf– Anfragen können aus fehlerhafter Umgebung kommen.Dienstleister muss Maßnahmen ergreifen um falscheBenutzung zu unterbindenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 111


Fragen der Fehlerbehandlung●Aus Sicht des Dienstleisters:– Wie weit sollen Anfragen überprüft werden?– Wie sollen Fehler gemeldet werden?●Aus Sicht des Klienten:– Wie können Scheiterungsgründe vorhergesehenwerden?– Wie soll mit dem Scheitern einer Anfrage umgegangenwerden?Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 112


Zu viel Vertrauen!●entferneKontakt() geht von korrektemSchlüssel auspublic class Adressbuch {public void entferneKontakt(String schlüssel) {Kontakt kontakt=buch.get(schlüssel);buch.remove(kontakt.gibName());anzahlEinträge--;}}●Wenn Schlüssel nicht in buch vorhanden:– kontakt wird null– Zugriff auf Kontakt führt zu Laufzeitfehler(NullPointerException)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 113


Prüfen von Parametern●Falsche Parameter sind häufigste Fehlerursache– Konsequenz: Prüfen, ob Parameter korrekt istpublic class Adressbuch {public void entferneKontakt(String schlüssel) {if (schlüsselBekannt(schlüssel)) {Kontakt kontakt=buch.get(schlüssel);buch.remove(Kontakt.gibName());anzahlEinträge--;}}}●Nicht existente Schlüssel werden ignoriert(sollte auch in der Dokumentation der Methodestehen)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 114


Fehlermeldung durch Dienstleister●Vermeiden von Fehlern alleine nicht ausreichend– Fehlerhafte Parameter meist vom Klient verursacht– Klient oder Benutzer sollte davon erfahren●●Wie sollten Fehlersituationen gemeldet werden?Verschiedene Antworten möglich:– Benutzer informieren– Klienten informierenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 115


Benutzer informieren●Zwei Möglichkeiten:– Ausgabe einer Fehlermeldung über System.out– Öffnen eines Fensters mit Fehlertext●Beide Ansätze sind problematisch– Viele Anwendungen haben keinen Benutzer:Fehlermeldung bliebe unbeachtet(Beispiel: elektronische Zündung im Auto)– Benutzer kann oft nicht auf Fehlermeldung reagieren(Beispiel Bankautomat: Was sollen Sie beiNullPointerException machen?)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 116


Klienten informieren●Zwei Möglichkeiten– Ergebniswerte des Dienstleisters können Erfolg oderFehler signalisieren– Dienstleister kann Exception werfen:●Neues Java­Konzept, aber auch in anderen SprachenvorhandenVorteil: Klient muss sich um Scheitern von AufrufenGedanken machen●Nur das Werfen von Exceptions erzwingt eineFehlerbehandlungChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 117


Informieren durch Ergebnis●Wenn Methode bisher void war (kein Ergebnis)– void in boolean ändern (true ⇒ Erfolg, false ⇒ Fehler)public class Adressbuch {public boolean entferneKontakt(String schlüssel) {if (schlüsselBekannt(schlüssel)) {Kontakt kontakt=buch.get(schlüssel);buch.remove(Kontakt.gibName());anzahlEinträge--;return true;} else {return false;}}}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 118


Klient mit Fehlerbehandlung●Klient fragt Ergebnis ab– Gegebenenfalls Fehlerbehandlung durchführenif (adressbuch.entferneKontakt("...")) {// Eintrag erfolgreich entfernt; normal weiter} else {// Entfernen schlug fehl// Wenn möglich, sinnvolle Fehlerbehandlung...}●Was macht man, wenn Methode schon einErgebnis liefert?Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 119


Spezielle Ergebnisse●Beispiel:Kontakt kontakt=adressbuch.gibKontakt(schlüssel);String telefon=kontakt.gibTelefon();...●●Boolesches Ergebnis nicht mehr möglichAlternative:– Speziellen Wert als Signal <strong>für</strong> Fehler zurückgeben– Bei Objekttypen wird häufig null da<strong>für</strong> verwendet(Kann ja kein normales Ergebnis sein)– Klient kann darauf reagierenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 120


Spezielle Ergebnisse (2)Kontakt kontakt=adressbuch.gibKontakt(schlüssel);if (kontakt != null) {// Kontakt gefunden, normal weiterarbeitenString telefon=kontakt.gibTelefon();...} else {// Eintrag nicht gefunden.// Wenn möglich, sinnvolle Fehlerbehandlung}public Kontakt gibKontakt(String schlüssel) {if (schlüsselVorhanden(schlüssel) {return buch.get(schlüssel);} else {return null;}}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 121


Spezielle Ergebnisse: Probleme●●●Was passiert, wenn alle Ergebnisse auftretenkönnen?⇒ Verfahren kann so nicht benutzt werdenKlient kann nicht zum Prüfen des Ergebniswertesgezwungen werden⇒ Fehler bleibt möglicherweise unbemerktSpezielle Ergebniswerte können sowohl falscheAnfragen als auch Erfolg/Misserfolg signalisieren⇒ Misserfolg etwas anderes als falsche Anfrage!Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 122


Exceptions●Spezielle Objekte– Werden im Fehlerfall erzeugt– Enthalten Informationen über den Fehler●Vorteile gegenüber speziellen Ergebnissen:– Klient kann Exception nicht ignorieren●Ohne Behandlung durch Klienten führt Exception zumProgrammabbruch– Exception­Mechanismus beeinflusst normale ErgebnissenichtChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 123


Auslösen einer Exceptionpublic Kontakt gibKontakt(String schlüssel) {if (schlüssel == null) {throw new NullPointerException("Parameter in gibKontakt ist null.");} else {return buch.get(schlüssel);}}●●●Auslösen besteht aus zwei Schritten– Erzeugen eines Exception­Objekts (new ...)– Werfen der Exception (Schlüsselwort throw)Exception kann mit Fehlertext erzeugt werdenDokumentation kann Werfen von Exceptionsanzeigen (@throws)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 124


Exception­KlassenThrowableStandard­BibliotheksklassenBenutzerdefinierte KlassenErrorExceptionMeineGeprüfteExceptionRuntimeExceptionMeineUngeprüfteExceptionChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 125


Exception­KategorienZwei mögliche Exception Typen:●Ungeprüfte Exceptions– Müssen Subklasse von RuntimeException sein– Sollen Fälle abdecken, die normalerweise eigentlich nichtauftreten sollen●Geprüfte Exceptions– Sollen Fälle abdecken, in denen der Klient mit einemFehler rechnen kann (z.B. beim Öffnen von Dateien oderbeim Schreiben in Dateien)– Verwendung wird durch den Compiler geprüftChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 126


Auswirkungen einer Exception●Auswirkung auf ausführende Methode– Wird sofort beendet– Es wird kein Ergebnis geliefert●Auswirkung auf Aufrufer– Auslösende Anweisung wird nicht vollendet– Klient kann Fehlersituation nicht ignorieren(dann wird das Programm eben abgebrochen)– Klient kann Exceptions fangen(muss sich dann aber auch darum kümmern)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 127


Ungeprüfte Exceptions●●●Werden vom Compiler nicht geprüftSollen verwendet werden, wenn dadurch vermutlichdas Programm abgebrochen wirdHäufig als IllegalArgumentException benutzt– Signalisiert, dass übergebene Parameter ungültig sind– Überprüfung der Parameter sollte am Anfang einer●Methode/Konstruktor geschehenAndere typische Runtime Exceptions:NullPointerException,ArrayIndexOutOfBoundsExceptionChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 128


Objekterzeugung verhindern●●Konstruktor kann normalerweise keine FehlersignalisierenMit Exceptions:– Konstruktor stellt fehlerhafte Parameter fest– Konstruktor wirft passende Exception– Kann im Konstruktor genauso geschehen wie innormalen Methoden●Mögliche Exception Typen:– IllegalStateException,IllegalArgumentExceptionChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 129


Geprüfte Exceptions:Methodendeklaration●●●Methoden, die geprüfte Exceptions werfen können,müssen das im Methodenkopf ankündigen:public void speichereDatei(Stringname) throws IOException { ... }Schlüsselwort throws steht vor der möglichenExceptionIst auch <strong>für</strong> ungeprüfte Exceptions möglich(wird aber nicht empfohlen)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 130


Exceptions fangen●●Geprüfte Exceptions müssen behandelt werdenTypischerweise durch try-catch Blocktry {// eine oder mehrere geschützte Anweisungen}catch (ExceptionTyp e) {// die Exception melden oder// eventuell wieder aufsetzen}●try und catch Block können beliebig vieleAnweisungen enthaltenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 131


Ablauf beim Fangen●Exception tritt im try­Block auf:Hier tritt die Exception aufString Dateiname = null;try {dateiname = vom Benutzer abfragen;adressbuch.speichereInDatei(dateiname);}catch (IOException e) {System.out.println("Speichern in "+dateiname+" schlug fehl");}Ausführung wird hier fortgesetzt– Ausführung wird im catch­Block fortgesetzt●Keine Exception im try­Block:– catch­Block wird nicht ausgeführtChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 132


Umgang mit mehreren Exceptions●●Methoden können mehrere verschiedeneExceptions werfenAlle geworfenen Exceptions müssen imMethodenkopf deklariert werdenpublic void verarbeite()throws EOFException, FileNotFoundException {...}●Aufrufende Methode muss alle ExceptionsbehandelnChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 133


Mehrere Exceptions (2)try {...ref.verarbeite();...}catch (EOFException e) {// Behandlung des Dateiende-Fehlers}catch (FileNotFoundException e) {// Behandlung, wenn Datei nicht vorhanden}●●●Mehrere catch­Blöcke können dem try­Block folgencatch­Blöcke werden der Reihe nach durchsuchtcatch­Block wurde beendet: Ausführung wird nachdem letzten catch­Block fortgesetztChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 134


Mehrere Exceptions (3)●Durchsuchen der catch­Blöcke:– Erster passender Block wird ausgewählt– Durch Polymorphie können mehrere verschiedeneExceptions auf einmal beschrieben werden– Superklasse einer Exception fängt auch die Exception●Allgemeinste catch­Klausel:catch (Exception e) { ... }Fängt alle denkbaren Exceptions●Meistens kann auf einzelne Exceptions dann nichtmehr reagiert werdenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 135


Exceptions propagieren●●Exceptions sollten immer in der aufrufendenMethode gefangen und behandelt werdenAusnahme:– Exception kann hier nicht sinnvoll behandelt werden– In umschließender Methode ist Behandlung möglich●Exception kann nach außen weitergereicht werden(propagieren)– Keinen Exception­Handler angeben– Exception in throws­Klausel der Methode aufnehmenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 136


finally Klausel●●●Optionaler Block mit AnweisungenFolgt auf letzten catch­BlockWird in jedem Fall ausgeführt (egal ob eineException aufgetreten ist oder nicht)try ● {// zu schützende Anweisungen}catch (Exception e) {// Behandlung der Exception}finally {// Gemeinsame Aktion, die in jedem Fall ausgeführt// werden muss}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 137


finally­Klausel (2)●Kann der Inhalt der Finally­Klausel nicht hinter denletzten catch­Block geschrieben werden?try {// zu schützende Anweisungen}catch (Exception e) {// Behandlung der Exception}// Gemeinsame Aktion, die in jedem Fall ausgeführt// werden muss●finally­Klausel wird auch ausgeführt wenn– im catch­Block eine return­Anweisung steht– eine Exception auftritt, die nicht gefangen wurdeChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 138


Neue Exception­Typen definieren●Eigene Exception­Klassen können definiert werden– Subklasse von Exception (geprüfte Exception)– Subklasse von RuntimeException (ungeprüft)●●●Immer dann sinnvoll, wenn spezielle Situationbeschrieben werden sollKonstruktor kann Fehlerursache als ParametererhaltenKann später bei Fehlerbehandlung abgefragtwerdenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 139


Zusicherungen●Code geht oft stillschweigend von erfülltenBedingungen aus:– Kontakt enthält mindestens ein gefülltes Feld– Entfernen eines Kontakt über einen Schlüssel ­­>Schlüssel nicht mehr in Benutzung●Wünschenswert: Bedingungen mit in den Codeaufnehmen– Während der Entwicklung Bedingungen prüfen– Wenn Programm fertig, Prüfung entfernenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 140


Zusicherungen (2)●Mögliche Realisierung– Über if­Anweisungen: Exception werfen, wennBedingung nicht erfüllt– Problem: Muss von Hand entfernt werden, wennProgramm fertig●Bessere Lösung:– Spezielles Sprachmittel vorsehen– In Java: AssertionsChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 141


assert●Zwei Formen möglich:– assert conditioncondition kann beliebiger boolescher Ausdruck sein– assert condition : "Textmeldung"●Wenn condition false liefert– AssertionError erzeugen– Werfen des Errors führt zum Programmabbruch– Optionale Textmeldung an Konstruktor übergebenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 142


assert (2)●Prüfung der assert Bedingungen– Muss explizit beim Compilieren aktiviert werden– Ohne Aktivierung keine Laufzeitbeeinflussung●Bedingungen können auch boolesche Methodensein– Möglichkeit, spezielle Prüfmethoden zu schreiben– Gefahr, wenn Methoden Seiteneffekte habenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 143


assert ­ Beispiel●Methode entferneKontakt() im Adressbuchpublic void entferneKontakt(String schluessel) {if(schluessel == null){throw new IllegalArgumentException("Param 'schluessel', entferneKontakt null.");}if(schluesselBekannt(schluessel)) {Kontakt kontakt = buch.get(schluessel);buch.remove(kontakt.gibName());buch.remove(kontakt.gibTelefon());anzahlEintraege--;}assert !schluesselBekannt(schluessel);assert konsistenteGroesse() :"Inkonsistente Buchgröße in entferneKontakt";}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 144


Richtlinien <strong>für</strong> die Nutzung vonassert●●Nur Zustand prüfenImmer Vermeiden:– Zustand der beteiligten Objekte ändern!– Reguläre Funktionalität in assert­Anweisungen●Wenn Assertions abgeschaltet sind, funktioniertCode nicht mehrChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 145


Datei Ein­/Ausgabe●Exceptions bei Ein­/Ausgabe unvermeidlich– Platte voll, Datei nicht zugreifbar, ...●●Ein­/Ausgabe im Paket java.io gesammeltHier nur ein einfaches Beispiel:– Schreiben einer Textdatei– Lesen einer Textdatei●Wer mehr wissen möchte:http://java.sun.com/docs/books/tutorial/essential/index.htmlChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 146


Textausgaben mit FileWriter●Drei Schritte zum Schreiben einer Textdatei:– Öffnen der Datei– Schreiben der Daten– Schließen der Datei●●●Alle Schritte können Exceptions auslösenDatei wird durch Konstruktor geöffnetErst beim Schließen wird sichergestellt, dass alleDaten auf die Platte geschrieben werdenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 147


FileWriter Benutzung●Konstruktor des FileWriter Objekts– Argument des Konstruktors wählt Datei aus(String oder File Objekt)– Datei existiert: Datei wird überschrieben– Datei existiert nicht: Datei wird angelegt– Spezielle Version zum Anhängen an bestehende Dateien●Schreiben in die Datei– write() mit verschiedenen Argumenten(String oder char[])Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 148


Beispiel FileWritertry {FileWriter writer = new FileWriter(Dateiname);while (noch Text auszugeben) {writer.write(nächster Textabschnitt);}writer.close();}catch (IOException e) {// Beim Zugriff ist ein Fehler aufgetreten}●Behandlung von Fehlern möglicherweise nur beimAufrufer des Codes möglichChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 149


Einlesen mit FileReader●●●●●Einlesen von Textdateien über die KlasseFileReaderÄhnliche Schritte wie beim Schreiben (Öffnen,Lesen, Schließen)Aber: FileReader bietet nur eine Funktion zumEinlesen von ZeichenEinlesen von Zeilen müsste über eine Schleifesolange lesen, bis das Zeilenende auftauchtSpezielle Klasse da<strong>für</strong>: BufferedReaderChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 150


BufferedReader●●Bekommt beim Erzeugen ein FileReader ObjektübergebenMethode readline()– liest eine Zeile als String ein– Zeichen <strong>für</strong> Zeilenende ist nicht enthalten– liefert null am Ende der Datei●Kann auch mit anderen Readern kombiniert werden(StringReader, InputStreamReader, ...)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 151


Beispiel FileReadertry {BufferedReader reader = new BufferedReader(new FileReader(Dateiname));String zeile=reader.readline();while (zeile != null) {// Eingelesene Zeile behandelnzeile=reader.readline();}reader.close();}catch (FileNotFoundException e) {// Datei nicht gefunden}catch (IOException e) {// Beim Einlesen ist ein Fehler aufgetreten}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 152


Übersicht: Anwendungsentwurf●●●●●●Analyse und EntwurfVerb/Substantiv­MethodeCRC­KartenSzenariosGeschäftsfälle ("use cases")EntwurfsmusterChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 153


Analyse und Entwurf●Bisherige Situation:– Klassenaufteilung gegeben– Klassenaufteilung adhoc geschehen●●Bei großen Projekten nicht so einfach möglichGesucht:– Strukturierter Weg, Klassenaufteilung und Interaktion derKlassen zu finden– Allgemein als (objektorientierte) Analyse und EntwurfbezeichnetChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 154


Analyse und Entwurf (2)●Eigene Forschungsrichtung des Software­Engineering– Viele verschiedene Ansätze möglich– Umfangreiche Literatur verfügbar●Hier nur ein relativ einfacher Ansatz:– Klassenaufteilung mit der Verb/Substantiv­Methode– Klassenentwurf mit CRC­KartenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 155


Verb/Substantiv Methode●Ziel:– Finden der Klassen und Objekte <strong>für</strong> einenProblembereich– Feststellen der Interaktionen der Objekte●Vorgehensweise:– Substantive entsprechen Klassen und Objekten– Verben entsprechen Methoden●Ausgangspunkt:– Informelle Beschreibung der AufgabeChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 156


Beispiel: Kinobuchungssystem●Aufgabe:– System, mit dem die Plätze <strong>für</strong> Kinovorstellungenverwaltet werden können– Telefonische Vorbestellung von Karten– Freie Plätze finden und <strong>für</strong> Besucher reservieren●Meistens in Form eines Pflichten/Lastenheftes– Gute Pflichtenhefte zu erstellen ist sehr schwer– Häufig unterschiedliche Interpretation zw. Auftraggeberund ProgrammiererChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 157


●Beispiel Kinobuchungssystem (2)Beschreibung des Kinobuchungssystems:Das Kinobuchungssystem sollte Platzreservierungen <strong>für</strong>mehrere Kinosäle verwalten. Jeder Kinosaal hat Plätze, diein Reihen angeordnet sind. Kinobesucher können Plätzereservieren und bekommen eine Reihen­ und Platznummerzugewiesen. Sie können nach nebeneinander liegendenPlätzen fragen.Jede Platzreservierung gilt <strong>für</strong> eine bestimmte Vorstellung(also einen bestimmten Film zu einem bestimmtenZeitpunkt). Vorstellungen finden zu festgelegten Zeitpunktenan festgelegten Tagen statt und sind einem Kinosaalzugeteilt, in dem sie gezeigt werden. Das System speichertdie Telefonnummer des Kinobesuchers.Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 158


Klassen identifizierenSubstantive: Verben:Kinobuchungssystemverwaltet (Platzreservierungen)speichert (Telefonnummern)PlatzreservierungenKinosaalhat (Plätze)PlatzReiheKinobesucherreserviert (Plätze)bekommt zugewiesen (Reihe + Platz)fragt nach (nebeneinander liegenden Plätzen)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 159


Klassen identifizieren (2)Substantive:ReihennummerPlatznummerVorstellungFilmZeitpunktTagTelefonnummerVerben:wird zugeteilt (Kinosaal)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 160


Klassen identifizieren (3)●Alle Substantive stellen zunächst potenzielleKlassen dar– Evtl. noch Egänzungen nötig– Manche Klassen werden evtl. nicht gebraucht●Substantive werden im Singular aufgeschrieben– Klassen werden meist exemplarisch beschrieben(eher Klasse Kino, als Klasse Kinos)– Vervielfachung geschieht über Bildung von InstanzenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 161


CRC­Karten●●●Entwurf: Festlegen der Interaktionen der KlassenEinfaches Hilfsmittel: CRC­Karten(Class/Responsibilities/Collaborators)Für jede Klasse eine Pappkarte nach folgendemSchema:Klassenname PartnerklassenZuständigkeitenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 162


Szenarios●●●●Durchspielen von Szenarios erlaubt Festlegung derKlasseninteraktionenSzenarios sind prototypische Beispiele <strong>für</strong> denEinsatz und die Arbeit des SystemsWerden auch manchmal als Geschäftsfälle (engl.use cases) bezeichnetBeim Durchspielen werden die CRC­Kartenaktualisiert(Zuständigkeiten, Partnerklassen)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 163


Bespiel­Szenario 1●Einfaches Szenario:Benutzer ruft an und möchte <strong>für</strong> Harold und Maudeheute abend zwei Karten buchenErforderliche Aktionen:●Kinoangestellter möchte alle Vorstellungen vonHarold und Maude am heutigen Tag finden.– CRC­Karte Buchungssytem●●Zuständigkeit: Kann Vorstellung nach Filmtitel undTag findenPartnerklassen: VorstellungChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 164


Bespiel­Szenario 1 (2)●Wie findet Buchungssystem die Vorstellungen?– Lösung: Buchungssystem speichert eine Sammlung allerVorstellungen– Klasse Sammlung (kann später verfeinert werden)– CRC­Karte Buchungssystem●●Zuständigkeit: Speichert eine Sammlung vonVorstellungenPartnerklassen: SammlungChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 165


Bespiel­Szenario 1 (3)●Annahme: Suche ergibt 17 30 , 21 00 und 23 30●Kunde wählt Vorstellung um 21 00●Angestellter möchte Infos zu dieser Vorstellungabrufen (Kinosaal, freie Plätze, etc.)– CRC­Karte Buchungssystem●Zuständigkeit: Ruft Details einer Vorstellung ab undzeigt sie an– CRC­Karte Vorstellung●Zuständigkeit: Liefert Infos über Kinosaal und Anzahlfreier PlätzeChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 166


Bespiel­Szenario 1 (4)●Annahme: Noch reichlich freie Plätze●Kunde wählt Plätze 13+14 in Reihe 12– CRC­Karte Buchungssystem●●Zuständigkeit: Nimmt Platzreservierung entgegenWie läuft die Platzreservierung ab?– Reservierung gehört zu einer Vorstellung– Buchungssystem sollte also Vorstellung überReservierung informieren (oft als delegieren bezeichnet)– CRC­Karte Vorstellung●Zuständigkeit: Kann Plätze reservierenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 167


Bespiel­Szenario 1 (5)●●●●Klasse Vorstellung soll einen Platz reservierenInformationen über Kinosaal erforderlich– CRC­Karte Vorstellung●●Zuständigkeit: Speichert KinosaalPartnerklasse: KinosaalJede Vorstellung hat eigene Instanz des KinosaalsReservierung kann an Kinosaal delegiert werden– CRC­Karte Kinosaal●Zuständigkeit: Akzeptiert ReservierungsanfrageChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 168


Bespiel­Szenario 1 (6)●●Wie geht der Kinosaal vor?Verschiedene Möglichkeiten, die Plätze zuspeichern– Allgemeine Sammlung aller Plätze(nicht so gut, wegen Anfragen nach nebeneinanderliegenden Plätzen)– Sammlung von Reihen (die dann Plätze speichern)– CRC­Karte Kinosaal●Zuständigkeit: Speichert Reihen●Partnerklasse: ReiheChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 169


Bespiel­Szenario 1 (7)●CRC­Karte Reihe– Zuständigkeit: Speichert Sammlung von Plätzen– Partnerklassen: Platz●●Kinosaal findet gewünschte Reihe und delegiertAnfrage an die Reihe– CRC­Karte Reihe●●Zuständigkeit: Akzeptiert Reservierungsanfrage <strong>für</strong>einen PlatzZuständigkeit: Kann Platz über Nummer findenPlatz­Objekt wird informiert, dass Platz reserviert istChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 170


Bespiel­Szenario 1 (8)●CRC­Karte Platz– Zuständigkeit: Akzeptiert Reservierungen– Zuständigkeit: Speichert Reservierungszustand●●Speichert der Platz auch, wer ihn reserviert hat?Verschiedene Varianten möglich:– Telefonnummer und Name– Kundenobjekt (enthält Telefonnummer und Name)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 171


Weitere Szenarios●●●●●Kunde möchte fünf zusammenhängende PlätzereservierenKunde hat Platznummern vergessenKunde möchte Reservierung stornierenKunde möchte weiteren Platz neben bereitsreservierten Plätzen habenVorstellung wird abgesagt. Kunden müsseninformiert werdenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 172


Weitere Szenarios (2)●Ganz andere Art von Szenarios noch erforderlich:– Einrichten des Systems <strong>für</strong> ein neues Kino(Verschiedene Kinosäle mit verschiedenenPlatzanordnungen)– Neuen Film einrichten(Zeitraum und Spielzeiten einrichten, Kinosaal zuweisen)●Wichtig beim Durchspielen der Szenarios– Alle Aktionen exakt durchdenken und notieren– Vollständigkeit der Szenarios wichtig(es dürfen keine wichtigen Fälle ausgelassen werden)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 173


Klassenentwurf●Ursprüngliche Kartenmenge wurde verändert– Neue Karten hinzugekommen (z.B. Sammlung)– Nicht benutzte Karten wurden entfernt●●Jede CRC­Karte (die noch vorhanden ist) wird zueiner Java­KlasseSchnittstellen der Klassen (öffentliche Methoden)– Ergeben sich aus den Zuständigkeiten●Datenfelder der Klassen– Ergeben sich zum Teil auch aus den ZuständigkeitenChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 174


Entwurf der Klassenschnittstellen●●Exakte Spezifikation der Schnittstellen z.B. durchnochmaliges Durchspielen der SzenariosDabei bei jeder Interaktion genau feststellen– welche Argumente übergeben werden– welches Ergebnis geliefert wird– welche Datenfelder benötigt werden●Für alle Methoden zunächst nur Stubs schreiben(Methodenkopf ohne Implementierung)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 175


Dokumentation●Nach Spezifikation der Klassen und Schnittstellen– Dokumentation durch Klassenkommentar undMethodenkommentare– Genau beschreiben, was der Zweck der Klasse undMethoden ist– (Wird auch gerne von Anfängern vernachlässigt)●Immer beschreiben, was passieren soll, nicht wie●Besonders wichtig in Team­Projekten (und das sindin der Realität die meisten)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 176


Entwicklungsphilosophie●Klassische Vorgehensweise:– Vorentwickelte Klassen werden Programmierern zum"Ausprogrammieren" zugewiesen– Wird durch objektorientierten Ansatz sehr gut unterstützt●Alternative:– Pair­Programming: Erstellen der Klassenimplementationim Zweier­Team– Vorteil: Fehler und strukturelle Schwächen werdenbesser vermieden– Modernste Philosophie: Extreme ProgrammingChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 177


Wasserfallmodell●Feste Reihenfolge der Phasen derSoftwareentwicklung:– Analyse des Problems– Entwurf der Software– Implementierung der Softwarekomponenten– Modultests– Integrationstests– Auslieferung an den Kunden●Schlägt eine Phase fehl, dann zurück zurvorherigen PhaseChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 178


Iterative Modelle●Wasserfall schlägt fehl, wenn– Die Entwickler die Funktionalität nicht richtig verstandenhaben– Die Software später geändert werden muss●Iterative Vorgehensweisen helfen in diesen Fällen– Vollständiges System wird nicht von Anfang enwickelt,sondern erst durch mehrere Iterationen– (Rapid) Prototyping– Modell vom Software­WachstumChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 179


Prototyping●●●Funktionalität der Anwendung oder Klasse wirdnicht vollständig implementiert, sondern nurvorgespiegeltErlaubt sehr schnelles Testen, ob Anwendung demKundenwunsch entsprichtTypischer Zyklus:– Analyse – Entwurf – Implementierung – FeedbackChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 180


Software­Wachstum●●Beginn mit einfachem, sauber entworfenem SystemMinimale Funktionalität vorhanden– Sofort einsetzbar– Weitere Funktionalität wird kontrolliert schrittweisehinzugefügt●●Software wächst (anstatt von Anfang vollständig zusein)Entspricht viel mehr den Erfordernissen der realenWeltChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 181


Entwurfsmuster●Wiederverwendung und gute Lesbarkeitwesentliche Ziele guten Entwurfs– Bisher auf einzelne Klassen beschränkt●Hauptproblem bei großen Systemen:– Beziehungen zw. Klassen zu verstehen(nicht die einzelnen Klassen)●Konsequenz:– Wiederverwendung auch auf Struktur von Klassenübertragen– Dadurch auch die Lesbarkeit verbessernChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 182


Entwurfsmuster (2)●Entwurfsmuster liefern allgemeine Lösungen <strong>für</strong>häufig auftretende Probleme– Eine Menge von Klassen– Die Interaktion der Klassen●Vorteile bei Verwendung von Entwurfsmustern– Dokumentation der Programme fällt leichter– Diskussion über alternative Entwürfe fällt leichter(wenn Entwickler ein Standard­Vokabular <strong>für</strong> Musterverwenden)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 183


Struktur von Mustern●Darstellung von Entwurfsmustern:– Name (wichtig, damit alle vom gleichen reden)– Problembeschreibung(Zweck, Motivation, Anwendbarkeit)– Lösungsbeschreibung(Struktur, Teilnehmer, Partner)– Konsequenzen (Vor­ und Nachteile)●Großer Satz von Standard­Mustern verfügbarChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 184


Dekorierer●●Hinzufügen von Funktionalität zu einemexistierenden Objekt– Erhalten der bisherigen Schnittstelle, aber●●Verändern des VerhaltensOder Erweiterung der SchnittstelleVererbung nur statisch möglich●Dekorierer: BufferedReader:Reader:Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 185


Singleton●●Manchmal soll nur eine Instanz einer Klasseerzeugt werden (z.B. Zuul:Parser)Lösung:– Konstruktor als private deklarieren– Zugriff über statische Methodeclass Parser {private static Parser instanz=new Parser();public static Parser gibInstanz() {return instanz;}private Parser() {...}}Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 186


Fabrikmethode●Definiert eine Schnittstelle zur Erzeugung vonObjekten– Klient erwartet Superklasse– Fabrikmethode liefert eine Spezialisierung (Subklasse)●Beispiel: Iterator– Alle Subtypen von Collection liefern einen Iterator(ArrayList, LinkedList, HashSet, ...)– Iterator ist in Wirklichkeit ein Subtyp von Iterator, der zurentsprechenden Sammlung passt(z.B. ArrayListIterator, ...)Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 187


Beobachter●●●Häufig Trennung von internem Modell und AnsichterwünschtBeobachter­Muster definiert 1­zu­n Relation– Beliebig viele Beobachter zum gleichen Modell– Alle Beobachter werden bei Änderungen des ZustandsbenachrichtigtMithilfe abstrakter Klassen realisiert«abstract» SubjektmeldeAn(Beobachter)meldeAb(Beobachter)benachrichtige()«abstract» Beobachteraktualisiere()Chr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 188


Zusammenfassung●●●●Entwurf und Analyse wichtigster Teil desSoftwareentwurfsVerb/Substantiv­Methode und CRC­Karten alseinfache Hilfsmittel <strong>für</strong> strukturierteVorgehensweiseEntwicklungsmodelle (Software­Wachstum)EntwurfsmusterChr. Hochberger, Inf2­<strong>ET</strong>/<strong>MT</strong> 189

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!