890 likes | 1.19k Views
Grundkonzepte der objektorientierten Programmierung. Objektorientierung. Grundideen. Grundkonzepte. Objekt. Klasse. Nachricht. Assoziation. Modellierungssprache: UML. Implementierungssprache: Delphi, Java,. Teil 1. Modellierung mit Objekten, Klassen und Nachrichten. 1$. 1$. 1$. 1$.
E N D
Objektorientierung Grundideen Grundkonzepte ... Objekt Klasse Nachricht Assoziation Modellierungssprache: UML Implementierungssprache: Delphi, Java, ...
Teil 1 Modellierung mit Objekten, Klassen und Nachrichten
1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ Das Würfelspiel „chuck a luck“ Der Spieler zahlt den Einsatz. Einsatz: 1 $ Gewinn: Einsatz +1 Treffer: 1 $ 2 Treffer: 2 $3 Treffer: 3 $ Der Spieler tippt auf eine Zahl. 1$ 1 2 3 4 5 6
1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ Das Würfelspiel „chuck a luck“ Der Spieler zahlt den Einsatz. Einsatz: 1 $ Gewinn: Einsatz +1 Treffer: 1 $ 2 Treffer: 2 $3 Treffer: 3 $ Der Spieler tippt auf eine Zahl. Der Spieler wirft die drei Würfel. 1$ 1 2 3 3 4 5 6
1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ Das Würfelspiel „chuck a luck“ Der Spieler zahlt den Einsatz. Einsatz: 1 $ Gewinn: Einsatz +1 Treffer: 1 $ 2 Treffer: 2 $3 Treffer: 3 $ Der Spieler tippt auf eine Zahl. Der Spieler wirft die drei Würfel. Der Anbieter zahlt den Gewinn. 1 2 3 3 1$ 1$ 4 5 6
1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ Zielsetzung Entwicklung eines interaktiven Systems, das dem Benutzer das Würfelspiel „chuck a luck“ bereitstellt. 1$ 1 2 3 3 4 5 6 Benutzer Chuck-a-Luck-System
1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ Objektorientierte Modellierung Miniwelt: 1$ 1 2 3 3 4 5 6 Sichtweise:Die Miniwelt ist aus Gegenständen aufgebaut, die in Beziehung zueinander stehen können. Gegenstände können Personen, Dinge, Sachverhalte, Ereignisse, ... sein. Jeder Gegenstand stellt eine autonome Einheit mit klar begrenzten Aufgaben dar. Gegenstände der Miniwelt „chuck a luck“:3 Würfel, Spielbrett, Spielerkonto, ...
1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ Objektorientierte Modellierung Miniwelt: 1$ 1 2 3 3 4 5 6 wuerfelA wuerfelB wuerfelC spielbrett konto Modell(welt): Grundidee der objektorientierten Modellierung:Die Gegenstände der Miniwelt werden mit Objekten im Sinne der Informatik beschrieben.
1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ Struktur eines Objektes Miniwelt: 1$ 1 2 3 3 4 5 6 Eigenschaft:Augen Operation:werfen Eigenschaft: Zahl Operation: Tipp setzen Eigenschaft: Stand Operationen:Betrag einzahlenBetrag abheben
1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ Attribute Miniwelt: 1$ 1 2 3 3 4 5 6 Modell: wuerfelA wuerfelB wuerfelC spielbrett konto augen = 3 augen = 3 augen = 5 zahl = 3 stand = 9 Die charakteristischen Eigenschaften eines Objekts werden mit Attributen erfasst. Die Gesamtheit der Attributwerte legt den Objektzustand fest.
1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ Methoden Miniwelt: 1$ 1 2 3 3 4 5 6 Modell: wuerfelA wuerfelB wuerfelC spielbrett konto augen = 3 augen = 3 augen = 5 zahl = 3 stand = 9 werfen werfen werfen tipp setzen betrag abhebenbetrag einzahlen Das Verhalten eines Objekts wird mit Operationen / Methoden erfasst. Diese bestimmen die dynamischen Eigenschaften eines Objekts.
Klassen Klassen: Wuerfel Spielbrett Konto augen zahl stand werfen tipp setzen betrag abhebenbetrag einzahlen Objekte: wuerfelA wuerfelB wuerfelC spielbrett konto augen = 3 augen = 3 augen = 5 zahl = 3 stand = 9 werfen werfen werfen tipp setzen betrag abhebenbetrag einzahlen Klassen beschreiben die Gesamtheit gleich strukturierter Objekte.
Klassen Klassen: Wuerfel Spielbrett Konto augen zahl stand werfen tipp setzen betrag abhebenbetrag einzahlen Objekte: instance of instance of instance of wuerfelA wuerfelB wuerfelC spielbrett konto augen = 3 augen = 3 augen = 5 zahl = 3 stand = 9 Klassen sind Baupläne für Objekte. Objekte werden als Exemplare (Instanzen) von Klassen bezeichnet.
UML Wuerfel UML-Klassendiagramm augen werfen instance of UML-Objektdiagramm wuerfelA wuerfelB wuerfelC augen = 3 augen = 3 augen = 5 UML (Unified Modeling Language): Grafische Sprache zur Beschreibung objektorientierter Modelle
Konstruktoren / Destruktoren Klassen: Wuerfel Spielbrett Konto augen zahl stand erzeugen vernichten werfen erzeugen vernichten tipp setzen erzeugen vernichten betrag abhebenbetrag einzahlen Konstruktoren / Destruktoren sind spezielle Operationen zur Erzeugung/ Vernichtung von Objekten. Beachte: Konstruktoren / Destruktoren sind Klassenmethoden(d. h. Objekte verfügen nicht über diese Methoden).
Datenkapselung Geheimnisprinzip:Die für die Benutzung einer Systemkomponente (eines Moduls) nicht benötigten Detailinformationen werden verborgen. Datenkapselung bei Objekten / Klassen:Die innere Struktur eines Objekts (Aufbau über Attribute) wird verborgen. Objekte stellen Dienste nur über ihre Operationen / Methoden bereit. Konto Konto stand stand erzeugen vernichten betrag abhebenbetrag einzahlen erzeugen vernichten betrag abhebenbetrag einzahlen
Zugriffsmethoden Um auf Attributwerte (lesend bzw. schreibend) zugreifen zu können, werden spezielle Zugriffsmethoden benötigt. Konto Konto Konto stand stand stand erzeugen vernichten betrag abhebenbetrag einzahlen erzeugen vernichten betrag abhebenbetrag einzahlen erzeugen vernichten betrag abhebenbetrag einzahlen stand erfragenstand setzen
Schnittstellenspezifikation Genaue Festlegung der Benutzungsschnittstelle • Zugriffsrechte (- kein Zugriff; + Zugriff erlaubt) • Datentypen (und Initialisierungswerte) • Signaturen (Festlegung der Parameter) Konto Konto stand – stand: integer erzeugen vernichten betrag abhebenbetrag einzahlen stand erfragenstand setzen + create(betrag: integer) + destroy + abheben(betrag: integer) + einzahlen(betrag: int.) + getStand: integer + setStand(betrag: integer)
Aufgabe Verfeinern Sie analog zur Konto-Klasse die weiteren Klassen der ChuckALuck-Miniwelt und erstellen Sie mit Hilfe . Wuerfel Spielbrett Konto augen zahl stand werfen tipp setzen betrag abhebenbetrag einzahlen Konto – stand: integer + create(betrag: integer) + destroy+ abheben(betrag: integer) + einzahlen(betrag: int.) + getStand: integer + setStand(betrag: integer)
Aktivierung von Objekten konto Zustand vorher stand = 9 abheben(1) „Kunde“ konto Aktivierung durch Nachricht stand = 9 konto Zustand nachher stand = 8 Sichtweise: Das Objekt stellt seiner Umgebung bestimmte Dienste (Operationen) zur Verfügung. Durch eine Nachricht veranlasst ein „Kunde“ das Objekt, die Dienstleistung zu erledigen (Operation auszuführen).
3: werfen 2: setzen(tipp) 7: getAugen 6: getZahl 4: werfen 1: abheben(1) 8: getAugen 5: werfen 9: getAugen Das Spiel als Nachrichtenaustausch wuerfelA spielbrett wuerfelB konto 10: einzahlen(richtige+1) wuerfelC UML-Kollaborationsdiagramm
Das Spiel als Nachrichtenaustausch UML-Sequenzdiagramm
UML-Editoren Mit Hilfe von UML-Editoren (wie z. B. Violet) lassen sich UML-Modelle leicht erstellen.
Aufgabe Erstellen Sie mit Hilfe des UML-Editors „Violet“ ein Objekt- und ein Klassendiagramm zur Beschreibung der ChuckALuck-Miniwelt. Ergänzen Sie auch das bereits begonnene Interaktionsdiagramm. Hier soll der gesamte Nachrichtenaustausch zur Beschreibung des Spielablaufs dargestellt werden.
Lösung UML-Objektdiagramm:
Lösung UML-Klassendiagramm (Grobfassung): UML-Klassendiagramm (Verfeinerung):
Lösung UML-Sequenzdiagramm
Teil 2 Implementierung in Delphi
Wuerfel – augen: integer + create + destroy + werfen + getAugen: integer Klasse als Modul Klassen werden als Module (Programmeinheit) implementiert, die in Delphi in zwei Teilen beschrieben werden: Öffentlicher Teil bestehend aus den Vereinbarungen, die zur Benutzung des Moduls notwendig sind (Schnittstelle).Privater Teil bestehend aus den Implementierungsdetails, die für die Benutzung nicht benötigt werden. unit uWuerfel; interface // Deklaration der // Attribute und Operationen implementation // Implementierung der // Operationen end.
Wuerfel – augen: integer + create + destroy + werfen + getAugen: integer Implementierung der Klassen Von TObject abgeleitet unit uWuerfel; interface type TWuerfel = class(TObject) private augen: integer; public constructor create; destructor destroy;procedure werfen; function getAugen: integer; end; ... Deklaration der Attribute und Operationen
Implementierung der Klassen unit uWuerfel; interface ... implementation constructor TWuerfel.create;begininherited create;augen := 1;randomize;end; destructor TWuerfel.destroy;begininherited destroy;end; ... Implementierung der Konstruktoren / Destruktoren Geerbter Konstruktor wird aufgerufen
Implementierung der Klassen unit uWuerfel; interface ... implementation ... procedure TWuerfel.werfen;beginaugen := random(6)+1;end; function TWuerfel.getAugen: integer;beginresult := augen;end; end. Implementierung der Operationen
Aufgabe Implementieren Sie die Klassen Wuerfel, Konto und Spielzahl. Erstellen Sie zunächst ein neues Projekt in einem hierfür vorgesehenen neuen Ordner. Erstellen Sie für jede Klassen-Unit eine eigene Datei (Datei – Neu – Unit) und geben Sie dieser Datei einen passenden Namen (z. B. uKonto). Übernehmen Sie die Delphi-Konvention, den Klassennamen mit einem „T“ beginnen zu lassen (z. B. „TKonto“).
Benutzungsoberfläche Form1: TForm1 PTitel: TPanel GBWuerfel: TGroupBox RGSpielbrett: TRadioGroup GBKonto: TGroupBox PWuerfelA: TPanel PWuerfelB: TPanel PKonto: TPanel PWuerfelC: TPanel BSpielen: TButton Die Benutzungsoberfläche wird mit Hilfe von sog. GUI-Objekten (Graphical User Interface) aufgebaut.
Ereignisbehandlung (Benutzer)Aktion Programmreaktionen Erzeugung des Formulars Erzeugung der Modellobjekte. Mausklick auf den „Spiel durchführen“-Button Der vom Benutzer eingestellte Tipp am Spielbrett wird übernommen. Das Spiel wird mit diesem Tipp durchgeführt. Die Ergebnisse des Spiels (Würfelergebnisse, neuer Kontostand) werden angezeigt.
Einbindung der Modellklassen unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,uWuerfel, uSpielbrett, uKonto; type TForm1 = class(TForm) ... Bekanntmachen der Klassen
Deklaration der Objekte ... type TForm1 = class(TForm) PTitel: TPanel; RGSpielbrett: TRadioGroup; GBWuerfel: TGroupBox; GBKonto: TGroupBox; PWuerfelA: TPanel; PWuerfelB: TPanel; PWuerfelC: TPanel; PKonto: TPanel; BSpielen: TButton; procedure FormCreate(Sender: TObject); procedure BSpielenClick(Sender: TObject); private { Private-Deklarationen }wuerfelA, wuerfelB, wuerfelC: TWuerfel; spielbrett: TSpielbrett; konto: TKonto; public { Public-Deklarationen } end; Von Delphi deklarierte GUI-Objekte Vom Benutzer deklarierte Modell-Objekte
Erzeugung der Modell-Objekte unit Unit1; interface ... implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject);beginwuerfelA := TWuerfel.create;wuerfelB := TWuerfel.create;wuerfelC := TWuerfel.create;konto := TKonto.create(100);spielbrett := TSpielbrett.create;end; procedure TForm1.BSpielenClick(Sender: TObject);... end. Erzeugung der Modell-Objekte
Implementierung des Spiels procedure TForm1.BSpielenClick(Sender: TObject); var tipp, zahl, richtige: integer; begin// Aktualisierung des Eingabewerts tipp := RGSpielbrett.ItemIndex+1;// Aktualisier. d. Modell-Objekte bzw. Durchführung d. Spielskonto.abheben(1);spielbrett.setzen(tipp);wuerfelA.werfen;wuerfelB.werfen;wuerfelC.werfen;richtige := 0;zahl := spielbrett.getZahl; if zahl = wuerfelA.getAugen then inc(richtige);if zahl = wuerfelB.getAugen then inc(richtige);if zahl = wuerfelC.getAugen then inc(richtige);if richtige > 0 then konto.einzahlen(richtige+1); // Aktualisierung der AnzeigePWuerfelA.Caption := IntToStr(wuerfelA.getAugen);...end; Nachrichtenaustausch zur Erzeugung des Spiels
Implementierung von Nachrichten abheben(1) Form1 konto Senderobjekt-Klasse procedure TForm1.BSpielenClick(Sender: TObject); ... begin... konto.abheben(1); ...end; Empfängerobjekt Operation
Aufgabe Erstellen Sie eine geeignete Benutzungsoberfläche. Ergänzen Sie das Delphi-Programm zur Simulation des ChuckALuck-Spiels. Testen Sie anschließend das fertige Programm.
Teil 3 Beziehungen
Das Spiel als Objekt Das Spiel soll jetzt als eigenständiges Objekt modelliert werden.
Die Klasse zum Spielobjekt Spiel ... ... + durchfuehren(tipp: int.) spiel
Die Operation „durchfuehren“ procedure TSpiel.durchfuehren(tipp: integer); var richtige: integer; zahl: integer; beginkonto.abheben(1);spielbrett.setZahl(tipp);wuerfelA.werfen;wuerfelB.werfen;wuerfelC.werfen;richtige := 0;zahl := spielbrett.getZahl;if zahl = wuerfelA.getAugen then inc(richtige);if zahl = wuerfelB.getAugen then inc(richtige);if zahl = wuerfelC.getAugen then inc(richtige);if richtige > 0 then konto.einzahlen(richtige+1);end; Spiel ... ... + durchfuehren(tipp: int.) spiel
Bekanntschaft zwischen Objekten wuerfelA spielbrett kennt kennt wuerfelB spiel konto kennt kennt wuerfelC kennt Ein Nachrichtenaustausch zwischen Objekten kann nur stattfinden, wenn das sendende Objekt das Empfängerobjekt kennt.
Bekanntschaft durch Referenzen Zeiger (Adresse) 3A80 3A80 Referenzattribute
Bekanntschaft durch Referenzen Spiel - wuerfelA: Wuerfel - wuerfelB: Wuerfel - wuerfelC: Wuerfel - konto: Konto - spielbrett: Spielbrett ... + durchfuehren(tipp: int.) Referenzattribute Mit Referenzattributen kann ein Objekt die Adressen seiner „Bekanntschaften“ speichern.
Erzeugung von Referenzen // Deklaration des Konstruktors constructor TSpiel.create( wA, wB, wC: TWuerfel; k: TKonto; sp: TSpielbrett);beginkonto := k;wuerfelA := wA;wuerfelB := wB;wuerfelC := wC;spielbrett := sp;end; Spiel - wuerfelA: Wuerfel - wuerfelB: Wuerfel - wuerfelC: Wuerfel - konto: Konto - spielbrett: Spielbrett Konstruktor mit Parametern zur Übergabe der Referenzen + create( wA, wB, wC: Wuerfel; k: Konto; sp: Spielbrett) + durchfuehren(tipp: int.) // Aufruf des Konstruktors konto := Tkonto.create(100);... spiel := TSpiel.create( wuerfelA, wuerfelB, wuerfelC, konto, spielbrett); Die Referenzbildung erfolgt bei der Erzeugung des Spiel-Objekts.