Grundkonzepte objektorientierten Programmierens 2 (mit Java oder ohne) G. Noll, H. Paulus, M. Schillo, C. Uhrhan Organisatorisches Tag 1 Wdhl.: UML, Warteschlange Kürzeste Wege Modellierung statt Implementierung Tag 2 Theorie: Vererbung Implementierung mit Textausgabe Tag 3 Implementierung mit Grafikausgabe 2 Wiederholung, UML, Warteschlange, Dijkstras Algorithmus Dr. M. Schillo Gymnasium Hermeskeil Ziele UML für den Unterrichtseinsatz zur Diskussion komplexer Systeme ohne (zähe) Implementierungsphasen Dynamische Datenstrukturen als kognitiv anspruchsvolle Denktägigkeit Kürzeste-Wege-Algorithmus als ein Meilenstein der Informatik Kürzeste-Wege-Algorithmus als ein Baustein von Alltagsgegenständen (IP-routing, “Navi”) 4 Objektorientierung: wie war das noch mal? Wie verhält sich Objektorientierung zur prozeduralen Programmierung? Programmieren “im Kleinen” bleibt erhalten Prozedurorientierte Modellierung Struktogramme etc. Objektorientierte Modellierung UML 6 Idee der Objektorientierung Vorstrukturierung komplexer Systeme anhand natürlicher Objekte Jedes Objekt hat Fähigkeiten und Wissen Verteilung von Lösungskompetenzen, Zuständigkeiten und Geheimnissen Planung des Kontrollflusses (“Meta-Algorithmus”) 7 Objektorientierung: Phasenmodell OO-Analyse OO-Entwurf OO-Entwicklung OO-Modellierung OO-Programmierung 8 Beispiel: Digitale Uhr Aufbau Stunden, Minuten, Sekunden, Takt, ... Wie zwei Uhren (Weltuhr)? den Kode kopieren und noch einmal einfügen Variablen umbenennen Bei Änderungen alles doppelt drei Uhren, vier Uhren ...? 9 public class Uhr{ int stunden, minuten, sekunden; public Uhr( int h, int m, int s ){ stunden = h; minuten = m; sekunden = s; } public void zaehleWeiter(){ sekunden = sekunden + 1; if ( sekunden == 60 ){ sekunden = 0; minuten++; } Uhr speyer = new Uhr( 14, 30, 45); speyer.zaehleWeiter(); if ( minuten == 60 ){ minuten = 0; Uhr london = new Uhr( 13, 30, 45); stunden++; london.zaehleWeiter(); } ... } public void zeigeUhrzeitAn(){ System.out.println( stunden + ”:” + minuten + “:” +sekunden ); } ... } 10 Begriffe der Objektorientierung Begriff Beispiel Erläuterung Objekt speyer Exemplar Klasse Uhr Bauplan zaehleWeiter() “Prozedur”, Fähigkeiten stunden Variable, Wissen AnalogUhr Anreicherung von Eigenschaften Methode Objektvariable Vererbung 11 Bezeichnerkonventionen 1. Sinntragende Bezeichner 2. Konkatenation Klasse: Uhr Substantiv, Großschreibung Variable: meineUhr = new Uhr() Substantiv, Kleinschreibung Methode: zaehleWeiter() Verb, Kleinschreibung Beispiel: meineUhr.zaehleWeiter() 12 Vorteile der Implementierung mit Objektorientierung Bessere Kapselung von: daher: Daten => Geheimhaltung Zuständigkeiten => Kommunikation statt Manipuliation => Klare Schnittstellen Komplexität => Bessere Handhabung Arbeitsersparnis: Objekte => Wiederverwendung von Code Klassenbibliotheken => Wiederverwendung von Funktionalität 13 Fragen? UML die Unified Modelling Language am Beispiel Druckerwarteschlange Einstieg Worum geht es? Denkwerkzeuge für die Modellierung Allgemeinbildende Aspekte Beispiele für UML im Unterricht Worum geht es nicht? Vermittlung des UML-Standards auf Niveau von Softwareentwicklern 16 Der Fahrplan 1. Druckerwarteschlange (vormittag) 2. Kürzeste Wege (nachmittag) 2x 4 - Anwendungsfalldiagramm - Klassendiagramm - Aktivitätsdiagramme - Sequenzdiagramme 17 Anwendungsfall-Diagramm: Druckerwarteschlange Systemgrenze Druckauftrag erzeugen Anwendungsfälle Anwender Rolle Druckauftrag drucken Warteschlangeninhalt ansehen 18 Textuelle Beschreibung der Anwendungsfälle Man will einen Druckauftrag erzeugen und (nach Priorität oder Reihenfolge des Einreichens) einreihen können Die Warteschlange muss den nächsten Druckauftrag ausgeben können Die Nutzer wollen die Warteschlange einsehen können Evtl. muss ein Druckauftrag vorgezogen werden können 19 Anwendungsfall-Diagramm: Druckerwarteschlange Systemgrenze <<enthält>> Druckauftrag einsortieren Druckauftrag erzeugen Priorität ändern <<erweitert>> Rolle <<enthält>> <<enthält>> Druckauftrag mit Priorität erzeugen Druckauftrag entfernen <<enthält>> Warteschlange anhalten Anwender Anwendungsfälle Warteschlangeninhalt ansehen <<enthält>> Druckauftrag drucken Informationen zu Druckauftrag ansehen 20 Rollenspiel Einsortieren eines Auftrages Anwendungsfall-Diagramm: Druckerwarteschlange Systemgrenze <<enthält>> Druckauftrag einsortieren Druckauftrag erzeugen Priorität ändern <<erweitert>> Rolle <<enthält>> <<enthält>> Druckauftrag mit Priorität erzeugen Druckauftrag entfernen <<enthält>> Warteschlange anhalten Anwender Anwendungsfälle Warteschlangeninhalt ansehen <<enthält>> Druckauftrag drucken Informationen zu Druckauftrag ansehen 22 Liste der “natürlichen Objekte” Nutzer Extern Warteschlange Elementar Druckauftrag Papier Drucker + Warteschlangenelement Priorität Papierstau Dokumentname Vorbereitung des Klassendiagramms! Druckertreiber 23 Klassendiagramm für Warteschlange und Druckauftrag Druckauftrag Warteschlange -kopf: Druckauftrag -druckername: String verwaltet -dokumentname: String -nachfolger: Druckauftrag -prioritaet: int +druckeDokumentAus() +gibDokumentNameAus() +fuegeAuftragEin() +gibPrioritaetZurueck() +gibWarteschlangeAus() +erzeugeDruckauftrag(dokument, priorität) +druckeNächstenAuftrag() +gibWarteschlangeAus() verwendet Warteschlange 0 Kopf 1 2 3 4 24 Expertenrunde Was sind Aktivitätsund Sequenzdiagramme? Aktivitätsdiagramm: fügeAuftragEin() fügeAuftragEin(Druckauftrag) nachfolger.fügeAuftragEin(neuerAuftrag) nein neuerAuftrag existiert nachfolger? ja pneu=neuerAuftrag. gibPrioritaetZurueck() nein nachfolger = neuerAuftrag pneu < nachfolger.gibPrioritaetZurueck() ja neuerAuftrag.nachfolger = nachfolger nachfolger = neuerAuftrag 26 Sequenzdiagramm: fügeAuftragEin() w1:Warteschlange kopf:Druckauftrag fügeAuftragEin() d1:Druckauftrag d2:Druckauftrag gibPrioritätZurueck() id fügeAuftragEin() gibPrioritätZurueck() id fügeAuftragEin() 27 Übung Entwerfen Sie Aktivitäts- und Sequenzdiagramm für gibRestDerWSAus() Aktivitätsdiagramm: gibRestDerWSAus() gibRestDerWSAus() existiert nachfolger? nein ja nachfolger.gibDokumentnamenAus() nachfolger.gibRestDerWSAus() 29 Aktivitätsdiagramm: gibRestDerWSAus() gibRestDerWSAus() 30 Sequenzdiagramm für zwei Druckaufträge: gibWarteschlangeAus()/gibRestDerWSAus() w1:Warteschlange kopf:Druckauftrag gibRestDerWSAus() d1:Druckauftrag d2:Druckauftrag gibDokumentNamenAus() gibDokumentNamenAus() gibRestDerWSAus() gibRestDerWSAus() 31 Variationen +setze Priorität( int id ) +aendereAnzahl( int anzahl ) Drucken zu einem bestimmten Zeitpunkt Auswahl s/w oder Farbe Verschieben von einer Warteschlange in eine andere ... 32 Fragen? UML (2) Die wichtigsten Diagrammformen im Überblick UML: Überblick Phase Analyse Entwurf: Struktur Entwurf: Verhalten Diagramm Anwendungsfall Klassendiagramm Sequenzdiagramm Aktivitätsdiagramm 35 Anwendungsfalldiagramm Systemgrenze Anwendungsfall Anwendungsfall Rolle 1 <<enthält>> Anwendungsfall Rolle 2 36 Liste der “natürlichen Objekte”, nicht in UML! ............ Extern ............ Elementar ............ ............ ............ + ............ ............ ............ ............ Vorbereitung des Klassendiagramms! ............ 37 Klassendiagramm Klassenname Klassenname2 {-,+,#}feld: Typ ... ... 0..1 {-,+,#}methode() ... ... {-,+,#}methode() ... ... erweitert Klassenname3 {-,+,#}feld: Typ ... 1..* ... Beziehung Sichtbarkeit: - private +public #protected Kardinalität: 1:1!entfällt"" n ""!(unbekannt, aber beschränkt) 0..1!(3..10"""1..n) 1..*#(1 oder mehr) *# (0 oder mehr) 38 Aktivitätsdiagramm Name der Aktivität Arbeitsschritt Kontrollfluss: Start Arbeitsschritt Parameter nein Entscheidung Ergebniswert ja ja Arbeitsschritt 39 Sequenzdiagramm instanz1:Klasse1 instanz2:Klasse2 Bearbeitungszeit externeMethode() instanz3:Klasse3 instanz4:Klasse4 interneMethode() externeMethode() rückgabewert x rückgabewert Lebenslinie Ende der Lebenslinie 40 Vorschlag:Vorgehensweise für den Unterricht PartnerArbeit Klassendiagramm Aktivitätsdiagramm F-Entw. Natürliche Objekte Binnendiff.? HA: Text? Anwendungsfalldiagramm Sequenzdiagramm Gruppenarbeit Fragen? 41 Strukturelle Probleme des Unterrichtseinsatzes der OO-Modellierung Modellierung setzt Kodierungserfahrung voraus manche Software-Objekte sind nicht natürlich sondern technisch bedingt; viele natürliche Objekte sind nicht relevant Vorteil der Objektorientierung: bei großen Projekten, nicht bei kleinen Objektorientierung setzt imperative Programmierung voraus, oder objects first: besitzt nicht genug “Fleisch”. 43 Etwas Graphentheorie und kleine Übungen Der DijkstraAlgorithmus Zuerst die Aufgabenstellung Wie findet man in einer Karte leicht kürzeste Wege? Zuerst lassen wir irrelevante Informationen weg. 46 Hier sind nur noch Knoten (Städte), Kanten (Straßen) und Entfernungen eingetragen. Danach geben wir Straßenkreuzungen, die keine Städte sind, Namen. 47 Die Kreuzungen heissen jetzt X,Y, Z. Weitere Kreuzungen von Kanten bedeuten: hier kann man die Straße nicht wechseln! Damit die Kanten sich nicht überschneiden entzerren wir den Graph etwas. 48 Hier sind die Knoten etwas entzerrt. 49 Partnerarbeit! Formulieren Sie einen Algorithmus, diskutieren sie Ideen mit Ihren Nachbarn! Lösungsidee: Unendlich viele Ameisen laufen von “I” los und teilen sich an jedem Knoten auf. Alle Ameisen legen pro Zeiteinheit die selbe Strecke zurück Lösungsidee: Wir markieren besuchte Orte Lösungsidee: Was ist wenn Ameisen sich treffen? Fallunterscheidung: 1. Sie treffen sich unterwegs: CM 2. Sie treffen sich an einem Ort: X Sequentialisierung der unendlich vielen Ameisen: Der Dijkstra-Algorithmus Welcher Knoten wird expandiert? Derjenige, der bisher die kürzeste Entfernung hat Was geschieht mit seinen Nachbarn? Ignorieren, wenn schon besucht (markiert). Vormerken, wenn noch nicht vorgemerkt (in Warteschlange einer Warteschlange). Entfernung korrigieren, falls schon vorgemerkt und wenn die neue Entfernung kürzer ist als die bisherige. 54 Übung Führen Sie den Algorithmus bis zum Ende durch! Zustände der Warteschlange nach Bearbeiten eines Knotens (1) I: B/34 C/40 M/43 P/55 H/65 B: C/40 M/43 P/55 X/60 H/64 Z/66 C: M/43 P/55 X/60 H/64 Z/66 D/98 A/103 M: P/55 X/55 H/64 Z/66 A/79 D/98 P: X/55 H/64 Z/66 A/79 K/80 D/98 F/112 O/146 X: H/64 Z/66 A/79 K/80 N/84 D/98 F/112 O/146 H: Z/66 A/79 K/80 N/84 Y/93 D/98 F/112 O/146 Z: A/79 K/80 N/84 Y/89 D/98 L/106 F/112 O/146 A: K/80 N/84 Y/89 D/98 L/106 F/112 O/146 D/98 A/103 56 Zustände der Warteschlange nach Bearbeiten eines Knotens (2) K: N/84 Y/89 D/98 L/106 F/109 E/111 G/138 O/146 N: Y/89 D/98 L/106 F/109 E/111 G/138 O/146 Y: D/98 L/106 F/109 E/111 G/119 O/146 D: L/106 F/109 E/111 G/119 O/146 L: F/109 E/111 G/119 O/146 F: E/111 G/119 O/123 E: G/119 O/123 G: O/123 Lösungspfad: I - P - K - F - O 57 Fragen? Rollenspiel Finden Sie den kürzesten Pfad von E nach P! Und jetzt in UML! Übung Erstellen Sie das Anwendungsfalldiagramm! Anwendungsfall-Diagramm: Druckerwarteschlange Systemgrenze Knoten aus WS entfernen Knoten expandieren Knoten in WS einfügen Anwendungsfälle Knoten markieren Warteschlange ausgeben Ersten Knoten aus WS auslesen Entfernung eines Knotens setzen Kante einfuegen Anwender Rolle Pfad ausgeben 62 Übung Erstellen Sie das Aktivitätsdiagramm für den Algorithmus! Aktivitätsdiagramm: expandiereKnoten() expandiereKnoten( ws ) ws nein existiert noch eine Kante? ja nachbar markiert? nein nachbar in WS? ja nein ws.fuegeKnotenEin ( nachbar ) ja e = entfernung + kante.gewicht ja ws.entferneKnoten( nachbar) nachbar.setzeEntfernung( e ) ws.fuegeKnotenEin( nachbar ) nein e> nachbar.entfernung? 64 Liste der “natürlichen Objekte” Extern Knoten Kante Elementar Graph Entfernung Warteschlange Warteschlangenelement <-Trick Weg Ort Algorithmus Vorbereitung des Klassendiagramms! Name 65 Klassendiagramm für Warteschlange und Knoten: Aus Sicht der Warteschlange (1) Knoten Warteschlange -kopf: Knoten +fuegeKnotenEin( knoten ) +entferneKnoten( knoten ) +Knoten: gibErstesElementZurueck() +gibWarteschlangeAus() verwendet -entfernung: int -nachfolger: Knoten +gibKnotenAus() +fuegeKnotenEin() verwendet 66 Klassendiagramm für Warteschlange und Knoten: Aus Sicht des Graphen (2) Knoten Knoten -name: String -vorgaengerImPfad: Knoten +boolean:istMarkiert -entfernung: int -nachfolger: Knoten +gibKnotenAus() +fuegeKnotenEin() +fuegeKanteHinzu( kante) +gibPfadAus() -> Zusammenfügen! 67 Klassendiagramm (vollständig) Knoten Warteschlange -kopf: Knoten +fuegeKnotenEin( knoten ) +entferneKnoten( knoten ) +Knoten: gibErstesElementZurueck() +gibWarteschlangeAus() -entfernung: int -nachfolger: Knoten -name: String -vorgaengerImPfad: Knoten verwendet +boolean:istMarkiert +kanten: Kante[] / array of Kante Algorithmus berechneWeg() Kante zielknoten: knoten entfernung: int Kante( knoten, entfernung) +gibKnotenAus() +fuegeKnotenEin() +fuegeKanteHinzu( kante) +gibPfadAus() verwendet 68 Sequenzdiagramm: fuegeKnotenEin() ws:Warteschlange kopf: Knoten fuegeKnotenEin() k1:Knoten k2: Knoten gibEntfernungZurueck() entfernung fuegeKnotenEin() gibEntfernungZurueck() entfernung fuegeKnotenEin() 69 Fragen? Quellen Kürzeste Wege: Jens Gallenbacher: Abenteuer Informatik,Elsevier, 2007 Java Kathy Sierra & Bert Bates: Java von Kopf bis Fuß, O’Reilly, 2007 71 Quellen Kürzeste Wege: Jens Gallenbacher: Abenteuer Informatik,Elsevier, 2007 Java Kathy Sierra & Bert Bates: Java von Kopf bis Fuß, O’Reilly, 2007 72 Vererbung Vererbungsbäume Sparsames Erzeugen von Objekten aus einer Klasse: Kuh Blaupause = Klasse Exemplare = Objekte Lottie Elsa Eusebia 75 Sparsames Erzeugen von Bauplänen: 76 Sparsames Erzeugen von Bauplänen: Superklasse Unterklasse 77 Tier Beispiel: Tiere Löwe bild nahrung hunger grenzen ort Katze macheGeraeusch() iss() schlafe() bewegeDich() Nilpferd Wolf Tiger Hund 78 Tier Beispiel: Tiere bild nahrung hunger grenzen ort Katzenartig Hundartig macheGeraeusch() iss() schlafe() bewegeDich() bewegeDich() bewegeDich() Tiger Löwe macheGeräusch() iss() macheGeräusch() iss() Nilpferd Katze macheGeräusch() iss() macheGeräusch() iss() bewegeDich() Hund Wolf macheGeräusch() iss() macheGeräusch() iss() 79 Übung zum Entwurf von Vererbungsbäumen 80 Vererbungsbäume: x-ist-ein-y und x-hat-ein-y Superklasse Zimmer Zwei verschiedene Beziehungen: Badezimmer ist ein Zimmer, ABER Badezimmer hat eine Badewanne werden unterschiedlich realisiert: Klasse Badezimmer erweitert Klasse Zimmer, ABER Klasse Badezimmer besitzt ein Objekt Badewanne ist-ein Badezimmer hat-ein Badewanne B Unterklasse 81 Übung zum Entwurf von Vererbungsbäumen Machen Sie den ist-ein-Test! 82 Überschreiben von Methoden Tier Überschreiben von Methoden Welche Methode wird aufgerufen? bild nahrung hunger grenzen ort Hundartig macheGeraeusch() iss() schlafe() bewegeDich() bewegeDich() Die niedrigste gewinnt! Hund w = new Hund(); w.macheGeräusch(); w.bewegeDich(); w.iss(); w.schlafe(); Hund Wolf macheGeräusch() iss() macheGeräusch() iss() 84 Polymorphie Was ist Polymorphie? Zuweisung Deklaration Hund meinHund = new Hund(); Tier meinHaustier = new Hund(); Unterklasse // neue Besitzverhältnisse Polymorph! meinHaustier = new Katze(); // egal wer: jetzt wird gegessen! meinHaustier.iss(); 86 Warum ist das eine Erleichterung? Alle Tiere machen hamm hamm Tier[] tiere = tiere[0] = new tiere[1] = new tiere[2] = new tiere[3] = new tiere[4] = new new Tier[5]; Hund(); Katze(); Wolf(); Nilpferd(); Löwe(); int zaehler = 0; while ( zaehler < 5) { tiere[ zaehler ].iss(); tiere[ zaehler ].bewegeDich(); } 87 Wozu Vererbung nutzen? Codeverdopplung verhinden Strukturierung von Code Einfache Erweiterbarkeit ohne Neuübersetzung Wissen über Gemeinsamkeiten zur Verkürzung von Code nutzen 88 Fragen? Übung Ableitungshierarchie geometrischer Objekte Aufgabe Zeichnen sie ein UML-Klassendiagramm: für die Klassen Dreieck, Quadrat, Rechteck, Kreis und GeometrischesObjekt Suchen Sie nach möglichen Vereinfachungen durch einen Ableitungsbaum Dazu müssen Sie eventuell neue Klassen einführen Verteilen Sie benötigte Attribute und Methoden, so dass Attribute und Methoden möglichst weit oben im Baum zur Verfügung stehen der ist-ein-Test für alle Beziehungen zutrifft 91 geometrischesObjekt Eine Lösung: Viereck gibDichAus() berechneFlaeche() berechneUmfang() Kreis seitenlaengeA radius gibDichAus() berechneFlaeche() berechneUmfang() Quadrat Rechteck gibDichAus() berechneFlaeche() berechneUmfang() seitenlaengeB gibDichAus() berechneFlaeche() berechneUmfang() Dreieck seitenlaengeA seitenlaengeB seitenlaengeC gibDichAus() berechneFlaeche() berechneUmfang() Quellen Kürzeste Wege: Jens Gallenbacher: Abenteuer Informatik,Elsevier, 2007 Java Kathy Sierra & Bert Bates: Java von Kopf bis Fuß, O’Reilly, 2007 93