Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09.

Ähnliche Präsentationen


Präsentation zum Thema: "Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09."—  Präsentation transkript:

1 Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer,

2 2 Problem der Softwareentwicklung 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ächen u. a. MVC: Modell-Ansicht-Steuerung Die Größe und Komplexität der Programme nimmt zu

3 3 Objekte 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

4 MVC-Entwurfsmuster 4 Model/View/Controller Grundlegendes Konzept zum Aufbau von Benutzerschnittstellen Model: das Anwendungsobjekt View: Bildschirmdarstellung des Anwendungsobjekts Controller: nimmt Benutzereingaben entgegen und modifiziert das Anwendungsobjekt a = 30% b = 50% c = 20% a = 30% b = 50% c = 20% model views controller Tastatureingaben Kennzeichen: Trennung von Benutzungsoberfläche (GUI) und Fachkonzept (Model)

5 MVC-Uhr 5 Aufgabe: Eine einfache Uhr mit digitaler Anzeige soll mit Hilfe von geeigneten Objekten realisiert werden. Anforderungen: 1.Die Uhr soll dabei vorerst noch nicht selbst laufen. 2.Die Uhr soll als eigenständiger Baustein, der unabhängig von GUI-Objekten ist, entwickelt werden. 12 : 14 : 04 Darstellung Steuerung schreibt liest GUI Uhr Std= 12 Min= 17 Sec = 0 Modell Fachkonzept

6 MVC-Architektur 6 GUI (Graphical User Interface) Fachkonzept Model (Daten,Verarbeitung) Controller Steuerung View Ansicht schreibt liest Informiert ? View und Controller bilden zusammen die Benutzungsoberfläche (GUI).

7 Trennung von GUI und Datenmodell 7 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. Änderungen der Benutzeroberfläche haben daher keine Auswirkung auf die interne Verarbeitung der Daten und der Datenstruktur. Verbesserung der Wiederverwendbarkeit klare Strukturierung eines Programms Die Daten können gleichzeitig mehrfach auf unterschiedliche Weise dargestellt werden. Vorteile:

8 Fragen und Probleme 8 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?

9 9 Realisierung in Delphi 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) 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()).

10 Modellierung der Uhr 10 Ü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? Ü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? OO-Analyse 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 Attribute: Zählerstand – Werte von 0 bis Maximalwert Fähigkeiten: zählt weiter bis ein maximaler Wert erreicht ist, dann wieder bei Null zurücksetzen in den Startzustand (Zählerstand 0) einen bestimmten (Anfangs-)Zählerstand setzen Ergebnisse der Analyse:

11 Modellierung der Klasse TUhr 11 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. OOA-Klassendiagramm

12 TModuloZaehler 12 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;

13 TUhr 13 TUhr = class protected min : TModuloZaehler; sec : TModuloZaehler; std : TModuloZaehler; public //Methoden constructor create; destructor destroy;override; 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

14 TUhr 14 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; Die Uhr tickt. Aktivieren der Zähler

15 Entwicklung der GUI 15 OO-Entwurf OOD-Klassendiagramm Prototyp

16 Objektverwaltung 16 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; Das Formular verwaltet die GUI-Objekte und das Modellobjekt. Zeiger auf ein Uhrobjekt hat Beziehung Modell-Unit einbinden procedure TGUI.FormCreate(Sender: TObject); begin Uhr := TUhr.create; //Uhrobjekt erzeugen zeitAnzeigen; end; Uhrobjekt erzeugen

17 Controller / View 17 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 < 10 then sh := '0'+sh; ….. PZeitAnzeige.Caption := sh+':'+smin+':'+ssec; end; Ereignisprozedur 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; Aktualisierung der Anzeige (Polling) Datenfluss: Controller Modell Datenfluss: Modell View

18 18 Aufgaben 1.Testen Sie das Programm Uhr0 und verfolgen Sie den Ablauf mit Hilfe des Einzelschritt-Modus (Debugging). 2.Implementieren Sie einen Timer zur automatischen Weiterschaltung der Uhr. 3.Erzeugen Sie im Formular eine zweite Uhr. 4.Ersetzen Sie die Digitalanzeige durch ein Analoganzeige (TZiffernblatt) 5.Implementieren Sie ein selbstdefiniertes Ereignis, sodass die Uhr die GUI bei Zustandsänderung informieren kann. 6.Die Uhr soll laufen lernen. Bauen Sie dazu einen Timer in das Uhrobjekt ein. Hinweis: Verwenden Sie folgende Seiten und die Delphi-Hilfe.

19 Uhr mit Ereignis Helmut Paulus Speyer,

