Grundkonzepte objektorientierten Programmierens 2

Werbung
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
Herunterladen