Title: Grundkonzepte der objektorientierten Programmierung mit Delphi
1Grundkonzepte der objektorientierten
Programmierung mit Delphi
Helmut Paulus Speyer, 13.05.09
2Problem der Softwareentwicklung
Die Größe und Komplexität der Programme nimmt zu
- Die Pflege immer aufwändiger
- Ab einer bestimmten Größe versteht niemand mehr
das Programm - Das Programm kann nicht mehr geändert werden
- Derzeitige Lösung des Problems
- Objektorientierte Programmierung
- Entwurfsmuster für graphische Benutzungsoberfläche
n - u. a. MVC Modell-Ansicht-Steuerung
3Objekte und Klassen
Statt eines riesigen Programm hat man
- Objekte
- Programmbausteine, die bestimmte Aufgaben
eigenständig lösen - Objekte kooperieren miteinander bei der Lösung
eines komplexen Problems
- Klassen
- Baupläne für Objekte
- Jedes Objekt gehört zu genau einer Klasse
- Objekte mit gemeinsamen Eigenschaften bilden ein
Klasse
4MVC-Entwurfsmuster
Model/View/Controller
Grundlegendes Konzept zum Aufbau von
Benutzerschnittstellen Model das
Anwendungsobjekt View Bildschirmdarstellung des
Anwendungsobjekts Controller nimmt
Benutzereingaben entgegen und modifiziert das
Anwendungsobjekt
views
a 30 b 50 c 20
model
Tastatureingaben
controller
Kennzeichen Trennung von Benutzungsoberfläche
(GUI) und Fachkonzept (Model)
5MVC-Uhr
- Aufgabe
- Eine einfache Uhr mit digitaler Anzeige soll mit
Hilfe von geeigneten Objekten realisiert werden. - Anforderungen
- Die Uhr soll dabei vorerst noch nicht selbst
laufen. - Die Uhr soll als eigenständiger Baustein, der
unabhängig von GUI-Objekten ist, entwickelt
werden.
12 14 04
6MVC-Architektur
View Ansicht
Model (Daten,Verarbeitung)
Informiert ?
Controller Steuerung
- View und Controller bilden zusammen die
Benutzungsoberfläche (GUI).
7Trennung von GUI und Datenmodell
- Das bedeutet
- Das Modell kennt weder View noch Controller. In
den Datenklassen werden keine View oder
Controllermethoden aufgerufen! - View und Controller kennen das Modell und lesen
und schreiben die Daten. - Zwischen den GUI-Objekten und den MODELL-Objekten
werden Verbindungen hergestellt, um einen
Datenaustausch zu ermöglichen.
8Fragen und Probleme
- Wie erreicht man die Entkopplung?
- Wie greifen View und Controller auf die Daten zu?
- Wie können die Views aktualisiert werden, wenn
das Modell keinen Zugriff auf sie hat? - Wie erfahren die Views, dass sich die Daten des
Modells geändert haben?
9Realisierung in Delphi
- Entkopplung
- GUI- und Modellklassen in verschiedenen Units
halten - View und Controller in einem Formular (z. B.
uGUI.pas) unterbringen - Modell-Klasse in einer eigenen Unit (z. B.
uModell.pas) speichern
- Datenzugriff
- Die GUI-Klasse erhält eine Referenz auf das
Modell-Objekt. - Der Datenzugriff erfolgt mit Lese- und
Schreibmethoden, des Modells (z. B.
setAttribut() bzw. getAttribut()).
- Aktualisierungsmöglichkeiten
- Die Views fragen (evtl. permanent) das Modell ab
(Polling). - Die Views werden durch Ereignisse des Modells
über Datenänderungen informiert und aktualisieren
sich daraufhin. (Selbstdefinierte Ereignisse) - Benachrichtigung mittels Beobachter-Muster
(Observer-Pattern)
10Modellierung der Uhr
OO-Analyse
- Überlegungen zur Objektstruktur
- Welche Merkmale sind charakteristisch für eine
Uhr, also allen Uhrentypen gemeinsam? - Welche Funktionalitäten gehören zu den
Basiseigenschaften einer Uhr? Bzw. Welche
Dienste muss eine Uhr zur Verfügung stellen, um
ihre Aufgabe zu erfüllen? - Lässt sich das Objekt Uhr noch zerlegen?
- Identifikation von Objekten
- Zähler für Sekunden und Minuten (modulo 60),
Zähler für Stunden (modulo 24) - Idee Die Klasse TUhr soll Zählerobjekte modulo
einer vorgebbaren Grenze nutzen können
Ergebnisse der Analyse
11Modellierung der Klasse TUhr
- OO-Analyse
- Die Uhr besitzt drei Zählerobjekte als Stunden-,
Minuten- und Sekundenzähler. - Stunden, Minuten und Sekunden können gesetzt
werden. - Stunden, Minuten und Sekunden können ausgelesen
werden. - Die Uhrzeit kann schrittweise erhöht werden.
- Kurzbeschreibung
- Das Uhrobjekt verwaltet die Zählerobjekte, d. h.
es erzeugt und vernichtet sie. - Gemäß dem Geheimnisprinzip werden die
Zählerobjekte als private bzw. protected
deklariert, sind also dem Benutzer verborgen. - Der Zugriff erfolgt indirekt mit Hilfe der Set-
und Get-Methoden.
12TModuloZaehler
TModuloZaehler class private max
integer stand integer public
constructor create(m integer) procedure
setStand(s integer) procedure nullSetzen
procedure weiterZaehlen function getStand
integer end
constructor TModuloZaehler.create(m
integer) begin max m stand 0 end
13TUhr
TUhr class protected min
TModuloZaehler sec TModuloZaehler
std TModuloZaehler public //Methoden
constructor create destructor
destroyoverride procedure ticke
procedure reset . end
Uhr verwaltet 3 Zählerobjekte (hat-Beziehung)
constructor TUhr.create begin std
TModuloZaehler.create(23) min
TModuloZaehler.create(59) sec
TModuloZaehler.create(59) end
Erzeugung der Zählerobjekte
14TUhr
destructor TUhr.destroy begin std.Free
min.Free sec.Free inherited destroy
//geerbten Destruktor aufrufen end
Vernichtung der Zählerobjekte
procedure TUhr.ticke begin sec.weiterZaehlen
if sec.getStand 0 then begin
min.weiterZaehlen if min.getStand 0 then
std.weiterzaehlen end end
Die Uhr tickt.
Aktivieren der Zähler
15Entwicklung der GUI
OO-Entwurf
Prototyp
OOD-Klassendiagramm
16Objektverwaltung
Das Formular verwaltet die GUI-Objekte und das
Modellobjekt.
uses mTUhr TGUI class(TForm)
private Private-Deklarationen Uhr
TUhr //Referenzvariable Uhr (als Attribut des
Formulars) procedure zeitAnzeigen
//View-Methode des Formulars public
Public-Deklarationen end
Modell-Unit einbinden
Zeiger auf ein Uhrobjekt hat Beziehung
procedure TGUI.FormCreate(Sender
TObject) begin Uhr TUhr.create
//Uhrobjekt erzeugen zeitAnzeigen end
Uhrobjekt erzeugen
17Controller / View
procedure TGUI.BSetzenClick(Sender TObject) var
h, min integer begin h
StrToInt(EdH.text) min StrToInt(EdMin.text)
Uhr.SetMin(min) Uhr.SetStd(h)
zeitAnzeigen end
Ereignisprozedur
Datenfluss Controller ? Modell
Aktualisierung der Anzeige (Polling)
procedure TGUI.zeitAnzeigen var h,min,sec
integer sh,smin,ssec string begin h
Uhr.GetH min Uhr.GetMin sec
Uhr.getSec sh InttoStr(h) min
InttoStr(min) ssec InttoStr(sec) if h lt 10
then sh '0'sh .. PZeitAnzeige.Caption
sh''smin''ssec end
Datenfluss Modell ? View
18Aufgaben
- Testen Sie das Programm Uhr0 und verfolgen Sie
den Ablauf mit Hilfe des Einzelschritt-Modus
(Debugging). - Implementieren Sie einen Timer zur automatischen
Weiterschaltung der Uhr. - Erzeugen Sie im Formular eine zweite Uhr.
- Ersetzen Sie die Digitalanzeige durch ein
Analoganzeige (TZiffernblatt) - Implementieren Sie ein selbstdefiniertes
Ereignis, sodass die Uhr die GUI bei
Zustandsänderung informieren kann. - Die Uhr soll laufen lernen. Bauen Sie dazu einen
Timer in das Uhrobjekt ein.
Hinweis Verwenden Sie folgende Seiten und die
Delphi-Hilfe.
19Uhr mit Ereignis
Helmut Paulus Speyer, 13.5.09
20Ein Ereignis für das Uhrobjekt
Das Uhrobjekt soll die Ansicht über
Datenänderungen informieren.Dazu wird ein
Ereignis implementiert, das bei Datenänderung
ausgelöst wird, also in den set-Methoden. Das
Modell erhält einen Methodenzeiger, der mit einer
Methode des Formulars verknüpft werden kann.
Die Schritte (1) (3) erfolgen im Modellobjekt,
Schritt (4) im Formular.
21Implementation des Ereignisses
Ereignis OnChanged vom Typ TEreignis
type TEreignis procedure of object (1.)
TUhr Class .... public
OnChanged TEreignis (2.) .. end
Methode ohne Parameterliste
- Deklaration eines Methodenzeigertyps (hier für
eine Prozedur ohne Parameter) - Deklaration einer Referenzvariable vom Typ des
Methodenzeigers
22Auslösen des Ereignisses (3)
Modell
procedure TUhr.ticke begin . //GUI
informieren if assigned(OnChanged) then
OnChanged (3) end
3. Ereignis auslösen
Wirkung Das Modellobjekt ruft die mit OnChanged
verknüpfte Methode des Formulars auf. Mit Hilfe
der Funktion assigned() wird geprüft, ob der
Methodenzeiger mit einer Methode verknüpft ist.
Dieselbe Wirkung hätte die Anweisung if
OnChanged ltgt nil then OnChanged
Anmerkung Mit Hilfe von Methodenzeigern kann das
Modell GUI-Objekten eine Nachricht schicken
(Methode aufrufen), ohne dass es diese kennt. Das
Modell hat keine Referenz (Objektvariable), die
auf ein GUI-Objekt zeigt!
23Ereignisbearbeitungsmethode
GUI-Klasse
type TGUI class(TForm) ... private
Uhr TUhr procedure zeitAnzeigen public
... end
Ereignismethode für das OnChanged-Ereignis
Verknüpfen des Methodenzeigers mit der
Ereignismethode in FormCreate
procedure TGUI.FormCreate(Sender
TObject) begin Uhr TUhr.create
//Uhrobjekt erzeugen Uhr.OnChanged
zeitAnzeigen (4) end
Methodenname (keine Parameter)
24Uhr mit Timer
Helmut Paulus Speyer, 13.5.09
25Uhr mit Timer
Das Uhrobjekt erhält eine private
Timerkomponente, die die Zeit im Sekundentakt
erhöht.
Hat - Beziehung
Hat - Beziehung
weiter Ereignismethode für das Timer-Ereignis
OnTimer
Das Uhrobjekt ist für die Erzeugung und
Zerstörung des Timerobjekts zuständig.
26Implementierung
uses mTModuloZaehler, extctrls type TUhr
Class protected std integer
min integer Sec integer Timer
TTimer procedure weiter(SenderTObject)
public constructor create
destructor destroy override ...
end
wegen TTimer
Objektreferenz
Ereignismethode des Timers
Die Ereignismethode des Timers erwartet einen
Parameter Sender vom Typ TObject. Daher kann die
Methode ticke nicht mit dem Timerereignis OnTimer
verknüpft werden. Als Timerereignismethode kommt
daher die Methode weiter(Sender TObject) hinzu,
die dann ticke aufruft.
27Erzeugung und Vernichtung des Timers
constructor TUhr.create begin Timer
TTimer.create(nil) with Timer do begin
interval 1000 enabled true
OnTimer weiter end end
Erwartet wird eine Referenz auf den Besitzer der
Komponente Objekt vom Typ TComponent oder nil.
Methodenzeiger mit der Ereignismethode verknüpfen
destructor TUhr.destroy begin Timer.free
inherited destroy end
Freigabe des Objekts
Aufruf des Destruktors der Basisklasse TObject
28Vererbung - Spezialisierung
Helmut Paulus Speyer, 13.05.09
29Ziel
Aufgabe Zu entwickeln ist eine Uhr, die zu einer
voreingestellten Uhrzeit ein Alarmzeichen ausgibt.
- Wünschenswert wäre,
- möglichst viel von der Klasse TUhr verwenden zu
können, - möglichst wenig zusätzlichen Code entwickeln zu
müssen. - Codewiederholungen vermeiden zu können.
- Lösung durch Vererbung
- Eine Klasse von Objekten kann als Spezialfall
einer allgemeineren Klasse definiert werden.
- Die Objekte der spezialisierten Klasse
- verfügen über alle Merkmale und Methoden der
allgemeinen Klasse, - erweitern diese aber ggf. um zusätzliche
Eigenschaften (Attribute und Methoden), - können die geerbten Methoden durch Überschreiben
neu definieren.
30Vererbung - Spezialisierung
Die Basisklasse TWecker als Spezialisierung der
Klasse TUhr
ist ein - Beziehung
In der Methode ticke soll der Alarm ausgelöst
werden, falls die Alarmzeit erreicht ist ticke
wird daher in der Unterklasse erweitert. Die
Basisklasse wird nicht mehr verändert!
31Überschreiben einer Methode
procedure TUhr.ticke begin //Zeit erhöhen
//OnChanged-Ereignis auslösen end
Das Verhalten der Uhr beim Ticken wird erweitert.
Dazu wird die ticke-Methode überschrieben.
procedure TWecker.ticke begin inherited ticke
//Methode der Basisklasse //Alarm auslösen,
falls Alarmzeit erreicht end
Zunächst die Methode der Basisklasse aufrufen, um
das Standardverhalten auszulösen. Es folgen die
speziellen Aktivitäten des Weckers.
32Verhalten virtueller Methoden
Problem Welche Methode wird aufgerufen, wenn der
Timer, der in TUhr deklariert ist, die Methode
ticke aufruft?
- Bei virtuellen Methoden wird erst zur Laufzeit
entschieden, welche Methode aktiviert wird. - Der Typ des aktuellen Objekts bestimmt die
Methode.
33Polymorphismus
Das Konzept der dynamischen Bindung heißt in der
OOP Polymorphismus (Vielgestaltigkeit).
- Merkmale
- Bei polymorphen Objektenvariablen entscheidet
sich erst zur Laufzeit, welcher Klasse das Objekt
angehört. - Eine in einer Basisklasse als virtual deklarierte
Methode definiert eine Schnittstelle für alle
abgeleiteten Klassen, auch wenn diese noch nicht
festgelegt sind. - Ein Programm, das virtuelle Methoden einer
Basisklasse enthält kann sehr leicht um
abgeleitete Klassen erweitert werden, weil
sichergestellt ist, dass stets die richtige
Methode aufgerufen wird.
- Empfehlung
- Statische Methoden einer Basisklasse sollten
nicht überschrieben werden. - Wenn Überschreiben notwendig erscheint, sollte
die Methode als virtual deklariert werden.
34Aufgabe
- Testen Sie das Programm Wecker und ergänzen Sie
den fehlenden Quellcode. - Entwickeln Sie mit Hilfe zweier Wecker eine
SchachuhrZwei Uhren, die sich gegenseitig an-
und abschalten nach Prinzip - Wenn die Partie gestartet ist, läuft die Uhr
desjenigen, der am Zug ist, los. - Nachdem der Spieler seinen Zug ausgeführt hat
stoppt er seine Uhr, gleichzeitig startet
automatisch die Uhr des Gegners. - Jeder Spieler nur eine bestimmte Zeitspanne für
die Partie zur Verfügung, die auf der Schachuhr
zuvor eingestellt wird. - Entwickeln Sie eine Weltzeituhr.
- Eine Uhr, die die aktuelle Uhrzeit der
verschiedenen Zeitzonen anzeigen kann. - Als Basiszeit dient dabei die Zeit am nullten
Längengrad. - Die Basisuhrzeit wird festgelegt, die Uhrzeiten
der anderen Zeitzonen errechnen sich durch
Hinzufügen oder Abziehen einer ganzzahligen
Anzahl von Stunden.
35Vererbung - Generalisierung
Helmut Paulus Speyer, 13.5.09
36Bankprodukte
Problem Vielfalt der Objektetypen Sie sind zwar
ähnlich, aber doch verschieden sind!
Depotkonto
Girokonto
Festgeldkonto
Sparkonto
- Idee
- Suche nach Gemeinsamkeiten!
- Organisiere sie in einer Hierarchie!
- Implementiere zuerst den gemeinsamen Kern!
- Implementiere dann nur noch die Unterschiede!
37Vererbung
Sparkonto
Girokonto
Festgeldkonto
Nummer Inhaber Stand
Nummer Inhaber Stand Zeitraum
Nummer Inhaber Stand Kündigungsfrist
einzahlen auszahlen
einzahlen auszahlen
einzahlen auszahlen
- Unterschiedliches Verhalten
- Sparkonto
- Kündigungsfrist, kein Überziehen möglich
- Girokonto
- Überweisungen, Scheck, Dispositonskredit
- Festgeldkonto
- Einzahlen und Auszahlen eingeschränkt,
Mindesteinlage
38Vererbungshierarchie
Konto ist der abstrakte Oberbegriff für die drei
Formen ? Gemeinsame Basisklasse TKonto
- Die Basisklasse enthält den gemeinsamen Kern.
- Spezialisierte Klassen werden von der Basisklasse
abgeleitetsie fügen spezielle Attribute und
Operationen hinzu oder definieren bestimmte Dinge
neu.
39Abstrakte Methoden
- Die Basisklasse Konto kann die Methode auszahlen
nicht sinnvoll implementieren, weil sie zu
allgemein ist. - Um einen gleichartigen Aufruf der Methode zu
gewährleisten, muss sie dennoch in der
Basisklasse enthalten sein. (z. B. mit leeren
Rumpf) - Deklariert man die virtuelle Methode der
Basisklasse als abstrakte Methode, so entfällt
die Implementation.
procedure TKonto.auszahlen () begin end
procedure TGirokonto.auszahlen () begin
//Dispo prüfen //Kontostand berechnen
//Gebühren berechnen end
procedure TSparKonto.auszahlen () begin //ist
Konto gedeckt ? //Kontostand berechnen end
40Abstrakte Klassen
TKonto mit der abstrakten Methode auszahlen
TKonto class ... procedure
auszahlenvirtualabstract ... end
- Implementierung in Basisklasse entfällt
- Muss in allen Unterklassen überschrieben werden
- Kennzeichen abstrakter Klassen
- Abstrakte Klassen enthalten mindestens eine
abstrakte virtuelle Methode, die überschrieben
werden muss. - Von abstrakten Klassen können keine Instanzen
gebildet werden. - Abstrakte Klasse bilden eine gemeinsame
Schnittstelle für alle Unterklassen.
41Klassendiagramm
42Aufgaben
- Testen Sie das Programm Konten und
vervollständigen Sie die Auszahlungsmethoden.
43Anhang 1
Helmut Paulus Speyer, 13.05.09
44Zuweisungskompatibilität
Zuweisungskompatibilität
Konsequenz der ist ein BeziehungEiner
Objektvariablen einer Oberklasse können Objekte
aller Unterklassen zugewiesen werden. Die
Umkehrung gilt nicht.
Möglich Uhr Wecker Uhr.setStd(12) Nicht
möglich Uhr.setAlarmStd(6)
Beispiel Var uhr TUhr wecker
TWecker wecker TWecker.create(...)
Uhr ist eine Referenz auf den Teil des
Weckerobjekts, der von TUhr geerbt wird.
Typumwandlung as - Operator wecker Uhr as
TWecker (Uhr as TWecker).setAlarm(6) TWecker(Uhr
).setAlarm(6)
45Delphis Klassenhierarchie
- Alle Delphi-Objekte sind Nachfahren eines
Urobjekts - Klasse TObject. - TObject
- implementiert das grundlegende Verhalten, das
allen Delphi-Objekten gemeinsam ist.(z. B.
Standardkonstruktor, -destruktor) - dient als Basis für einfache Objekte (keine
Komponenten, keine Stream- oder
Zuweisungsfunktionen)
46Delphis Klassenbibliothek (Auszug)
47Anhang 2Grundkonzepte
Helmut Paulus Speyer, 13.05.09
48Zusammenfassung OOP
OOP-Idee Vorstrukturierung komplexer Systeme
anhand natürlicher Objekte Jedes Objekt hat
Fähigkeiten und Eigenschaften Verteilung von
Aufgaben (Zuständigkeiten) Prinzipien Objekt
und Klasse Geheimnisprinzip Beziehung/Assoziation
Vererbung Eine Klassen-Deklaration besteht aus
Deklarationen von Attributen für die
verschiedenen Eigenschaftender Objekte
Konstruktoren zur Erzeugung und Initialisierung
der Objekte Methoden, d.h. Operationen
(Algorithmen) auf Objekten UML-Klassendiagramm Ze
igt die Klassen einer Anwendung und die
Beziehungen zwischen diesen Klassen. Es liefert
Informationen über den Aufbau der Anwendung.
Entwurfsprinzip Trennung von GUI und Modell
(MVC)
49Klassen und Objekte
Klasse
ist Instanz von
Objekte
Klassen sind Baupläne von Objekten. Objekte sind
konkrete Exemplare (Instanzen) von Klassen.
50Geheimnisprinzip
Objekte stellen Operationen/Dienste (Algorithmen)
und Informationen zur Verfügung. Die innere
Struktur bleibt dem Benutzer verborgen.
Die Operationen (Algorithmen) auf Objekten einer
Klasse heißen auch Methoden, genauer
Objekt-Methoden.
Attribute speichern den Zustand des
Objekts Methoden abheben, überweisen, einzahlen
usw.
Direkter Zugriff auf Attribute nicht möglich. Nur
indirekter Zugriff mit Hilfe von Methoden
(set-/get).
51Modellierung der Klasse
UML-Klassendiagramm
Zugriffsrechte - privat (Zugriff nur innerhalb
des Objekts) öffentlich (Zugriff auch von
außerhalb)
Konstruktor (erzeugt ein Objekt)
Aufträge (Dienste)/Prozeduren
Anfragen /Funktionen (Lesezugriff auf die
Attribute)
52Implementierung der Klasse
type TKonto class private KStand
double Nummer integer Besitzer
string public constructor Create (PNr
integer PBesitzer string) procedure
abheben (PBetrag double) procedure
einzahlen (PBetrag double) procedure
ueberweisen(PBetragdoublePEKonto TKonto)
function getBesitzer string function
getKontoNummer integer function
getKontoStand double end
private Zugriff von außen nicht möglich
public Zugriff von außen möglich
53Konstruktoren
Objekte werden mit Hilfe der Konstruktoren
erzeugt
constructor TKonto.create ( PNr integer
PBesitzer string) begin Nummer PNr
Besitzer PBesitzer end
- Der Konstruktor
- legt den Speicherbereich des Objekts an,
- belegt die Attribute mit Standardwerten,
- gibt eine Referenz auf das erzeugte Objekt zurück.
- Konstruktoren sind Klassenmethoden, d. h. sie
sind nicht an ein Objekt gebunden.Beim Aufruf
wird daher der Klassenname vorangestellt. - Konstruktoren haben eine Objektreferenz als
Ergebnis, - aber keine Rückgabezuweisung (result ... ) und
folglich auch keinen Ergebnistyp. - Alle Delphiklassen besitzen einen
Standardkonstruktor Create, der ersetzt wird,
wenn man ihn neu implementiert.
54Erzeugung von Objekten
var Konto1 TKonto ... ... Konto1
TKonto.create(102, Müller)
Klassenname
55Arbeiten mit Objekten
Der Zugriff auf Objekte erfolgt mit Hilfe der
Objektvariablen
Schema Objektvariable.Methode
56Nachricht
Kommunikation zwischen Objekten
Konto1.ueberweisen (400, konto2)
Das Objekt Konto1 schickt dem Objekt Konto2 eine
Nachricht.
57Assoziation
Damit Objekte miteinander kommunizieren können,
müssen Beziehungen zwischen ihnen bestehen.
58Anhang 3Phasen der Softwareentwicklung
Helmut Paulus Speyer, 13.05.09
59Software-Entwicklungsmodell
Entwicklungsphasen
OO-Analyse
OO-Design
OO-Programmierung
Analyse
Entwurf
Codierung
- Modellierungskonzepte bei allen Schritten
- Identifizieren und Definieren von abgeschlossenen
autonomen Einheiten, die Struktur und Verhalten
besitzen. - Suchen nach Gemeinsamkeiten im Sinne der
Generalisierung / Spezialisierung. - Die Grenzen zwischen den Aktivitäten verschwimmen.
60OOA - OOD - OOP
- OOA
- WAS soll das System tun? nicht WIE
- Funktionalität durch Anwendungsfälle beschreiben
- Objekte (Gegenstände) und Klassen (Begriffe)
identifizieren - Verantwortlichkeiten identifizieren und den
Klassen zuordnen - Zusammenarbeit zwischen den Klassen
identifizieren (Beziehungen) - Hierarchien definieren (Vererbung)
- OOD
- WIE soll das System arbeiten?
- Verfeinern des Objektmodells (Vererbung,
Abstraktion) zu einem implementierbaren Modell
(Festlegung der Schnittstellen, Besonderheiten
der Programmiersprache) - Anpassung des Modells an die technische
Plattform, Entwicklung und Anbindung der
Benutzungsoberfläche
OOP Implementierung der Klassen und der
Interaktionen zwischen den Objekten
61Objektorientierter Entwurf
Wesentliches Entwurfsziel ist die Trennung
Fachkonzept, Benutzungs-oberfläche (GUI) und
Datenhaltung.
Entwicklungsphasen
62Anhang 3Kursarbeit
Helmut Paulus Speyer, 13.05.09
63Kursarbeit 1 (Auszug)
1. Schachuhr Dabei handelt es sich eigentlich um
zwei Uhren, die sich gegenseitig an- und
abschalten. Das Ganze funktioniert nach folgendem
Prinzip Wenn die Partie gestartet ist, läuft
die Uhr desjenigen, der am Zug ist, los. Nachdem
der Spieler seinen Zug ausgeführt hat stoppt er
seine Uhr, gleichzeitig startet automatisch die
Uhr des Gegners. Dabei hat jeder Spieler nur eine
bestimmte Zeitspanne für die Partie zur
Verfügung, die auf der Schachuhr zuvor
eingestellt wird je nach Schachform (z. B.
Blitzschach oder Turnierschach) zwischen 5
Minuten und zweieinhalb Stunden. Es soll ein
Programm entwickelt werden, das eine solche
Schachuhr simuliert. Dazu wird die leicht
modifizierte Uhrenklasse TUhr aus dem Unterricht
und eine GUI-Klasse zur Analoganzeige der Zeit
zur Verfügung gestellt.
- Analysiere das Klassendiagramm (siehe
Dokumentation) und erläutere die verschiedenen
Beziehungen zwischen den Klassen. Erläutere, in
welcher Weise hier das MVC-Prinzip realisiert
ist Nenne und begründe Vor- und Nachteile dieses
Entwurfkonzepts. - Modelliere mit Hilfe der zur Verfügung gestellten
Klassen die Schachuhr. Stelle das Ergebnis in
einem OOD-Klassendiagramm dar. Die Abbildung
zeigt einen Prototyp. - Leider hat der Programmierer noch einige wichtige
Fähigkeiten der Uhrobjekte vergessen - die Uhren laufen noch nicht selbständig
- bei Überschreiten der max. Spielzeit sollen die
Uhren Alarm auslösen, damit das Spiel abgebrochen
werden kann - Erläutere, wie du die Klasse TUhr erweiterst, um
die gewünschte Funktionalität zu erzielen. - Gehe dabei insbesondere auf den
Benachrichtigungsmechanismus ein. - Setze deine Überlegungen um, indem du das
vorgebenene Delphi-Projekt erweiterst. (Arbeit am
PC) - Weitere Pflichten
- Weiß beginnt, Schwarz startet also die Uhr.
- Die Bedenkzeit für jeden Spieler wird auf 5
Minuten eingestellt (nicht editierbar) - Zeitüberschreitung wird angezeigt und damit das
Spiel beendet.
64 Kursarbeit 1 (Anhang)
Dokumentation der Klasse "TZiffernblatt"
Beschreibung der Klasse Analoganzeige einer Uhr
reagiert auf das OnChanged-Ereignis des
Uhrobjekts Bezugsklasse TImage. Objektbeziehun
gen TUhr (Beziehungstyp Kennt, Kardinalität
1) Attribute myUhr TUhr Referenz auf das
Uhrobjekt, dessen Zeit angezeigt wird Protokoll
der Dienste / Methoden Konstruktor
Create(Owner TComponent) Auftrag
aktualisiereAnzeige(uhr TUhr) nachher zeigt
die aktuelle Zeit des übergebenen Uhrobjekts
an Auftrag setzeMyUhr(uhr
TUhr) nachher Attribut MyUhr ist gesetzt und
OnChanged-Ereignis mit der privaten Methode
aktualisiere Auftrag zeigeZeit(h
integer, min integer, sec integer) nachher
die übergebene Zeit wird angezeigt
Dokumentation der Klasse "TUhr" Beschreibung der
Klasse Attribute OnChanged TEreignis Wird
ausgelöst, wenn sich die Zeit geändert
hat Protokoll der Dienste / Methoden Konstruktor
constructor create (pH integer pMin
integer) nachher Uhr erzeugt std, min
gesetzt Auftrag ticke() nachher Zeit um 1
Sekunde erhöht, OnChanged aufgerufen Auftrag
reset()
65Kursarbeit 1 (Auszug)
- 2. Ampelanlage
- An einer Landstraße muss der Straßenverkehr wegen
Bauarbeiten zeitweilig auf eine Spur
eingeschränkt und mit einer Ampelanlage geregelt
werden. Ein Programm soll zwei Verkehrsampeln mit
ihren Funktionen und den Straßenverkehr an der
Baustelle simulieren und auf dem Bildschirm
darstellen. - Jede Ampel
- zeigt die Phasen ROT-ROTGELB-GRUEN-GELB nach
einander mit verschiedenen Zeitdauern. - wird von einer separaten zentralen Steuerung
geschaltet. - Sensoren vor den Ampeln registrieren die Anzahl
der haltenden Autos und lösen einen Schaltzyklus
aus. - Die Anlage soll einen einspurigen Verkehr sichern
und im Dauerbetrieb laufen
- Erläutere an diesem Beispiel die einzelnen Phasen
eines objektorientierten Software-Entwurfs. - Führe eine OO-Analyse durch. Stelle deine
Ergebnisse in einem Klassendiagramm dar und
erläutere es kurz ( Attribute, Methoden,
Beziehungen). - Beschreibe die verschiedenen Ampelzustände mit
Hilfe eines Zustandsdiagramms und entwickle für
einen komplette Schaltzyklus der Steueranlage ein
Aktivitätsdiagramm. - Stell dir vor, dass du Leiter einer Arbeitsgruppe
bist, die die Software entwickeln soll. Nenne
Teilgruppen, die du zur Lösung des Problems
bilden würdest, und ordne jeder Teilgruppe
Aufgaben zu.
66Kursarbeit 2
- 1. Weltzeituhr
- Eine Weltzeituhr ist eine Uhr, die die aktuelle
Uhrzeit der verschiedenen Zeitzonen anzeigen
kann. Als Basiszeit dient dabei die Zeit am
nullten Längengrad - Die Basisuhrzeit wird festgelegt, die Uhrzeiten
der anderen Zeitzonen errechnen sich durch
Hinzufügen oder Abziehen einer ganzzahligen
Anzahl von Stunden. - Pflichten
- Es soll ein Programm entwickelt werden, das wie
im Bild drei Weltzeituhren enthält, die die
Uhrzeit einer bestimmten Weltstadt (Zeitzone)
anzeigen. - Die im Unterricht entwickelte Klasse TUhr ist zu
dazu zu erweitern. - Die Uhren laufen nicht selbst, sondern werden
synchron von außen gesteuert. Die Zeitanzeige ist
digital.
- Erläutere den grundsätzlichen Unterschied
zwischen der prozeduralen und der
objektorientierten Programmierweise. Beziehe dich
dabei auf eines der Unterrichtsprojekte. - Analysiere das Klassendiagramm und erläutere die
verschiedenen Beziehungen zwischen den
Klassen.Erläutere insbesondere die Beziehung
zwischen dem Uhrobjekt und der Panelkomponente!
Wie wird diese Beziehung programmiertechnisch
realisiert? (Anweisungen) - Erweitere die Klasse TUhr um geeignete
Attribute/Methoden und ergänze evtl. den
Quellcode schon existierender Methoden so, dass
die oben beschriebene Funktionalität gegeben ist.
Zur Initialisierung soll ein geeigneter
Konstruktor entwickelt werden. - Begründe deine Entscheidungen kurz und stelle das
Ergebnis in einem erweitereten UML-Klassendiagramm
dar. - Implementiere eine GUI mit drei laufenden Uhren
wie im Bild. Verwende die Unit uWUhr.pas.Zeitzone
n Budapest 1, Detroit 6, Aukland 11
67Kursarbeit 2
Klassendiagramm
68Kursarbeit 2
2. Telefonbuch In Handys oder PDAs (Personal
Digital Assistant) findet man kleine
Applikationen, die als Telefonbuch oder
Merkzettel dienen. Diese stellen meist keinerlei
Datenbankfunktionalität bereit allerhöchstens
sind sie in der Lage die Einträge zu sortieren.
Man kann sie gut mit einem Karteikasten
vergleichen, der eine bestimmte Sorte
Karteikarten bereithält. Betrachte ein
vereinfachtes Telefonbuch, bei dem die Einträge
unsortiert gespeichert werden und ihre Anzahl auf
10 begrenzt sein soll.
- Modelliere ein Telefonbuch, das mit Hilfe der
Modellklassen TTelefonbuch und TEintrag aufgebaut
wird. Es enthält Einträge mit den Attributen
Nummer (interne automatisch erzeugte
Nummerierung), Name, Telefonnummer sowie ein
Ja/Nein-Feld für Kurzwahl (d. h. der Eintrag ist
einer Kurzwahltaste zugeordnet). - Folgende Operationen sollen möglich sein
- eine neuer Eintrag wird angelegt, dabei wird er
automatisch nummeriert und - nach Angabe einer Nummer wird der zugehörige
Eintrag als Zeichenkette ausgegeben. - Begründe deine Entscheidungen und stelle das
Ergebnis in einem UML-Klassendiagramm dar.
Erläutere die Beziehung zwischen den Klassen. - Implementiere die Konstruktoren beiden Klassen,
sowie eine Methode zum Einfügen eines neuen
Eintrags ins Telefonbuch. - Erzeuge ein Telefonbuch mit maximal 10 Einträgen
und füge folgende Einträge ein.Anton, Meyer,
0675/1234, ja, Uwe, Ochsenknecht, 084/1234,
neinGib auch die notwendigen Variablendeklaratio
nen an und erläutere sie. - Schreibe eine GUI-Methode, die das gesamte
Telefonbuch (Einträge als Strings) in einer
Listbox ausgibt. Verwende die Methode
Listbox.items.add( s string) zur Ausgabe der
Daten
69Links und Literatur
- E. Modrow Informatik mit Delphi, Band 1/2,
Dümmler-Stam 1998-2000. - P. Damann, J. Wemßen Objektorientierte
Programmierung mit Delphi, Band 1. Klett-Verlag
2001. - U. Bänisch Praktische Informatik mit Delphi,
Band 1/2. Cornelsen 2001. - Frischalowski Delphi 5.0, Band 1/2, Herdt-Verlag
1999. - Pohl Schülerübungen / Klausuren in Delphi, Heft
1/2, Verlag J. Pohl 1997-2001. - K. Merkerthttp//hsg.region-kaiserslautern.de/fa
echer/inf/material/delphi/index.php - R. Mechlinghttp//www.gk-informatik.de/
- K. Heidlerhttp//www.friedrich.fr.schule-bw.de/d
elphi/delphi.htm - Hessischer Bildungsserverhttp//lernen.bildung.h
essen.de/informatik/ - Katja Weishaupt
- http//lernen.bildung.hessen.de/informatik/materi
al/weishaupt.pdf - S. Spolwig http//oszhdl.be.schule.de/gymnasium/f
aecher/informatik/delphi/index.htm - Daniel Garmannhttp//projekte.gymnasium-odenthal.
de/informatik/ - Weitere Hinweise unter
- http//www.delphi-source.de
- Einsteiger-Tutorial
- http//www.delphi-treff.de/content/tutorials/eins
teigerkurs/