20 20 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. Die Implementation erfolgt in vier Schritten: 1. Vereinbarung eines Methodenzeiger-Typs 2. Vereinbarung eines Methodenzeigers 3. Aufruf der Ereignisprozedur über den Methodenzeiger 4. Zuweisung einer Ereignisprozedur Ein Ereignis für das Uhrobjekt

21 Implementation des Ereignisses 21 type TEreignis = procedure of object; (1.) TUhr = Class.... public OnChanged : TEreignis; (2.) ….. end; Ereignis: OnChanged vom Typ TEreignis 1.Deklaration eines Methodenzeigertyps (hier: für eine Prozedur ohne Parameter) 2.Deklaration einer Referenzvariable vom Typ des Methodenzeigers Methode ohne Parameterliste

22 Auslösen des Ereignisses (3) 22 procedure TUhr.ticke; begin …. //GUI informieren if assigned(OnChanged) then OnChanged; (3) end; 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 <> nil then OnChanged; Modell: 3. Ereignis auslösen 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!

23 Ereignisbearbeitungsmethode 23 type TGUI = class(TForm)... private Uhr : TUhr; procedure zeitAnzeigen; public... end; Verknüpfen des Methodenzeigers mit der Ereignismethode in FormCreate Ereignismethode für das OnChanged-Ereignis GUI-Klasse: procedure TGUI.FormCreate(Sender: TObject); begin Uhr := TUhr.create; //Uhrobjekt erzeugen Uhr.OnChanged := zeitAnzeigen; (4) end; Methodenname (keine Parameter)

24 Uhr mit Timer Helmut Paulus Speyer,

25 Uhr mit Timer 25 Das Uhrobjekt erhält eine private Timerkomponente, die die Zeit im Sekundentakt erhöht. Das Uhrobjekt ist für die Erzeugung und Zerstörung des Timerobjekts zuständig. Hat - Beziehung weiter Ereignismethode für das Timer-Ereignis OnTimer Hat - Beziehung

26 Implementierung 26 uses mTModuloZaehler, extctrls; type TUhr = Class protected std : integer; min : integer; Sec : integer; Timer : TTimer; procedure weiter(Sender:TObject); public constructor create; destructor destroy; override;... end; Objektreferenz wegen TTimer 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.

27 Erzeugung und Vernichtung des Timers 27 constructor TUhr.create; begin Timer := TTimer.create(nil); with Timer do begin interval := 1000; enabled := true; OnTimer := weiter end; Methodenzeiger mit der Ereignismethode verknüpfen Erwartet wird eine Referenz auf den Besitzer der Komponente: Objekt vom Typ TComponent oder nil. destructor TUhr.destroy; begin Timer.free; inherited destroy; end; Aufruf des Destruktors der Basisklasse TObject Freigabe des Objekts

28 Vererbung - Spezialisierung Helmut Paulus Speyer,

29 Ziel Lösung durch Vererbung Eine Klasse von Objekten kann als Spezialfall einer allgemeineren Klasse definiert werden. 29 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. 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. 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.

30 30 Vererbung - Spezialisierung TWecker # AlarmMin : integer # AlarmStd : integer + OnAlarm : TEreignis +!ticke Basisklasse gemeinsamer Kern abgeleitete Klasse (Unterklasse) Erweiterungen Generalisierung Spezialisierung Die Basisklasse TWecker als Spezialisierung der Klasse TUhr TUhr # timer : TTimer #!weiter(Sender : TObject) + OnChanged : TEreignis +!ticke 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 31 procedure TWecker.ticke; begin inherited ticke; //Methode der Basisklasse //Alarm auslösen, falls Alarmzeit erreicht end; procedure TUhr.ticke; begin //Zeit erhöhen //OnChanged-Ereignis auslösen end; Zunächst die Methode der Basisklasse aufrufen, um das Standardverhalten auszulösen. Es folgen die speziellen Aktivitäten des Weckers. Dazu wird die ticke-Methode überschrieben. Deklaration der Methode ticke als virtuelle Methode ticke wird in der Basisklasse mit dem Schlüsselwort virtual gekennzeichnet. TUhr = class procedure ticke;virtual; end; TWecker = class(TUhr) procedure ticke;override; end; ticke wird in der Unterklasse mit override gekennzeichnet und neu implementiert, damit wird die Methode überschrieben. Das Verhalten der Uhr beim Ticken wird erweitert.

