1 / 77

Grundkonzepte der objektorientierten Programmierung Teil 2

Grundkonzepte der objektorientierten Programmierung Teil 2. Klaus Becker 2006. 1$. 1$. 1$. 1$. 1$. 1$. 1$. 1$. 1$. 1$. 1$. 3. Objektorientierte Modellierung. 1. 4. 2. 5. 3. 3. 6. Miniwelt. Modell. System. Teil 1. Beziehungen zwischen Objekten. 1$. 1$. 1$. 1$. 1$.

ita
Download Presentation

Grundkonzepte der objektorientierten Programmierung Teil 2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Grundkonzepte der objektorientierten ProgrammierungTeil 2 Klaus Becker 2006

  2. 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 3 Objektorientierte Modellierung 1 4 2 5 3 3 6 Miniwelt Modell System

  3. Teil 1 Beziehungen zwischen Objekten

  4. 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 3 Das Würfelspiel „chuck a luck“ Einsatz zahlen und Zahl tippen Würfel werfen Gewinn auszahlen Einsatz: 1 $ Gewinn: 0 Treffer: 1 Treffer: Einsatz + 1 $ 2 Treffer: Einsatz + 2 $3 Treffer: Einsatz + 3 $ 1 4 2 5 3 3 6

  5. 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 3 Zielsetzung Ziel ist es, ein Simulationsprogramm zu entwickeln, mit dem das Würfelspiel „chuck a luck“ am Rechner gespielt werden kann. Am Beispiel dieses einfachen und überschaubaren Systems sollen Grundkonzepte der objektorientierten Programmierung verdeutlicht werden. 1 4 2 5 Miniwelt 3 3 6 System

  6. 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 3 Lösungsansatz mit Modellierung 1 4 2 5 Miniwelt 3 3 6 Ansatz: Mit Hilfe eines Modells soll die Miniwelt zunächst programmiersprachen-unabhängig beschrieben werden. Das Modell soll dann helfen, in einem zweiten Schritt das Programm möglichst gut zu strukturieren. - Abbild der Miniwelt - Vorlage für das System Modell System

  7. Spiel ohne Überwachung Das bisher entwickelte Programm zur Simulation des Chuck-A-Luck-Spiels lässt noch Bedienungen zu, die in der Miniwelt nicht erlaubt sind. Einsatz zahlen und Zahl tippen Würfel werfen Gewinn verbuchen Einsatz zahlen Zahl tippen (z. B. 2) Solange Würfel werfen, bis die getippte Zahl fällt Gewinn mehrfach verbuchen

  8. Zustandsbasierte Ablaufmodellierung Ausgelöste Aktion(en) Einsatz vom Konto abbuchen Spielzahl festlegen Würfelwerfen simulieren Gewinn ermitteln und auf dem Konto verbuchen AktuellerZustand bereit einsatzgezahlt gewürfelt NeuerZustand einsatzgezahlt einsatzgezahlt gewürfelt bereit Auslösendes Ereignis BEinsatzZahlen.onClick RGSpielfeld.onClick BWuerfelWerfen.onClick BGewinnVerbuchen.onClick Einsatz zahlen und Zahl tippen Würfel werfen Gewinn verbuchen

  9. 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 3 Spiel mit Spielmanager 1 4 2 5 3 3 6 Miniwelt In der Miniwelt wird der korrekte Spielablauf durch eine Person überwacht und gesteuert. In der Modellwelt soll diese Steuerung durch ein Objekt „spielmanager“ übernommen werden. Dieses Objekt ist zuständig für die Verwaltung des Spielzustandes und die jeweilige Aktivierung der am Spiel beteiligten Objekte.

  10. 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 3 Spiel mit Spielmanager 1 4 2 5 3 3 6 Modell Miniwelt spielmanager Zuständigkeit:verwaltet den Spielzustand und erteilt die passenden Aufträge an die Spiel-Objekte ... spielbrett wuerfelA wuerfelB wuerfelC konto zahl = 3 augen = 3 augen = 3 augen = 5 stand = 9

  11. Spielmanager aktiviert Spiel-Objekte Ausgelöste Aktion(en) Einsatz vom Konto abbuchen AktuellerZustand bereit NeuerZustand einsatzgezahlt Auslösendes Ereignis BEinsatzZahlen.onClick BEinsatzZahlen.OnClick [zustand = bereit]:

  12. Spielmanager aktiviert Spiel-Objekte Ausgelöste Aktion(en) Spielzahl festlegen AktuellerZustand einsatzgezahlt NeuerZustand einsatzgezahlt Auslösendes Ereignis RGSpielfeld.onClick RGSpielfeld.onClick [zustand = einsatzgezahlt]:

  13. Spielmanager aktiviert Spiel-Objekte Ausgelöste Aktion(en) Würfelwerfen simulieren AktuellerZustand einsatzgezahlt NeuerZustand gewürfelt Auslösendes Ereignis BWuerfelWerfen.onClick BWuerfelWerfen.onClick [zustand = einsatzgezahlt]:

  14. Spielmanager aktiviert Spiel-Objekte Ausgelöste Aktion(en) Gewinn ermitteln und auf dem Konto verbuchen AktuellerZustand gewürfelt NeuerZustand bereit Auslösendes Ereignis BGewinnVerbuchen.onClick BGewinnVerbuchen.onClick [zustand = gewuerfelt]:

  15. Aktivierung von Objekten Ein Objekt stellt seiner Umgebung bestimmte Dienste (Operationen) zur Verfügung. Durch eine Nachricht veranlasst ein „Kunde“ das Objekt, die Dienstleistung zu erledigen. Das Objekt führt dann die Operation aus. konto Zustand vorher stand = 9 abheben(1)  spielmanager konto Aktivierung durch eine Nachricht zustand = bereit stand = 9 konto Zustand nachher stand = 8

  16. Beziehung zwischen Objekten Ein Nachrichtenaustausch zwischen Objekten kann nur stattfinden, wenn das sendende Objekt die Nachricht dem Empfängerobjekt „zustellen“ kann. Hierzu müssen diese Objekte in Beziehung zueinander stehen. wuerfelA spielbrett hat hat wuerfelB spielmanager konto hat hat hat wuerfelC kennt kennt wuerfelA spielbrett kennt kennt wuerfelB spielmanager konto kennt wuerfelC

  17. Hat-Beziehung / Komposition wuerfelA spielbrett hat hat wuerfelB spielmanager konto hat hat hat wuerfelC Bei dieser Struktur geht man davon aus, dass ein Objekt ein anderes besitzt, d. h. die vollständige Kontrolle über dieses Objekt hat. Insbesondere ist es für die Erzeugung und Vernichtung des kontrollierten Objekts zuständig. Man spricht in diesem Fall von einer Hat-Beziehung.

  18. Kennt-Beziehung / Verbindung wuerfelA spielbrett kennt kennt wuerfelB spielmanager konto kennt kennt wuerfelC kennt Bei diesen Beziehungen führen die beteiligten Objekte ein Eigenleben. Die in Verbindung stehenden Objekte sind zwar aufeinander angewiesen, weil sie beispielsweise miteinander kommunizieren müssen, um eine gemeinsame Aufgabe zu erledigen, aber es reicht, wenn ein Objekt das andere kennt. Man spricht von einer Kennt-Beziehung zwischen Objekten.

  19. Modell mit Spielmanager TSpielmanager TSpielbrett hat - zustand: ...... TWuerfel hat + „erzeugen“ + „vernichten“ + einsatzZahlen + spielzahlSetzen(z: int.)+ wuerfelWerfen+ gewinnVerbuchen + getZustand: ... ... TWuerfel hat TWuerfel hat TKonto hat wuerfelA spielbrett hat hat wuerfelB spielmanager konto hat hat hat wuerfelC

  20. Modell mit Spielmanager TSpielmanager TSpielbrett kennt - zustand: ...... TWuerfel kennt + „erzeugen“ + „vernichten“ + einsatzZahlen + spielzahlSetzen(z: int.)+ wuerfelWerfen+ gewinnVerbuchen + getZustand: ... ... TWuerfel kennt TWuerfel kennt TKonto kennt kennt kennt wuerfelA spielbrett kennt kennt wuerfelB spielmanager konto kennt wuerfelC

  21. Teil 2 Objekte in Aktion

  22. Zielsetzung Ziel ist es, das Chuck-A-Luck-Spiel mit einem Spielmanager zu simulieren. Hat-Beziehung Kennt-Beziehung Beachte: In BlueJ werden Hat- und Kennt-Beziehung auf gleiche Weise mit Hilfe von Pfeilen dargestellt.

  23. Modell mit Hat-Beziehung Schritt 1: Erzeugen Sie ein Objekt „GUI“ als Exemplar der Klasse „TGUI“.

  24. Modell mit Hat-Beziehung Schritt 2: Inspizieren Sie zunächst das Objekt „GUI“ und die von ihm verwalteten Spielobjekte. Hier erkennt man, welches Objekt auf welches andere einen direkten Zugriff hat.

  25. Modell mit Hat-Beziehung Schritt 3: Aktivieren Sie mit Hilfe von „GUI“ die einzelnen Spielaktionen. Die Veränderungen der Objektzustände kann man sich durch Inspektion anschauen.

  26. Modell mit Hat-Beziehung Schritt 4: Aktivieren Sie abschließend die Methode „spielDatenAnzeigen“ des Objekts „GUI“. Diese Methode sollte jetzt genau die Spielergebnisse anzeigen, die man auch durch Inspektion der Objekte erhält.

  27. Modell mit Kennt-Beziehung Schritt 1: Erzeugen Sie ein Objekt „GUI“ als Exemplar der Klasse „TGUI“.Schritt 2: Inspizieren Sie dieses Objekt und die von ihm verwalteten Objekte.

  28. Modell mit Kennt-Beziehung Schritt 3: Führen Sie ein Spiel mit den Methoden von „GUI“ aus.Schritt 4: Lassen Sie „GUI“ die Spielergebnisse anzeigen.

  29. Teil 3 Implementierung der Hat-Beziehung

  30. Zielsetzung TSpielmanager TWuerfel hat - zustand: ...... erstellen fertig + create + wuerfelWerfen... instance of instance of Teil-Modell spielmanager wuerfelA hat zustand = ... augen = 3 Die Implementierung der Hat-Beziehung soll anhand eines Teilmodells des Gesamtmodells gezeigt werden. Wir verzichten vorerst auf die Verwaltung des Spielzustands.

  31. Referenzen schaffen Beziehungen Mit Hilfe von Referenzattributen kann ein Objekt sich die Adressen seiner „Beziehungspartner“ merken. Speicheradresse 3A80 3A80 Referenzattribut

  32. Klasse mit Referenzattribut TSpielmanager - zustand: ...- wuerfelA: TWuerfel... Referenzattribut Speicheradresse + „erzeugen“ + „vernichten“ + einsatzZahlen + spielzahlSetzen(z: int.)+ wuerfelWerfen+ gewinnVerbuchen + getZustand: ... ... 3A80 3A80 Referenzattribut Die Klasse TSpielmanager muss um Referenzattribute erweitert werden, mit deren Hilfe die Beziehungen zu anderen Objekten verwaltet werden.

  33. Modellstruktur FGUI spielmanager wuerfelA hat hat Bei der Hat-Beziehung geht man davon aus, dass ein Objekt ein anderes besitzt, d. h. die vollständige Kontrolle über dieses Objekt hat. Insbesondere ist es für die Erzeugung und Vernichtung des kontrollierten Objekts zuständig. Man spricht in diesem Fall von einer Hat-Beziehung.

  34. Modellklasse mit Referenzattributen unit uSpielmanager; interface uses uWuerfel; type TSpielmanager = class private wuerfelA: TWuerfel; public constructor create; destructor destroy; override; ... end; implementation TSpielmanager Einbindung der Klassen-Unit • wuerfelA: TWuerfel • ... ... Deklaration des Referenzattributs

  35. Erzeugung des Würfel-Objekts type TSpielmanager = class privatewuerfelA: TWuerfel; public constructor create; destructor destroy; override; ... end; implementationconstructor TSpielmanager.create;beginwuerfelA := TWuerfel.create;end;destructor TSpielmanager.destroy;beginwuerfelA.free;end; FGUI spielmanager wuerfelA hat hat Modellstruktur

  36. Implementierung einer Nachricht ... type TSpielmanager = class private wuerfelA: TWuerfel; public constructor create; destructor destroy; override; procedure wuerfelWerfen; ... end; implementation ... procedure TSpielmanager.wuerfelWerfen;beginwuerfelA.werfen;end; FGUI spielmanager wuerfelA hat hat Modellstruktur Nachricht werfen  spielmanager wuerfelA Senderobjekt-Klasse Operation Empfängerobjekt

  37. Erzeugung des Spielmanager-Objekts unit uGUI; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, uSpielmanager; type TGUI = class(TForm) ... private { Private-Deklarationen }spielmanager: TSpielmanager;public { Public-Deklarationen } end; implementation{$R *.DFM} procedure TGUI.FormCreate(Sender: TObject);beginspielmanager := TSpielmanager.create;end; ... FGUI spielmanager wuerfelA hat hat Modellstruktur

  38. Zugriff auf Objekte unit uGUI; interface ... implementation {$R *.DFM} procedure TGUI.BWerfenClick(Sender: TObject);begin // Aktualisierung der Modell-Objektespielmanager.wuerfelWerfen; // Aktualisierung der AnzeigePWuerfelA.Caption := IntToStr(spielmanager.getWuerfelA);end; ... FGUI spielmanager wuerfelA hat hat Modellstruktur Kein direkter Zugriff auf wuerfelA möglich Nachrichten Nachrichten getWuerfelA  getAugen  FGUI spielmanager wuerfelA

  39. Zugriff auf ein abhängiges Objekt unit uGUI; interface ... implementation {$R *.DFM} procedure TGUI.BWerfenClick(...);begin // Aktualisierung der Modell-Objekte spielmanager.wuerfelWerfen; // Aktualisierung der Anzeige PWuerfelA.Caption := IntToStr(spielmanager.getWuerfelA);end; FGUI spielmanager wuerfelA hat hat TSpielmanager - wuerfelA: Wuerfel ... + create + destroy + wuerfelWerfen... + getWuerfelA: integer... Hilfsoperation function TSpielmanager.getWuerfelA: integer;begin result := wuerfelA.getAugen;end;

  40. Aufgabe Die gezeigte Implementierung des Teilmodells „Spielmanager hat Wuerfel“ finden Sie im Verzeichnis „ChuckALuck21NurWuerfelnMitHatBeziehung“. Testen Sie zunächst diese Implementierung. Beachten Sie, dass man hier nur Würfel A werfen kann. Bauen Sie dann schrittweise diese Implementierung zu einer Implementierung des gesamten Spiels aus. Berücksichtigen Sie zunächst noch nicht den jeweiligen Spielzustand. Berücksichtigen Sie in einem letzten Schritt den jeweiligen Spielzustand. Eine vollständige Implementierung finden Sie im Verzeichnis „ChuckALuck22GesamtesSpielMitHatBeziehung“.

  41. Teil 4 Implementierung einer Kennt-Beziehung

  42. Zielsetzung TSpielmanager TWuerfel kennt - zustand: ...... + create + wuerfelWerfen... instance of instance of Teil-Modell spielmanager wuerfelA kennt zustand = ... augen = 3 Hier sollen die Ähnlichkeiten und Unterschiede zwischen einer Implementierung der Kennt-Beziehung und der Hat-Beziehung aufgezeigt werden.

  43. Bekanntschaft durch Referenzen TSpielmanager - zustand: ...- wuerfelA: TWuerfel... Referenzattribut Speicheradresse + „erzeugen“ + „vernichten“ + einsatzZahlen + spielzahlSetzen(z: int.)+ wuerfelWerfen+ gewinnVerbuchen + getZustand: ... ... 3A80 3A80 Referenzattribut Die Ausgangssituation bleibt gleich: Die Klasse TSpielmanager muss um Referenzattribute erweitert werden, mit deren Hilfe die Beziehungen zu anderen Objekten verwaltet werden.

  44. Modellstruktur FGUI spielmanager wuerfelA hat kennt Bei der Kennt-Beziehung führen die beteiligten Objekte ein Eigenleben. Die in Verbindung stehenden Objekte sind zwar aufeinander angewiesen, weil sie beispielsweise miteinander kommunizieren müssen, um eine gemeinsame Aufgabe zu erledigen, aber es reicht, wenn ein Objekt das andere kennt.

  45. Erzeugung der Objekte unit uGUI; interface uses ..., uWuerfel, uSpielmanager; type TGUI = class(TForm) ... private { Private-Deklarationen } wuerfelA: TWuerfel;spielmanager: TSpielmanager;public { Public-Deklarationen } end; implementation {$R *.DFM} procedure TGUI.FormCreate(Sender: TObject);begin randomize;wuerfelA := TWuerfel.create;spielmanager := TSpielmanager.create(wuerfelA);end; FGUI spielmanager wuerfelA hat kennt Modellstruktur

  46. Erzeugung der Kennt-Referenz 3A80 3A80 3A80 spielmanager := TSpielmanager.create(wuerfelA); constructor TSpielmanager.create(wA: TWuerfel);begin wuerfelA := wA;end; 3A80 3A80 3A80

  47. Zugriff auf Objekte unit uGUI; interface ... implementation {$R *.DFM} procedure TGUI.BWerfenClick(Sender: TObject);begin // Aktualisierung der Modell-Objekte spielmanager.wuerfelWerfen; // Aktualisierung der Anzeige PWuerfelA.Caption := IntToStr(wuerfelA.getAugen);end; ... FGUI spielmanager wuerfelA hat kennt Modellstruktur direkter Zugriff auf wuerfelA möglich Nachrichten wuerfelWerfen  werfen  FGUI spielmanager wuerfelA getAugen 

  48. Aufgabe Die gezeigte Implementierung des Teilmodells „Spielmanager kennt Wuerfel“ finden Sie im Verzeichnis „ChuckALuck31NurWuerfelnMitKenntBeziehung“. Testen Sie zunächst diese Implementierung. Beachten Sie, dass man hier nur Würfel A werfen kann. Bauen Sie dann schrittweise diese Implementierung zu einer Implementierung des gesamten Spiels aus. Berücksichtigen Sie zunächst noch nicht den jeweiligen Spielzustand. Berücksichtigen Sie in einem letzten Schritt den jeweiligen Spielzustand. Eine vollständige Implementierung finden Sie im Verzeichnis „ChuckALuck32GesamtesSpielMitKenntBeziehung“.

  49. Aufgabe Das Simulationsprogramm zum Chuck-A-Luck-Spiel soll jetzt wie folgt verändert werden:- Es werden gezinkte Würfel benutzt (die keine 6 ermöglichen).- Der Spieleinsatz beträgt jetzt 2$, als Gewinne erhält man das 3-fache der Anzahl der Treffer (in $) zurück.- Die Würfel werden mit Hilfe von Bildern angezeigt.Machen Sie sich zunächst klar, wo im bestehenden Programm die jeweiligen Änderungen vorgenommen werden müssen (in einem gut strukturierten objektorientierten Programm sollte das kein Problem sein). Nehmen Sie dann die Änderungen schrittweise vor.

More Related