OSZ Handel I
Informatik
S. Spolwig
[Home | Gymn. Oberstufe | Informatik | Unterrichtsmaterialien | Delphi ]
Die allgemeine Beschreibung finden Sie unter MVC-Konzept. Den kompletten Quellcode unter den Links im Text, weitere Programmbeispiele unter Modellierung mit UML und downloads.
Alle Rahmenplanentwickler, die etwas auf sich halten, haben in den letzten Jahren die Behandlung des MVC-Konzepts in die Unterrichtspläne geschrieben. Was auch immer unter Behandlung verstanden wird, für unsere Schule hieß das schon immer, alle Programme (also auch die sogenannten kleinen) werden unter diesem Design entwickelt und geschrieben. Das bedeutet, daß die Implementierung der Einfachheit des Konzepts (Trenne Daten und ihre Repräsentation!) zu folgen hat und der Programmieraufwand niedrig gehalten werden muß.
Genauso einfach ist scheinbar die Programmieraufgabe: benötigt werden Mechanismen, die die Daten zwischen GUI und Model hin- und hertransportieren, wenn entsprechende Ereignisse aufgetreten sind. Dazu kommen in Frage:
Ein Programm berechnet den B.M.I.-Faktor einer Person. Es hat eine Fachklasse TPerson und die GUI-Klasse TFensterFrm.
Der Button
updateModel schickt die Daten ans Model
updateView holt die Daten und aktualisiert den View
Abnehmen reduziert den Wert von Gewicht.
Bild 1
Die Fachklasse TPerson hat nur die notwendigen Set- und Get-Methoden.
TPerson = class(TObject)Die GUI-Klasse übernimmt Control- und Viewaufgaben.
unit uFenster;
INTERFACE
// ======================================================================
uses
...
uPerson;
TFensterFrm = class(TForm)
GroesseLbl: TLabel;
...
procedure updModelBtnClick (Sender: TObject);
procedure updViewBtnClick(Sender: TObject);
procedure AbnehmBtnClick(Sender: TObject);
private
Person : TPerson; // --- Model PERSON
procedure Init;
procedure DatenAktualisieren; // -- hier der Datentransport
procedure MaskeAktualisieren;
end;
IMPLEMENTATION
// ======================================================================
....
Procedure TFensterFrm.DatenAktualisieren;
// ----------------------------------------------------------------------
// Eingaben aus den Editfeldern an das Model-Objekt übergeben
begin
Person.SetName (NameEdt.Text);
Person.SetGroesse (StrToFloat (GroesseEdt.Text));
Person.SetGewicht (StrToFloat (GewichtEdt.Text));
end;
procedure TFensterFrm.updModelBtnClick(Sender: TObject);
// ----------------------------------------------------------------------
// Ereignis starten
begin
DatenAktualisieren;
Init; // Eingaben im Fenster löschen
end;
procedure TFensterFrm.MaskeAktualisieren;
// ----------------------------------------------------------------------
// Objektdaten an die View-Komponenten übergeben
begin
NameEdt.Text := Person.GetName;
GroesseEdt.Text := FloatToStr (Person.GetGroesse);
GewichtEdt.Text := FloatToStr (Person.GetGewicht);
BmiEdt.Text := FloatToStr (Person.HatBMI);
end;
procedure TFensterFrm.updViewBtnClick(Sender: TObject);
// ----------------------------------------------------------------------
// Ereignis starten
begin
MaskeAktualisieren
end;
...
1.2 Manuelles Polling (halbautomatisch) über GUI-Komponenten
Bild 2
2. Observer Pattern Design
Bild 3 - [Klicken Sie für den Quelltext auf die Klasse]
Reichlich Aufwand, um eine Klasse Person zu observieren ...
Durch die Auslagerung von Observer-Code in die Oberklasse bleibt dann aber nur der RunObservers-Aufruf in den Set-Methoden.
procedure TPerson.SetName (n : string);
//----------------------------------------------
begin
fName := n;
fObserverMgr.RunObservers; // Message absenden
end;
und im GUI
procedure TFensterFrm.FormShow(Sender: TObject);
// ---------------------------------------------
begin
Person := TPerson.Create;
Person.AddObserver(MaskeAktualisieren,self);
end;
Bild 4
Dem GUI ist ein zweiter View hinzugefügt, der vom Observer mit bedient wird.
Bild 5
In der GUI-Klasse sorgt die Methode Person.OnChanged in FormCreate dafür, daß bei jedem Event die GUI-Methode MaskeAktualisieren ausgeführt wird.
Leider kann das in bestimmten Fällen zu Problemen führen. Editfelder, die sich gut für kombinierte Ein- und Ausgabe eignen, dürfen nicht für die Ausgabe von Rechenoperationen angesprochen werden; es sind also andere GUI-Komponenten dafür erforderlich. Die korrekte Initialisierung von Gewicht und Groesse
mit 0 führt zu einer Exception wegen der unerlaubten Division durch Null bei Errechnung des BMI.
Reine Textfelder sind unproblematisch.
Bewertung
1. Polling
Manuelles Polling (1.1. und 1.2) haben sich seit 10 Jahren im Unterricht bewährt und sind unaufwendig. An unserer Schule werden alle Programme, beginnend im Anfangsunterricht mit einer Fachklasse bis zu großen Projekten, in dieser Weise von den Schülern bearbeitet. Die Datenklassen sind frei von jeder technischen Erweiterung. Das erlaubt eine sehr einfache und klare OOA und Implementierung.
2. Observer Pattern Design
Viel Technik, wenig Erkenntnisgewinn (s.o.). Der Programmieraufwand pro observiertem Objekt ist so umfangreich, daß er sich für den Unterricht verbietet, wenn Schüler den kompletten Observer-Code schreiben sollten, zumal das durchaus nicht trivial ist. Eine Möglichkeit wäre, das ganze Paket als Bibliothek abzulegen.
Bei dieser als auch der dritten Variante bleiben Fachklassen nicht von proprietärem Code frei, der sie mit dem Betriebssystem verknüpft, was einer Portierung im Wege steht. Der schöne Anspruch, das in Fachklassen auch nur Anwendungsdaten und Anwendungslogik enthalten sein sollen, ist dahin.
3. Selbstgeschriebene Ereignisroutinen
Die selbstgeschriebene Ereignissteuerung ist eher eine Bastlerlösung. TNotifyChange ist ein Prozedurtyp, ein ebenso mächtiges wie undurchsichtiges Konstrukt. Onchange eine Prozedurvariable, also gleichermaßen Attribut und Prozedur und damit proprietär belastet. Die o. g. Restriktionen und Fehler lassen Zweifel an einen routinemäßigen Einsatz im Unterricht aufkommen.
-------------------
Literatur u. Links
Hilfehandbuch Delphi 7
Amrhein, B.: Designpattern für Graphische Benutzeroberflächen
http://www.hta-be.bfh.ch/~amrhein/Skripten/Swing/Pattern.pdf
Höstklint, C.: Simple Observer Pattern
http://www.delphi3000.com/member.asp?ID=9713
Paulus, H.: Das MVC-Konzept. (Schöne Präsentation)
http://informatikag.bildung-rp.de/assets/download/D1-Paulus-Farben.pps
© 15. Oktober 2004 Siegfried Spolwig
本文地址:http://com.8s8s.com/it/it4699.htm