32 Verhalten virtueller Methoden 32 Bei virtuellen Methoden wird erst zur Laufzeit entschieden, welche Methode aktiviert wird. Der Typ des aktuellen Objekts bestimmt die Methode. Problem: Welche Methode wird aufgerufen, wenn der Timer, der in TUhr deklariert ist, die Methode ticke aufruft? Weiteres Beispiel: Mehrere Uhren unterschiedlichen Typs werden in einem Array des Basistyps gespeichert. var Uhren : Array[1..10] of TUhr; for i := 1 to 10 do Uhren[i].ticke; Je nach Objekttyp wird die passende Methode aufgerufen! Nicht virtuelle Methoden haben diese Verhalten nicht! Sie sind statisch, d. h. schon beim Compilieren wird die Methode festgelegt!

33 Polymorphismus 33 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.

34 34 Aufgabe 1.Testen Sie das Programm Wecker und ergänzen Sie den fehlenden Quellcode. 2.Entwickeln Sie mit Hilfe zweier Wecker eine Schachuhr Zwei 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. 3.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.

35 Vererbung - Generalisierung Helmut Paulus Speyer,

36 Bankprodukte 36 Problem: Vielfalt der Objektetypen Sie sind zwar ähnlich, aber doch verschieden sind! Idee: Suche nach Gemeinsamkeiten! Organisiere sie in einer Hierarchie! Implementiere zuerst den gemeinsamen Kern! Implementiere dann nur noch die Unterschiede! Girokonto Sparkonto Depotkonto Festgeldkonto

37 Vererbung 37 SparkontoGirokontoFestgeldkonto 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 Unterschiedliches Verhalten: Sparkonto Kündigungsfrist, kein Überziehen möglich Girokonto Überweisungen, Scheck, Dispositonskredit Festgeldkonto Einzahlen und Auszahlen eingeschränkt, Mindesteinlage

38 Vererbungshierarchie Konto ist der abstrakte Oberbegriff für die drei Formen Gemeinsame Basisklasse: TKonto Konto ist der abstrakte Oberbegriff für die drei Formen Gemeinsame Basisklasse: TKonto 38 TSparkontoTGirokontoTFestgeldkonto TKonto Die Basisklasse enthält den gemeinsamen Kern. Spezialisierte Klassen werden von der Basisklasse abgeleitet; sie fügen spezielle Attribute und Operationen hinzu oder definieren bestimmte Dinge neu.

39 Abstrakte Methoden 39 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 TGirokonto.auszahlen (); begin //Dispo prüfen //Kontostand berechnen //Gebühren berechnen end; procedure TSparKonto.auszahlen (); begin //ist Konto gedeckt ? //Kontostand berechnen end; procedure TKonto.auszahlen (); begin end;

40 Abstrakte Klassen 40 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. TKonto = class... procedure auszahlen;virtual;abstract;... end; TKonto mit der abstrakten Methode auszahlen Implementierung in Basisklasse entfällt Muss in allen Unterklassen überschrieben werden

41 Klassendiagramm 41

42 42 Aufgaben 1.Testen Sie das Programm Konten und vervollständigen Sie die Auszahlungsmethoden.

43 Anhang 1 Helmut Paulus Speyer,

44 Zuweisungskompatibilität 44 Typumwandlung: as - Operator wecker := Uhr as TWecker; (Uhr as TWecker).setAlarm(6); TWecker(Uhr).setAlarm(6); Konsequenz der ist ein – Beziehung: Einer Objektvariablen einer Oberklasse können Objekte aller Unterklassen zugewiesen werden. Die Umkehrung gilt nicht. Beispiel : Var uhr : TUhr; wecker : TWecker; wecker := TWecker.create(...); Möglich: Uhr := Wecker; Uhr.setStd(12); Nicht möglich: Uhr.setAlarmStd(6) Uhr ist eine Referenz auf den Teil des Weckerobjekts, der von TUhr geerbt wird. Zuweisungskompatibilität

45 Delphis 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) 45 Alle Klassen die von TComponent abgeleitet sind heißen Komponenten, viele davon stehen in der Komponentenpalette (VCL) der Entwicklungsumgebung zur Entwurfszeit zur Verfügung. Komponenten (VCL) Beispiele: TForm1 = class(Tform) - TForm1 erweitert die vorgebene Klasse TForm TKonto = class(TObject) - Konto von TObject abgeleitet Wenn bei der Deklaration eines neuen Objekttyps kein Vorfahr angegeben wird, setzt Delphi als Vorfahr automatisch die Klasse TObject ein.

46 Delphis Klassenbibliothek (Auszug) 46

47 Anhang 2 Grundkonzepte Helmut Paulus Speyer,

48 Zusammenfassung OOP 48 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 Zeigt 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)

