Einführung in die Programmierung Vorlesung 20

Werbung
1
Einführung in die Programmierung
Bertrand Meyer
Chair of Software Engineering
Introduction to Programming – Lecture 17
2
Vorlesung 20:
Mehr über Vererbung
Chair of Software Engineering
Introduction to Programming – Lecture 17
Themen
3
ƒ Benutzung von deferred Klassen
ƒ (Exkurs: Stapel (Stacks) und abstrakte
Datentypen)
ƒ Mehrfachvererbung
ƒ Die richtige Verwendung von Vererbung
Chair of Software Engineering
Introduction to Programming – Lecture 17
1
Exkurs: Stapel
4
Elementare Behälterstruktur: “push”- Operation:
Feature put
Last-In, First-Out (LIFO)
Chair of Software Engineering
Introduction to Programming – Lecture 17
Stapel
5
Elementare Behälterstruktur: “pop”- Operation:
Feature remove
Last-In, First-Out (LIFO)
Chair of Software Engineering
Introduction to Programming – Lecture 17
Stapel
6
Elementare Behälterstruktur: “top”- Operation:
Feature item
Last-In, First-Out (LIFO)
Chair of Software Engineering
Introduction to Programming – Lecture 17
2
Stapelspezifikation durch mathematische
Funktionen
7
item (put (s, x)) = x
remove (put (s, x)) = s
put
(
s
Chair of Software Engineering
)
,
=
x
s’
Introduction to Programming – Lecture 17
Abstrakte Datentypen (ADT)
8
Charakterisieren Datenstrukturen durch eine
Menge mathematischer Funktionen und ihre
abstrakten mathematischen Eigenschaften
Theoretische Basis für objekt-orientierte
Programmierung (und viele moderne Design- und
Programmierungsmethoden)
item (put (s, x)) = x
remove (put (s, x)) = s
Chair of Software Engineering
Introduction to Programming – Lecture 17
Nutzen von Stapel
9
ƒ Kompilierung, vor allem das Parsen (Syntax und
Analysis)
x
∗ (a + 2 ∗ b)
ƒ Betriebssysteme
ƒ Implementierung von Rekursion (auch Teil der
Kompilierung)
Chair of Software Engineering
Introduction to Programming – Lecture 17
3
Der rekursive Algorithmus von Hanoi
10
move (n: INTEGER;
source, target, other: CHARACTER) is
-- Move n disks from needle source to target,
-- using other as storage.
do
if n > 0 then
move (n−1, source, other, target)
transfer (source, target)
move (n−1, other, target, source)
end
end
Chair of Software Engineering
Introduction to Programming – Lecture 17
Stapelrepräsentation: Array (up)
11
capacity
count
“Push”- Operation:
representation
Chair of Software Engineering
Introduction to Programming – Lecture 17
Stapelrepräsentation: Array (down)
12
capacity
“Push”- Operation:
free
1
representation
Chair of Software Engineering
Introduction to Programming – Lecture 17
4
Stapelrepräsentation: Verknüpfte Liste
item
previous
item
previous
item
13
previous
“Push”- Operation:
Chair of Software Engineering
Introduction to Programming – Lecture 17
Vererbungshierarchie
14
ƒ Deferred Klasse: STACK
ƒ Effektive Klassen: LINKED_STACK,
ARRAYED_STACK etc.
Chair of Software Engineering
Introduction to Programming – Lecture 17
Die Rolle von deferred Klassen
15
ƒ Beschreibung von abstrakten Konzepten
unabhängig von der Implementierung
ƒ Beschreibung gemeinsamer Elemente von
verschiedenen Implementierungen
Chair of Software Engineering
Introduction to Programming – Lecture 17
5
Deferred Klassen in EiffelBase
16
*
CONTAINER
*
BOX
*
COLLECTION
*
FINITE
*
INFINITE
*
BOUNDED
*
UNBOUNDED
*
COUNTABLE
*
TRAVERSABLE
*
BAG
*
SET
*
TABLE
*
ACTIVE
*
HIERARCHICAL
*
INTEGER_
INTERVAL
…
*
RESIZABLE
*
INDEXABLE
ARRAY
STRING
*
CURSOR_
STRUCTURE
HASH_TABLE
*
DISPENSER
*
STACK
*
LINEAR
*
BILINEAR
…
*
SEQUENCE
*
QUEUE
*: deferred
Chair of Software Engineering
Introduction to Programming – Lecture 17
Mehrfachvererbung
17
ƒ Eine Klasse kann zwei oder mehr Superklassen
haben.
ƒ Beispiele: ASSISTANT erbt von TEACHER und
STUDENT.
TEACHER
STUDENT
ASSISTANT
Chair of Software Engineering
Introduction to Programming – Lecture 17
Das Assistentenbeispiel
18
ƒ Das ist ein Fall von wiederholter Vererbung:
UNIVERSITY_
PERSON
??
TEACHER
STUDENT
ASSISTANT
Chair of Software Engineering
id
??
????
Introduction to Programming – Lecture 17
6
Häufige Beispiele von Mehrfachvererbung
19
ƒ Kombination einzelner Abstraktionen:
ƒ Restaurant, Waggon
ƒ Taschenrechner, Uhr
ƒ Flugzeug, Vermögensgegenstand
Chair of Software Engineering
Introduction to Programming – Lecture 17
Mehrfachvererbung: Kombination von
Abstraktionen
*
COMPARABLE
20
*
NUMERIC
INTEGER
REAL
STRING
Chair of Software Engineering
DOUBLE
COMPLEX
Introduction to Programming – Lecture 17
Mehrfachvererbung: Verschachtelte
Fenster
21
ƒ ‘‘Graphische’’ Features: height, width, change_height,
change_width, xpos, ypos, move...
ƒ ‘‘Hierarchische’’ Features: superwindow, subwindows,
change_subwindow, add_subwindow...
class WINDOW
inherit
RECTANGLE
TREE [WINDOW]
feature
...
end
Chair of Software Engineering
Introduction to Programming – Lecture 17
7
Mehrfachvererbung: Zusammengesetzte
Figuren
22
Einfache Figuren
Eine zusammengesetzte Figur
Chair of Software Engineering
Introduction to Programming – Lecture 17
Definition des Begriffs ”zusammengesetzte
Figur”
LIST
[FIGURE]
*
FIGURE
display
hide
rotate
move
…
count
put
remove
…
COMPOSITE_
FIGURE
Chair of Software Engineering
Introduction to Programming – Lecture 17
Definition des Begriffs ”zusammengesetzte Figur” durch
Mehrfachvererbung
OPEN_
FIGURE
24
LIST
[FIGURE]
*
FIGURE
SEGMENT
23
CLOSED_
FIGURE
perimeter*
POLYLINE
perimeter+
perimeter+
POLYGON
ELLIPSE
…
COMPOSITE_
FIGURE
diagonal
perimeter++ …
RECTANGLE
CIRCLE
TRIANGLE
SQUARE
perimeter++
perimeter++
Chair of Software Engineering
Introduction to Programming – Lecture 17
8
Eine zusammengesetzte Figur als Liste
25
item
start
forth
Chair of Software Engineering
after
Introduction to Programming – Lecture 17
Zusammengesetzte Figuren
26
class
COMPOSITE_FIGURE
inherit
FIGURE
redefine display, move, rotate, ... end
LIST [FIGURE]
feature
display is
do
-- Display each constituent figure in turn.
from
until
loop
end
end
start
after
item.display
forth
... Similarly for move, rotate etc. ...
end
Chair of Software Engineering
Introduction to Programming – Lecture 17
Komplexe Figuren
27
ƒ Eine einfachere Form der Prozeduren display,
move etc. kann durch die Verwendung von
Iteratoren erreicht werden.
ƒ Wir werden lernen, Agenten für diesen Zweck zu
verwenden.
Chair of Software Engineering
Introduction to Programming – Lecture 17
9
Namenskonflikte und Mehrfachvererbung
B
A
foo
28
foo
C
Chair of Software Engineering
Introduction to Programming – Lecture 17
Auflösung von Namenskonflikten
B
A
foo
29
foo
rename foo as fog
rename foo as zoo
C
Chair of Software Engineering
Introduction to Programming – Lecture 17
Auflösung von Namenskonflikten
(Fortsetzung)
30
class C inherit
A
rename
foo as fog
end
B
rename
foo as zoo
end
feature
...
Chair of Software Engineering
Introduction to Programming – Lecture 17
10
Resultat der Umbenennung
31
a1: A
b1: B
c1: C
...
c1.fog
c1.zoo
a1.foo
b1.foo
Ungültig:
a1.fog, a1.zoo, b1.zoo, b1.fog, c1.foo
Chair of Software Engineering
Introduction to Programming – Lecture 17
Eine weitere Anwendung von
Umbenennung
32
ƒ Verbesserung und Präzisierung der Terminologie
für die jeweilige spezifische Klasse.
ƒ Beispiel: child (TREE); subwindow (WINDOW).
Chair of Software Engineering
Introduction to Programming – Lecture 17
Mehrfachvererbung: Verschachtelte
Fenster
33
ƒ ‘‘Graphische’’ Features: height, width, change_height,
change_width, xpos, ypos, move...
ƒ ‘‘Hierarchische’’ Features: superwindow, subwindows,
change_subwindow, add_subwindow...
class WINDOW
inherit
RECTANGLE
TREE [WINDOW]
feature
...
end
Chair of Software Engineering
Introduction to Programming – Lecture 17
11
Die Vernunftehe
34
class ARRAYED_STACK [G] inherit
STACK [G]
ARRAY [G]
feature
...
end
class LINKED_STACK [G] inherit
STACK [G]
Das ist umstritten!
LINKED_LIST [G]
Andere ziehen
Klientenbeziehunge
n vor
feature
...
end
Chair of Software Engineering
Introduction to Programming – Lecture 17
Die richtige Verwendung von Vererbung
35
Zwei Beziehungen: Klient, Vererbung
ƒ Klientenbeziehungen beschreiben, dass Instanzen
von B Informationen über Instanzen von A
besitzen müssen.
A
B
C
ƒ Vererbungsbeziehungen beschreiben,
dass jede Instanz von D als Instanz
von C gesehen werden kann.
Chair of Software Engineering
D
Introduction to Programming – Lecture 17
Nicht die beste Verwendung...
36
Aus einem weit verbreiteten Software Engineering Buch:
Mehrfachvererbung erlaubt mehreren Objekten als Basisobjekte
zu agieren und wird in objekt-orientierten Sprachen wie Eiffel
(Meyer, 1988) unterstützt.
Die Eigenschaften von mehreren verschiedenen Objektklassen
können kombiniert werden, um ein neues Objekt darzustellen.
Nehmen wir an, dass wir zum Beispiel eine Objektklasse CAR
haben, die Informationen über Autos kapselt, und eine
Objektklasse PERSON, die Informationen über Menschen kapselt.
Wir könnten beide Objektklassen benutzen, um ein neues Objekt
CAR-OWNER zu definieren, welches die Attribute von CAR und von
PERSON vereinigt.
Anpassungen durch Vererbung neigen dazu, dass zusätzliche
Funktionalität vererbt wird, was Komponenten ineffizient und
unförmig machen kann.
Chair of Software Engineering
Introduction to Programming – Lecture 17
12
Vererbung?
37
PERSON
CAR
CAR_OWNER
Chair of Software Engineering
Introduction to Programming – Lecture 17
Vererbung? ... oder als Klient?
PERSON
38
CAR
CAR_OWNER
Chair of Software Engineering
Introduction to Programming – Lecture 17
”The car-owner”
39
“He has a head like an Austin Mini with the doors open.”
(Aus: The Dictionary of Aussie Slang,
Five-Mile Press, Melbourne, Australia.)
Chair of Software Engineering
Introduction to Programming – Lecture 17
13
Klient oder Vererbung?
40
ƒ Ausser für den polymorphen Gebrauch ist
Vererbung nie vonnöten:
ƒ Anstatt dass B von A erbt, kann B immer auch
ein Attribut vom Typ A (oder expanded A)
haben – ausser wenn eine Entität vom Typ A
Werte vom Typ B repräsentieren soll.
(B)
Chair of Software Engineering
(A)
Introduction to Programming – Lecture 17
Sein ist auch haben!
41
ƒ (1) Jeder Softwareingenieur ist auch ein Ingenieur.
ƒ (2) Jeder Softwareingenieur hat einen Teil in sich
selbst, der ein Ingenieur ist.
ƒ Aber:
HABEN IST NICHT IMMER SEIN!
Chair of Software Engineering
Introduction to Programming – Lecture 17
Würdest Du lieber kaufen oder erben?
42
ƒ Ein Fall, wo haben nicht sein ist (z.B. “Klient” ist OK aber
Vererbung nicht):
ƒ Jedes Objekt vom Typ B hat eine Komponente vom Typ A,
ABER diese Komponente wird eventuell während der
Lebenszeit des Objekts ausgetauscht.
ƒ Benutze stattdessen die Klientenverbindung:
class WINDOW
inherit
GENERAL_WINDOW
WINDOW_IMPLEMENTATION
feature
...
end
Chair of Software Engineering
Introduction to Programming – Lecture 17
14
Handles (the bridge pattern)
class WINDOW inherit
GENERAL_WINDOW
43
display is
do
feature
handle.display (Current)
end
handle: TOOLKIT
...
display*
set_handle (t: TOOLKIT) is WINDOW
do
handle.display (Current)
handle := t
end
...
end
Chair of Software Engineering
GTK
TOOLKIT
…
MS_
WINDOWS
display+
display+
Introduction to Programming – Lecture 17
Weitere Tipps zur Vererbung
44
ƒ Vermeide “Taxomanie”: keine
Überklassifizierungen.
ƒ Führe neue Klassen nur ein, wenn sie einer
sinnvollen Abstraktion mit eigenen Features
(typischerweise Abfragen und Befehle)
entsprechen.
ƒ Warte bei Zweifeln, bis du sicher bist, dass eine
neue Klasse benötigt wird. Eine neue Klasse
hinzuzufügen, ist ein signifikanter
Designentscheid.
Chair of Software Engineering
Introduction to Programming – Lecture 17
45
Ende Vorlesung 20
Chair of Software Engineering
Introduction to Programming – Lecture 17
15
Herunterladen