440 likes | 815 Views
Das MVC- Konzept (Model-View-Controller) Realisierung mit Delphi. Helmut Paulus MPG Trier. Speyer, 16.05.07. Überblick. Grundlagen der OOP MVC-Architektur Implementierung des Farbenmischers. Motivation. Problematik der Softwareentwicklung Komplexität nimmt zu
E N D
Das MVC- Konzept (Model-View-Controller) Realisierung mit Delphi Helmut Paulus MPG Trier Speyer, 16.05.07
Überblick • Grundlagen der OOP • MVC-Architektur • Implementierung des Farbenmischers
Motivation Problematik der Softwareentwicklung • Komplexität nimmt zu • Pflege immer aufwändiger • Lösungen: • Objektorientierte Programmierung • Entwurfsmuster für graphisch Benutzungsoberflächen • MVC: Modell-Ansicht-Steuerung
Teil 1 GrundlagenObjektorientierte Programmierung
Beispiel: Farbe RGB-Farbmodell Farbe rot = 23 gruen = 244 blau = 22 Objektorientierte Programmierung Objekte im Sinne der Informatik Dinge der Welt
setFarbe getFarbe toHTML ... • Auftrag - Prozedur • Anfrage - Funktion Methoden Die Methoden bestimmen das Verhalten des Objekts. Objekte Ein Objekt ist das Abbild eines realen oder gedachten Gegenstandes bzw. einer Person. Farbe Attributwert Attribut rot = 23 gruen = 25 blau = 255 Ein Objekt wird durch die Werte seiner Attribute festgelegt. Objekte sind autonomeBausteine, die bestimmte Teilaufgaben der Anwendung eigenständig erledigen.
Farbe1 Farbe2 TFarbe Farbe3 rot rot = 23 rot = 123 rot = 233 setFarbe setFarbe setFarbe setFarbe Klassen und Objekte Klasse ist Instanz von Objekte Klassen sind Baupläne von Objekten Objekte sind Instanzen (Exemplare) von Klassen.
Geheimnisprinzip Auf die Eigenschaftswerte wird nicht direkt sondern nur über besondere Lese- und Schreibmethoden zugegriffen. TFarbe Die innere Struktur wird verborgen. - Frot : integer - Fgruen :integer - Fblau : integer + getRot : integer; + setRot(r : integer); Zugriffsmethoden Bei Delphi gibt es einen speziellen property- Mechanismus, über den durch Zuweisung auf die Eigenschaftswerte zugegriffen werden kann.
TFarbe - Frot : integer - Fgruen :integer - Fblau : integer + constructor create + getRot : integer; + setRot(r : integer); Erzeugung von Objekten Objekte werden mit Konstruktoren erzeugt. Konstruktor • Konstruktoren sind spezielle Methoden, die • den Speicherbereich eines Objekts anlegen, • die Attribute mit Standardwerten belegen, • eine Referenz auf das Objekt zurückgeben.
Deklaration der Objektvariablen nil Farbe1 = Das Objekt existiert noch nicht ! :TFarbe Farbe1 = Frot = 255 Fgruen = 255 Fblau = 255 Die Objektvariable erhält eine Referenz auf das Farbobjekt. Erzeugung eines Farbobjekts var Farbe1 : TFarbe; ... ... Farbe1 := TFarbe.create; Aufruf des Konstruktors (Der Klassenname wird vorangestellt) Klassenname
Beispiel: Farbe1.setFarbe(0,0,0) Das Formularobjekt ruft eine Methode des Farbobjekts auf. Kennt- Beziehung / Assoziation Ein Objekt kann eine Methode eines anderen Objekts nur aufrufen, wenn es dieses kennt, d. h. eine Referenzauf dieses Objekt besitzt. Das Formularobjektkennt1 Farbobjekt und 2 Shape-Objekte. 1 FarbForm Farbe 2 Shape Arbeiten mit Objekten Der Zugriff auf Objekte erfolgt mit Hilfe der Objektvariablen Schema: Objektvariable.Methode
Teil 2 MVC-Architektur
Steuerung Modell Farbe rot = 23 gruen = 25 blau = 255 Ansicht MVC-Farbenmischer
ModellModellklasse: Interne Repräsentation der Daten mit Methoden zum Ändern und Abfragen ViewAnsicht, Darstellung: Ein Modell kann durch mehrere Views angezeigt werden, welche unterschiedliche Sichtweisen des Models darstellen. Controller Steuerung: Verarbeitung der Benutzereingaben MVC-Prinzip Ziel:Trennungvon Datenhaltung und -verarbeitung, Darstellung und Steuerung. Die Anwendung wird in drei Bereiche aufgeteilt: • View und Controller bilden zusammen die Benutzeroberfläche (GUI).
schreibt liest Fachkonzept GUI (graphical user interface) MVC-Architektur Controller Steuerung Model (Daten,Verarbeitung) View Ansicht informiert
Bedingungen • Die interne Datenverarbeitung ist von der Benutzeroberfläche (GUI) gänzlich abgekoppelt. • Das Modell kennt weder View noch Controller.Das bedeutet: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 dem MODEL-Objekt werden Verbindungen hergestellt, um einen Datenaustausch zu ermöglichen.
Vorteile der MVC-Struktur • Ä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.
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 ModellkeinenZugriff auf sie hat?Wie erfahren die Views, dass sich die Daten des Modells geändert haben?
Realisierung in Delphi • Entkopplung: • GUI- und Modellklassen inverschiedenen Units halten • View und Controller in einem Formular (uGUI.pas) unterbringen • Modell-Klasse in einer eigenen Unit (uModell.pas) speichern Datenzugriff: • Die GUI-Klasse erhält eine Referenz auf das Modell-Objekt.Der Datenzugriff erfolgt mit Lese- und Schreibmethoden, die das Modell zur Verfügung stellt (z. B. setAttribut() bzw. getAttribut(), Zugriff über Properties). • 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)
Teil 3 Implementierung des Farbmischers (1.Variante: Abfragen)
Implementierung: (Unit: uFarbModell.pas) unit uFarbModell ... type TFarbe = Class private Frot, Fblau, Fgruen : integer; public constructor create;procedure setFarbe(r, g, b : integer); function getFarbe : integer functiongetrot : integer functiongetgruen: integer functiongetblau : integer end; TFarbe - Frot : integer - Fgruen :integer - Fblau : integer; + constructor create + getFarbe : integer; + setFarbe(r, g, b : integer) + getrot : integer + getgruen: integer + getblau : integer Spezifikation/Implementierung der Modell-Klasse • Festlegung von: • Zugriffsrechten (- private; + public) • Datentypen • Signaturen (Parameter der Methoden)
Implementation der Methoden constructor TFarbe.create; begin Frot := 255; Fgruen:= 255; Fblau := 255; end; function TFarbe.getFarbe : Integer; begin result := Fblau*256*256+FGruen*256+Frot; end; procedureTFarbe.setFarbe(r,g, b : integer); begin Frot := r mod 256; Fgruen := g mod 256; Fblau := b mod 256; end; (Listing uFarbModell)
Benutzeroberfläche GUI (Formular-Unit): GUI-Objekte: TLabel TEdit TButton TShape TButton
Objektverwaltung Das Formular verwaltet die GUI-Objekte und das Modellobjekt. Uses ..., uFarbModell; TFarbForm = class(TForm) Farbmischer: TGroupBox; Label1: TLabel; rotEd: TEdit; okBtn: TButton; Ansicht: TGroupBox; Label7: TLabel; endBtn: TButton; FarbBox: TShape; ... private { Private-Deklarationen } Farbe : TFarbe; ... Modell-unit-einbinden kennt Zeiger auf ein Farbobjekt Referenzattribute
Erzeugung mit dem OnCreate-Ereignis procedure TFarbForm.FormCreate(...); begin Farbe := TFarbe.create; ... end; Zeiger auf ein Farbobjekt (kennt-Beziehung) Zerstörung mit dem OnDestroy-Ereignis procedureTFarbForm.FormDestroy(...); begin Farbe.Free; end; Speicherbereichfreigeben Objekterzeugung/-zerstörung Die GUI-Objekte, die zur Entwurfzeit ins Formular eingefügt wurden, werden automatisch erzeugt und zerstört. Das Farbobjekt muss zur Laufzeit erzeugt und zerstört werden.
Ereignisgesteuerter Ablauf Szenario: Der Ok_Button (‚übernehmen‘) wird gedrückt: • Aktionen: • Werte der Eingabefenster lesen. • Farbobjekt aktivieren (Farbe.setFarbe(r,g,b)); • Shapes aktualisieren sich (updateViews) Wer macht was?
Aktualisierung der Views Ereignisprozedur //Datenfluss: Controller Modell procedureTFarbForm.okBtnClick(Sender: TObject); //Modelldaten schreiben var r, g, b : integer; begin r := strtoint(rotEd.text); g := strtoint(gruenEd.text); b := strtoint(blauEd.text); Farbe.setFarbe(r,g,b); //Werte speichern updateViews; //Aktualisierung durch Abfragen end; //Datenfluss: Modell View procedureTFarbForm.updateViews; //Modelldaten lesen begin FarbBox.brush.color := Farbe.getFarbe; KFarbBox.brush.color := clwhite - Farbe.getFarbe; end; Listing uFarbForm
Aufgaben I • Testen Sie das Programm ‚Farben0’ und verfolgen Sie den Ablauf mit Hilfe des Einzelschritt-Modus. • Erweitern Sie das Farbemodell um folgende Methoden • TFarbe.getKomplement (Komplementärfarbe) • TFarbe.toHTML (HTML- Code) Bsp.: #AFB055, verwenden Sie die Funktion InttoHex() • Binden Sie beide Methoden in die Anwendung ein. • Entwickeln Sie eine zweite Benutzungsoberfläche, die die RGB-Farben einzeln anzeigt. (z. B.: in drei Shape-Komponenten) Binden Sie das Farbmodell an die entwickelte Benutzeroberfläche an.
Teil 4 Implementierung des Farbmischers (2.Variante: Selbstdefiniertes Ereignis)
Sender Empfänger Button Formular OnClick ButtonClick() Methodenzeiger Ereignisse Ereignis: Zustandsänderung eines Objekts, die mit einer Ereignisprozedur verknüpft ist. Realisierung in Delphi mit Hilfe von Methodenzeigern: Referenzen auf Methoden anderer Objekte Mit dem Aufruf von OnClick wird die Formularmethode ButtonClick() aktiviert.Die Verarbeitung wird an andere Objekte delegiert.
Button.Onclick := Buttonclick; Methodenname Methodenzeiger-Mechanismus Die GUI-Komponenten von Delphi verfügen über eine Vielzahl von Methodenzeigern die mit Ereignissen verknüpft werden können. Beispiel: Onclick Der OnClick-Zeiger hat, wenn er nicht gesetzt ist, den Wert nil. Die Zuweisung einer Methode erfolgt entweder im Objektinspektor oder durch eine Zuweisung zur Laufzeit (z.B. in FormCreate): Methodenzeiger haben wie - andere Variablen auch - einen Datentyp. Dieser bestimmt, mit welchen TypenvonMethoden der Zeiger verknüpft werden kann.
Variablendeklaration: Var Onclick : TNotifyEvent; Ereignis : TMyEreignis; Deklaration von Methodenzeigertypen Beispiele: type TNotifyEvent = procedure(Sender : TObject) of Object; Standardtyp (von Delphi vordefiniert) Methoden mit einem Parameter vom Typ TObject z. B. Onclick- Ereignis TMyEreignis = procedure of Object; // Methoden ohne Parameter
Die Implementation erfordert in vier Schritten: Vereinbarung eines Methodenzeiger-Typs Vereinbarung eines Methodenzeigers Aufruf der Ereignisprozedur über den Methodenzeiger Zuweisung einer Ereignisprozedur Ein Ereignis für das Farbobjekt Das Farbobjekt soll die Views über Datenänderungeninformieren.Dazu wird ein Ereignis implementiert, das bei Datenänderung ausgelöst wird, also in der setFarbe-Methode. Dazu braucht das Modell einen Methodenzeiger, der mit der updateViews- Methode des Formulars verknüpft werden kann. Die Schritte (1) – (3) erfolgen in der Modell-Unit, Schritt (4) in der Formular-Unit.
Implementation des Ereignisses Ereignis: OnChanged vom Typ TChangeEvent type TChangeEvent = procedure of object;(1.) TFarbe = Class .... public ... OnChanged : TChangeEvent;(2.) end; • Deklaration eines Methodenzeigertyps(hier: für eine Prozedur ohne Parameter) • Deklaration einer Referenzvariablen vom Typ des Methodenzeigers
Auslösen des Ereignisses Modell: procedure TFarbe.setFarbe(r,g, b : integer); begin Frot := r mod 256; Fgruen := g mod 256; Fblau := b mod 256; //GUI informieren if assigned(OnChanged) then OnChanged;(3) end; 3. Ereignis auslösen DasModellruft eine Methode des GUI-Objekts auf, wenn sich seineDaten ändern.
Implementierung: procedure TFarbForm.updateViews; begin //wird vom Modell aufgerufen FarbBox.brush.color := Farbe.getFarbe; ... end; Ereignisbearbeitungsmethode type TFarbForm = class(TForm) ... private Farbe : TFarbe; procedure updateViews; public ... end; Ereignismethodevom Typ des Methodenzeigers
Setzen des Methodenzeigers 4. Setzen des Methodenzeigers mit OnCreate-Ereignis procedure TFarbForm.FormCreate(Sender: TObject); begin Farbe := TFarbe.create; Farbe.OnChanged := updateViews;(4) end; Der Typder Methode muss mit dem Typ des Methodenzeigers übereinstimmen.
Nachrichtenaustausch :TFarbForm :TFarbe ... :TButton :TShape Start des Programms Oncreate() create() Button wird gedrückt ButtonClick() setFarbe() updateViews getFarbe() Brush.Color := ... Ablauf: OkButton wird geklickt(Sequenzdiagramm)
Aufgaben II • Farbenmischer • Implementieren Sie das Ereignis ‚Onchanged’.Testen Sie das Programm und verfolgen Sie den Ablauf mit Hilfe des Einzelschritt-Modus. • Die Version Farben3 kann 2 GUIs gleichzeitig darstellen. Untersuchen Sie, wie das 2. Formular eingebunden ist und den Benachrichtungsmechanismus. • MVC-Uhr • Entwerfen Sie das Modell (Klasse: TUhr - mTUhr.pas) einer Digitaluhr, die Uhr soll noch nicht selbständig laufen. Entwerfen Sie ein Formular (GUI) (TUhrform - uUhrForm.pas) mit der Möglichkeit, die Zeit (h:min) zu setzen und abzufragen. • Die Zeit soll mit Hilfe Schaltfläche jeweils um eine Sekunde erhöht werden. Entwickeln Sie dazu eine Methode. • Analysieren Sie das Projekt ‚Uhr mit Ereignis’. Erweitern Sie das Uhrobjekt so, dass die Ansicht über Datenänderungen mit Hilfe eines Ereignisses informiert wird.
Literatur und Links • Helmut Balzert: Lehrbuch der Software-Technik • Siegfried Spolwig:www.oszhdl.be.schule.de\gymnasium\faecher\informatik\index.htm • K. Merkert: Hohenstaufen-Gymnasium Kaiserlautern http://hsg.region-kaiserslautern.de/faecher/inf/index.php UML-Werkzeug: • UML-Editor : UMLed.exe http://www.kubitz-online.de