49 49 Klassen und Objekte Klassen sind Baupläne von Objekten. Objekte sind konkrete Exemplare (Instanzen) von Klassen. Objekte Klasse Konto1 Nummer = 100 Stand = Konto2 Nummer = 101 Stand = 2000 Konto3 Nummer = 102 Stand = 5500 TKonto Nummer getKontoStand ist Instanz von

50 50 Geheimnisprinzip abheben einzahlen überweisen Nummer: 101 Besitzer: Müller Stand: 1000 Direkter Zugriff auf Attribute nicht möglich. Nur indirekter Zugriff mit Hilfe von Methoden (set-/get). Direkter Zugriff auf Attribute nicht möglich. Nur indirekter Zugriff mit Hilfe von Methoden (set-/get). Objekte stellen Operationen/Dienste (Algorithmen) und Informationen zur Verfügung. Die innere Struktur bleibt dem Benutzer verborgen. Attribute – speichern den Zustand des Objekts Methoden – abheben, überweisen, einzahlen usw. Die Operationen (Algorithmen) auf Objekten einer Klasse heißen auch Methoden, genauer: Objekt-Methoden.

51 51 Modellierung der Klasse TKonto - Nummer : integer - Besitzer : string - Stand : double + Constructor create(...); + !abheben (PBetrag: double); + !einzahlen (PBetrag: double); + !ueberweisen(...); + ?getBesitzer : string; + ?getKontoNummer : integer; + ?getKontoStand : double; Konstruktor (erzeugt ein Objekt) UML-Klassendiagramm Zugriffsrechte: - privat (Zugriff nur innerhalb des Objekts) + öffentlich (Zugriff auch von außerhalb) Anfragen /Funktionen (Lesezugriff auf die Attribute) Aufträge (Dienste)/Prozeduren

52 52 Implementierung 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(PBetrag:double;PEKonto: TKonto); function getBesitzer : string; function getKontoNummer : integer; function getKontoStand : double; end; 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(PBetrag:double;PEKonto: 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

53 53 Konstruktoren constructor TKonto.create ( PNr: integer; PBesitzer: string); begin Nummer := PNr; Besitzer := PBesitzer; end; 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. Objekte werden mit Hilfe der Konstruktoren erzeugt: Der Konstruktor legt den Speicherbereich des Objekts an, belegt die Attribute mit Standardwerten, gibt eine Referenz auf das erzeugte Objekt zurück.

54 54 Erzeugung von Objekten var Konto1 : TKonto;... Konto1 := TKonto.create( 102, Müller ); Klassenname Das Objekt existiert noch nicht ! Deklaration der Objektvariablen nil Konto1 Konto Nummer = 102 Besitzer = Müller Stand = 0 Konto1 Die Objektvariable Konto1 erhält eine Referenz (Zeiger) auf das erzeugte Kontoobjekt. Wirkung: Objekte freigeben (Speicherfreigabe) durch Aufruf eines Destruktors Konto1.Free Destruktor Free, von TObject geerbt

55 55 Arbeiten mit Objekten Der Zugriff auf Objekte erfolgt mit Hilfe der Objektvariablen Schema: Objektvariable.Methode Das GUI-Objekt ruft eine Methode des Kontoobjekts auf. Beispiel: Konto1.abheben(500)

56 56 Nachricht Kommunikation zwischen Objekten Überweisen procedure TKonto.ueberweisen (Pbetrag : double; PEKonto : TKonto); begin abheben(PBetrag);//Betrag vom Konto abbuchen PEKonto.einzahlen(PBetrag); //Betrag auf Empfängerkonto einzahlen end; Empfängerkonto konto2konto1 Senderkonto PEKonto.einzahlen(400) Konto1.ueberweisen (400, konto2) Das Objekt Konto1 schickt dem Objekt Konto2 eine Nachricht.

57 Assoziation 57 Der Besitzer hat Objekte einer anderen Klasse. Er ist für die Verwaltung (Erzeugung und Löschen) der anderen Objekte zuständig. Hat-Beziehung Ein Objekt vom Typ KlasseB ist Teil eines Objekts von Typ KlasseA Damit Objekte miteinander kommunizieren können, müssen Beziehungen zwischen ihnen bestehen. Kennt-Beziehung Dient der Kontaktaufnahme zweier autonomer Objekte Wenn ein Objekt ein anderes Objektes aktivieren soll, muss es eine Referenz auf dieses Objekt besitzen.

58 Anhang 3 Phasen der Softwareentwicklung Helmut Paulus Speyer,

59 Software-Entwicklungsmodell 59 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. OO-AnalyseOO-DesignOO-Programmierung Entwicklungsphasen

60 OOA - OOD - OOP 60 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

61 61 Objektorientierter Entwurf Wesentliches Entwurfsziel ist die Trennung Fachkonzept, Benutzungs- oberfläche (GUI) und Datenhaltung. Bankkonto Reale Welt Entwicklungsphasen Konto OO-Analyse GUIFachkonzept Datenhaltung Ansicht Steuerung Konto KontoDatei OO-Design OOPTGUITFileTKonto

62 Anhang 3 Kursarbeit Helmut Paulus Speyer,

63 Kursarbeit 1 (Auszug) 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. a)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. b)Modelliere mit Hilfe der zur Verfügung gestellten Klassen die Schachuhr. Stelle das Ergebnis in einem OOD-Klassendiagramm dar. Die Abbildung zeigt einen Prototyp. c)Leider hat der Programmierer noch einige wichtige Fähigkeiten der Uhrobjekte vergessen: i.die Uhren laufen noch nicht selbständig ii.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. d)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) Kursarbeit 1 (Anhang) 64 Dokumentation der Klasse "TZiffernblatt" Beschreibung der Klasse: Analoganzeige einer Uhr reagiert auf das OnChanged-Ereignis des Uhrobjekts Bezugsklasse: TImage. Objektbeziehungen TUhr (Beziehungstyp: Kennt, Kardinalität 1) Attribute myUhr : TUhrReferenz 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()

