Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Grundkonzepte der objektorientierten Programmierung mit Delphi

Ähnliche Präsentationen


Präsentation zum Thema: "Grundkonzepte der objektorientierten Programmierung mit Delphi"—  Präsentation transkript:

1 Grundkonzepte der objektorientierten Programmierung mit Delphi
Helmut Paulus Speyer,

2 Problem 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ächen u. a. MVC: Modell-Ansicht-Steuerung

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 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% Tastatureingaben model controller Kennzeichen: Trennung von Benutzungsoberfläche (GUI) und Fachkonzept (Model)

5 MVC-Uhr 12 : 14 : 04 GUI Modell Fachkonzept 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 Darstellung Steuerung schreibt liest GUI Uhr Std= 12 Min= 17 Sec = 0 Modell Fachkonzept

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

7 Trennung 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. Ä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 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 Realisierung 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)

10 Modellierung 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: 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

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

12 TModuloZaehler 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 Uhr verwaltet 3 Zählerobjekte (hat-Beziehung)
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 Vernichtung der Zählerobjekte
TUhr 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 min.weiterZaehlen; if min.getStand = 0 then std.weiterzaehlen; end; Die Uhr tickt. Aktivieren der Zähler

15 Entwicklung der GUI OO-Entwurf Prototyp OOD-Klassendiagramm

16 Zeiger auf ein Uhrobjekt hat Beziehung
Objektverwaltung 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

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

18 Aufgaben 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.

19 Uhr mit Ereignis Helmut Paulus Speyer,

20 Ein 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 Implementation erfolgt in vier Schritten: Vereinbarung eines Methodenzeiger-Typs Vereinbarung eines Methodenzeigers Aufruf der Ereignisprozedur über den Methodenzeiger Zuweisung einer Ereignisprozedur Die Schritte (1) – (3) erfolgen im Modellobjekt, Schritt (4) im Formular.

21 Implementation 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

22 Auslö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 <> 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!

23 Ereignisbearbeitungsmethode
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)

24 Uhr mit Timer Helmut Paulus Speyer,

25 Uhr mit Timer Hat - Beziehung
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.

26 Implementierung Objektreferenz Ereignismethode des Timers
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; 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.

27 Erzeugung und Vernichtung des Timers
constructor TUhr.create; begin Timer := TTimer.create(nil); with Timer do interval := 1000; enabled := true; OnTimer := weiter 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

28 Vererbung - Spezialisierung
Helmut Paulus Speyer,

29 Ziel 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.

30 Vererbung - Spezialisierung
Die Basisklasse TWecker als Spezialisierung der Klasse TUhr Basisklasse gemeinsamer Kern abgeleitete Klasse (Unterklasse) Erweiterungen TUhr # timer : TTimer #!weiter(Sender : TObject) + OnChanged : TEreignis +!ticke Generalisierung Spezialisierung ist ein - Beziehung TWecker # AlarmMin : integer # AlarmStd : integer + OnAlarm : TEreignis +!ticke 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. 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; ticke wird in der Unterklasse mit override gekennzeichnet und neu implementiert, damit wird die Methode überschrieben.

32 Verhalten 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. 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 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 Aufgabe Testen Sie das Programm ‚Wecker’ und ergänzen Sie den fehlenden Quellcode. 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. 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 Depotkonto Girokonto Festgeldkonto Sparkonto
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!

37 Vererbung Sparkonto Girokonto Festgeldkonto Nummer Inhaber Stand …
Kündigungsfrist Nummer Inhaber Stand Zeitraum 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

38 Vererbungshierarchie
Konto ist der abstrakte Oberbegriff für die drei Formen  Gemeinsame Basisklasse: TKonto TSparkonto TGirokonto TFestgeldkonto 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 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;

40 Abstrakte Klassen TKonto mit der abstrakten Methode auszahlen
TKonto = class ... procedure auszahlen;virtual;abstract; 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.

41 Klassendiagramm

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

43 Anhang 1 Helmut Paulus Speyer,

44 Zuweisungskompatibilität
Konsequenz der „ist ein“ – Beziehung: Einer 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);

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) 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)

47 Anhang 2 Grundkonzepte Helmut Paulus Speyer,

48 Zusammenfassung OOP OOP-Idee: Prinzipien:
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 Klassen und Objekte Klasse Objekte TKonto Konto1 Konto2 Konto3
Nummer getKontoStand ist Instanz von Objekte Konto1 Nummer = 100 Stand = 10000 Konto2 Nummer = 101 Stand = 2000 Konto3 Nummer = 102 Stand = 5500 Klassen sind Baupläne von Objekten. Objekte sind konkrete Exemplare (Instanzen) von Klassen.

50 Geheimnisprinzip Objekte stellen Operationen/Dienste (Algorithmen) und Informationen zur Verfügung. Die innere Struktur bleibt dem Benutzer verborgen. abheben einzahlen überweisen Nummer: 101 Besitzer: Müller Stand: € 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).

51 Modellierung der Klasse
UML-Klassendiagramm Zugriffsrechte: - privat (Zugriff nur innerhalb des Objekts) + öffentlich (Zugriff auch von außerhalb) 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) Aufträge (Dienste)/Prozeduren Anfragen /Funktionen (Lesezugriff auf die Attribute)

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; private Zugriff von außen nicht möglich public Zugriff von außen möglich

53 Konstruktoren 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.

54 Erzeugung von Objekten
var Konto1 : TKonto; ... Konto1 := TKonto.create(102, ‘Müller‘); Das Objekt existiert noch nicht ! Deklaration der Objektvariablen nil Konto1 Klassenname 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 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 Konto1.ueberweisen (400, konto2)
Nachricht Kommunikation zwischen Objekten Konto1.ueberweisen (400, konto2) Das Objekt Konto1 schickt dem Objekt Konto2 eine Nachricht. Empfängerkonto konto2 konto1 Senderkonto PEKonto.einzahlen(400) Überweisen procedure TKonto.ueberweisen (Pbetrag : double; PEKonto : TKonto); begin abheben(PBetrag); //Betrag vom Konto abbuchen PEKonto.einzahlen(PBetrag); //Betrag auf Empfängerkonto einzahlen end;

57 Assoziation 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. 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

58 Anhang 3 Phasen der Softwareentwicklung
Helmut Paulus Speyer,

59 Software-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.

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

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

62 Anhang 3 Kursarbeit Helmut Paulus Speyer,

63 Kursarbeit 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. Objektbeziehungen 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 setzeMyUhr(uhr : TUhr) nachher: Attribut MyUhr ist gesetzt und OnChanged-Ereignis mit der privaten Methode aktualisiere 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 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 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.

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: 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. Zeitzonen: Budapest +1, Detroit – 6, Aukland +11

67 Kursarbeit 2 Klassendiagramm

68 Kursarbeit 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. Telefonbuch Anton Meyer 084/1234 false 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, nein] Gib auch die notwendigen Variablendeklarationen 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

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


Herunterladen ppt "Grundkonzepte der objektorientierten Programmierung mit Delphi"

Ähnliche Präsentationen


Google-Anzeigen