65 Kursarbeit 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 o zeigt die Phasen ROT-ROTGELB-GRUEN-GELB nach einander mit verschiedenen Zeitdauern. o 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 65 a)Erläutere an diesem Beispiel die einzelnen Phasen eines objektorientierten Software-Entwurfs. b)Führe eine OO-Analyse durch. Stelle deine Ergebnisse in einem Klassendiagramm dar und erläutere es kurz ( Attribute, Methoden, Beziehungen). c)Beschreibe die verschiedenen Ampelzustände mit Hilfe eines Zustandsdiagramms und entwickle für einen komplette Schaltzyklus der Steueranlage ein Aktivitätsdiagramm. d)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.

66 Kursarbeit 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: (1)Es soll ein Programm entwickelt werden, das wie im Bild drei Weltzeituhren enthält, die die Uhrzeit einer bestimmten Weltstadt (Zeitzone) anzeigen. (2)Die im Unterricht entwickelte Klasse TUhr ist zu dazu zu erweitern. (3)Die Uhren laufen nicht selbst, sondern werden synchron von außen gesteuert. Die Zeitanzeige ist digital. 66 a)Erläutere den grundsätzlichen Unterschied zwischen der prozeduralen und der objektorientierten Programmierweise. Beziehe dich dabei auf eines der Unterrichtsprojekte. b)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) c)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. d)Begründe deine Entscheidungen kurz und stelle das Ergebnis in einem erweitereten UML-Klassendiagramm dar. e)Implementiere eine GUI mit drei laufenden Uhren wie im Bild. Verwende die Unit uWUhr.pas. Zeitzonen: Budapest +1, Detroit – 6, Aukland +11

67 Kursarbeit 2 67 Klassendiagramm

68 Kursarbeit 2 68 Telefonbuch Anton Meyer 084/1234 false 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. a)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. b)Implementiere die Konstruktoren beiden Klassen, sowie eine Methode zum Einfügen eines neuen Eintrags ins Telefonbuch. c)Erzeuge ein Telefonbuch mit maximal 10 Einträgen und füge folgende Einträge ein. [Anton, Meyer, 0675/1234, ja], [ Uwe, Ochsenknecht, 084/1234, nein] Gib auch die notwendigen Variablendeklarationen an und erläutere sie. d)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

69 Links und Literatur E. Modrow: Informatik mit Delphi, Band 1/2, Dümmler-Stam P. Damann, J. Wemßen: Objektorientierte Programmierung mit Delphi, Band 1. Klett-Verlag U. Bänisch: Praktische Informatik mit Delphi, Band 1/2. Cornelsen Frischalowski: Delphi 5.0, Band 1/2, Herdt-Verlag Pohl: Schülerübungen / Klausuren in Delphi, Heft 1/2, Verlag J. Pohl K. Merkert: R. Mechling: K. Heidler: Hessischer Bildungsserver: Katja Weishaupt S. Spolwig: Daniel Garmann Weitere Hinweise unter: Einsteiger-Tutorial 69


Herunterladen ppt "Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09."

Ähnliche Präsentationen


Google-Anzeigen