OSZ Handel I
Informatik

Didaktik / Methodik
Modellierung

S. Spolwig

[Home | Wirtschaftsgymnasium | Informatik]


Page down

"Von Stiften und Mäusen" oder Was heißt objektorientierte Modellierung?

- Eine kritische Betrachtung -
von
Siegfried Spolwig

Stifte und Mäuse wurde als Konzept zur Einführung in die objektorientierte Programmierung entwickelt. Strukturelle Restriktionen und die Art des Einsatzes lassen erhebliche Zweifel aufkommen, ob es noch für einen zeitgemäßen Einführungsunterricht brauchbar ist.

1.  Einleitung

Das Unterrichtskonzept "Von Stiften und Mäusen" (SuM) [vgl.1] erschien vor ca. 10 Jahren. Die Autoren haben sich ein großes Verdienst um die Einführung der Objektorientierung in den Informatikunterricht erworben und es gebührt Ihnen die Ehre, unter den ersten gewesen zu sein, die ein schülergerechtes objektorientiertes Unterrichtskonzept entwickelt haben, das sich bis heute einer erstaunlichen Lebendigkeit und zunehmender Verbreitung erfreut. Es wird inzwischen in Rahmenlehrplänen genannt, von Bildungsservern empfohlen, in vielen Schulen und Lehrerfortbildungen eingesetzt.

Mittlerweile ist SuM nahezu in alle schulrelevanten Sprache portiert, zuletzt nach Delphi und Python. Es muss also gut sein, obwohl der Ansatz schon ein wenig angejahrt erscheint und es heute eine Reihe von didaktisch reduzierten Tools (z. B. BlueJ, Fujaba & Mr. Dobs, UMLed/Delphi) gibt, die dem Stand der Technik entsprechen.

Erstaunlicherweise findet man praktisch nirgends ein Wort der Kritik. Das zumindest erscheint verdächtig. Es stellt sich die Frage, ob SuM immer noch geeignet ist, die Ziele eines zeitgemäßen Informatikunterrichts, der Modellierung und geeignete Modellierungstechniken in den Mittelpunkt stellt, zu erreichen.

SuM war zunächst für den Anfangsunterricht entwickelt worden; fleißige Programmierer haben inzwischen Programme und Klassen vorgestellt, die dieses Niveau weit hinter sich lassen und damit den Anspruch demonstrieren, mit SuM könne man viel mehr machen. Hier wird soll der 'SuM-Kern' und seine Eignung für den Einführungsunterricht in die objektorientierten Programmierung untersucht werden.

2.  Das informatische Konzept

Der Kern von SuM ist eine sprachenunabhängige Klassenbibliothek (Bildschirm, Maus, Tastatur, Stift, Anwendung), die einen PC beschreibt [2]. Die Dokumentation verbirgt die Attribute der Objekte und stellt sich wie ein abstrakter Datentyp dar, der nur Funktionen anbietet. Die Klassen sind erweiterbar. Mit diesem Angebot lassen sich nur Aufgaben bestimmter Problemklassen lösen (Persistenz z. B. ist nicht vorgesehen). Des Weiteren ist impliziert, dass sich die erzeugten Objekte selbst auf dem Bildschirm darstellen (i. d. R. mit einem Attribut Stift gezeichnet werden).
Diese Entwurfsentscheidung hat zur Folge, dass neuere Konzepte, die die Trennung von Daten und ihrer Repräsentation vorsehen (z. B. MVC), nicht möglich sind.

Modellierung ist seit einiger Zeit das neue Zauberwort der Informatik-Didaktik. Professorale Arbeiten und kluge Dissertationen haben es eben auch nicht eben leichter und klarer für den amtierenden Lehrer gemacht. Die objektorientierte Programmierung ist angetreten mit dem Anspruch und Versprechen, Objekte und Ausschnitte der Realwelt so abzubilden wie sie sind. Jedes Analyseobjekt hat seine Entsprechung in der natürlichen realen Welt und übernimmt dessen Identität im Modell. Meyer, einer der Väter der Objektorientierung, hat es so formuliert:

"Deshalb verbringen objektorientierte Entwerfer normalerweise ihre Zeit nicht mit akademischen Diskussionen darüber, wie Objekte zu finden sind: In der physikalischen und abstrakten Wirklichkeit sind die Objekte modelliert und warten nur darauf, aufgelesen zu werden." [3]

Diesem Anspruch genügt SuM in der jetzt vorliegenden Entwicklung und einer verbreiteten Praxis nicht.
 

3.  Didaktische Analyse

Das Konzept folgt zunächst richtigen Überlegungen.

"Die Bereitstellung einer sehr kleinen, aber dennoch schon recht leistungsfähigen Bibliothek fertiger Klassen, ist ein wesentliches Prinzip des hier vorgestellten didaktischen Konzepts. Und auch deren Überschaubarkeit ist für den Anfangsunterricht äußerst wichtig.
Einerseits wird dadurch die Verwendung fertiger Bausteine auf der Grundlage einer Dokumentation geübt, andererseits wird frühzeitig die eigene Erweiterung einer bestehenden Klassenbibliothek angeregt." [4]
 

3.1  SuM als Turtle

Die Unterrichtssequenz SuM beginnt mit dem übenden Gebrauch von gegebenen Objekten. Ein typisches erstes Programm (Klasse) zeigt ein "Haus vom Nikolaus" [5] :

public class Nikolaus1

/* verwendete Objekte */
private Bildschirm meinBildschirm;
private Stift meinStift;

public void fuehreAus()
{
/* Aufbau der Objekte */

  meinBildschirm=new Bildschirm();
  meinStift=new Stift();

/* Nachrichtenteil */
  meinStift.bewegeBis(100,100);
  meinStift.runter();
  meinStift.bewegeBis(140,100);
  meinStift.bewegeBis(100,60);
  meinStift.dreheBis(60);
  meinStift.bewegeUm(40);
  meinStift.dreheUm(-120);
  meinStift.bewegeUm(40);
  meinStift.bewegeBis(100,60);
  meinStift.bewegeBis(100,100);
  meinStift.bewegeBis(140,60);
  meinStift.bewegeBis(140,100);

/* Abbau der Objekte */
  meinStift.gibFrei();
  //meinBildschirm.gibFrei();
}
}

Bereits hier sieht man, dass es sich nicht um die Abbildung eines Objekts ‚Haus’ handelt, sondern um eine Strichzeichnung, die der Stift auf den Bildschirm schreibt, quasi ein anweisungsgesteuertes Malprogramm. Es werden zwar die Objekte Bildschirm und Stift benutzt, jedoch hat das Produkt abgesehen von der OO-Notation mit Objektorientierung noch nicht viel zu tun. Das ging mit LOGO und Turtle im Prinzip genauso. Diese und ähnliche Beispiele können gut zum Lernen von Sequenzen und Kontrollstrukturen dienen. Ein weiterer positiver Aspekt ist die Visualisierung der Ergebnisse, die dem Schüler die unmittelbare Überprüfbarkeit seiner Arbeit gewährleistet.

3.2  Entwicklung und Erweiterung eigener Klassen

Das Konzept sieht aus nahe liegenden Gründen Entwicklung und Erweiterung eigener Klassen vor:

"Die zwar griffige Bezeichnung »Stifte und Mäuse« für die hier vorgestellte Konzeption wird bei oberflächlicher Betrachtung häufig missverstanden. So gibt es immer wieder Betrachter, die glauben mit diesem Konzept gehe die Reduktion auf eine Verwendung der vier Basisklassen einher.
Das ist falsch!
Vielmehr gehört die Erweiterung zu einer kurseigenen Klassenbibliothek wesentlich zum didaktischen Konzept." [4].

Leider beginnt hier die Krux. Der Zwang, wegen der Darstellung und eventuell anderer Manipulationen auf die Kern-Klassen zurückzugreifen, schafft Objekte und Klassen von eigenartiger Konsistenz. Einige Beispiele mögen das verdeutlichen.

Beispiel 1: Billardkugel

Es soll eine Billardkugel auf dem Bildschirm simuliert werden, die an der Bande zurückprallt.
 

Die OOA ergibt:



Die Attribute Radius und Farbe sind klar,
Xpos und Ypos speichern die Lage,





SetLink stellt eine Verknüpfung mit dem Tisch her,
um den Kontakt mit der Bande zu prüfen,
Bewegen soll den Lauf der Kugel auf dem Tisch darstellen.


In einer konsequent objektorientierten Umsetzung würde man unter SuM eine Klasse mit diesen Attributen und ähnlichen Methoden erwarten. Weit gefehlt!

In der SuM-Implementierung findet man

unit mKugel;
interface
uses mSuM;

type Kugel = class
       hatStift: Stift;            // die Kugel hat einen Stift, um sich zu zeichnen
       kenntBildschirm: Bildschirm;//die Kugel kennt einen  Bildschirm als Begrenzung
                                  
       zRadius : GanzeZahl;
       constructor init(pAnfangH, pAnfangV: GanzeZahl; pGeschwindigkeit: Zahl;
                                                                   pRichtung: Zahl);
       procedure   Zeichne;
       procedure   Loesche;
       procedure   Bewege;
       function    hPosition: Zahl;
       function    vPosition: Zahl;
       function    Richtung: Zahl;
       procedure   setzeRichtung(pWinkel: Zahl);
       procedure   merke(pBildschirm: Bildschirm);
       destructor  gibFrei;
     end; 
     ... [6]

Eine Billardkugel hat in der Realität natürlich keine Eigenschaften Stift und Bildschirm. Aus der Klassendeklaration geht auch nicht hervor, auf welche Attribute die Funktionen hPosition, vPosition und  Richtung zugreifen.
Das ist einfach schlecht modelliert und implementiert.

Ein ähnlicher Entwurf [6a] aggregiert ebenfalls einen Buntstift und Bildschirm als Attribute:

Kugel

Beispiel 2: Ampel

Über Ampeln lässt sich trefflich streiten, denn Abstraktion ist immer  ein zielgerichteter Prozeß unter dem Blickwinkel auf einen bestimmten Zweck. Deshalb gibt es auch Ampelprogramme wie Sand am Meer. Ein Elektroniker, der eine Steuerung entwickelt, würde vermutlich eine Ampel als abstrakte Einheit sehen, deren Merkmale lediglich Zustände sind und zu einer Fachklasse kommen, die keinerlei Bezüge zur physischen Realisation  enthält. Hier soll es jedoch nur um die Art Ampeln gehen, die gern im Anfangsunterricht programmiert werden und auf dem Bildschirm zu sehen sind, aber auch richtig funktionieren.

Es ist allgemein bekannt, wie eine Ampel aussieht und im Prinzip aufgebaut ist: ein dunkelgrauer Kasten mit drei Lampen drin, die abwechselnd an und ausgehen.

Die OOA ergibt:

Ampel

In der Ampel ist der Typ TLampe aufgeführt, um zu verdeutlichen, dass es sich um diskrete Komponentenattribute handelt.

Das lässt sich mit geeigneten Mitteln und diesen verständlichen Bezeichnern leicht realisieren, wohl nicht unter SuM.

Zum Vergleich ein SuM-Klassendiagramm (aus dem nebenstehenden Quelltext gezeichnet):

Sum-Ampel

unit mAmpel;
interface
uses mSuM,extctrls;

  type ampel = class
   private
    aktuellefarbe : integer;
    meinStift : BuntStift;
    x,y : zahl;
    dieTastatur : Tastatur;
    procedure zeichneDich;
   public
    constructor init(px,py : zahl);
    destructor gibfrei;
    procedure schalteUm;

    function farbe:integer;
    function links : zahl;
    function rechts : zahl;
    function oben : zahl;
    function unten : zahl;

end;
...  [7]

Spätestens hier wird das Dilemma mit SuM in voller Schärfe sichtbar: Eine ordentliche Modellierung scheint nicht möglich, weil das Ausgangskonzeptes offensichtlich zu solchen Lösungen auffordert und die Sicht auf andere verstellt. Diese Ampel hat anstelle von drei Lampen, die man ein- und ausschalten kann, also als Objekte ansprechen kann, eine Tastatur und einen Buntstift, der etwas auf den Bildschirm malt.

Dieses Beispiel ist nicht etwa ein ausgesucht schlechtes, sondern es steht exemplarisch für den Charakter der SuM-Objekte, wie sie in den Schulen gebaut werden. In der zunächst kleinen Welt von SuM findet man Autos, Züge, die über den Bildschirm fahren. Das ist alles ordentlich programmiert, aber es ist eine blasse Welt von Häusern ohne Dach und Fenster, Mäusen ohne Schwanz und Ohren, Lokomotiven ohne Räder, Kessel und Schornstein usw.
In dem verbreiteten Zug-Projekt werden von einer Oberklasse Waggon (mit der SuM-typischen Struktur) die Unterklassen Lok, Güterwagen usw. abgeleitet. Wenn in den Unterklassen lediglich nur eine Methode auftaucht, die per Stift ein anderes Bild fertigt, aber ansonsten keine Merkmale von Vererbung zeigt, darf man sich schon fragen, was hier eigentlich modelliert wird. Sicher nicht Anwendungsaspekte und Ausschnitte der Realwelt.

SuM bewirkt auf dieser Ebene durch die Restriktionen, dass jedes Objekt prinzipiell Attribute aus der Kern-Bibliothek haben muss, ein eigenartiges Abbild der gefundenen Objekte. Überspitz könnte man auch sagen, wer als einziges Werkzeug einen Stift hat, für den besteht die ganze Welt aus Strichen. Damit wird die Forderung nach sauberer Modellierung konterkariert und den Schülern vom ersten Tage an ein falsches Bild von den Entwurfsaufgaben der Informatik und den Möglichkeiten der OOP vermittelt.

Es steht heute nichts mehr dem im Wege, auch in der Schule ein objektorientiertes Konzept aus einem  Guss in den Unterricht zu bringen. Das heißt, eine saubere OOA, die notwendigen softwaretechnischen Erweiterungen in OOD durch Hinzufügen erforderlicher Objekte und Klassen und am Ende zur Realisierung eine objektorientierte Sprache, die es erlaubt, das gefundene Modell 1:1 auszudrücken.

Zusammengefasst kann man feststellen dass das SuM-Konzept zwar alle wichtigen Merkmale von OOP darstellen, aber lediglich die objektorientierte Programmiertechnik aufzeigen kann, jedoch OOA und OOD im Anfangsunterricht nicht richtig unterstützt und so nicht empfohlen werden kann.

Es sollte nicht die prägende Kraft des ersten Eindrucks bei Schülern und Lehrern unterschätzt werden. Daher scheint es bedenklich, wenn ganzen Generationen von Lehrern SuM als erster Kontakt zu OOP in dieser Weise beigebracht wird. Otto Normallehrer wird mit hoher Wahrscheinlichkeit es nicht als Anstoß verstehen, andere Konzepte zu erarbeiten, sondern dabei bleiben, zumal es ja so schöne Vorlagen und Materialien gibt. Die Zählebigkeit von SuM und das daraus entstandene Eigenleben scheinen diese Vermutung zu bestätigen. Es dient eben inzwischen nicht mehr nur dem Einführungsunterricht, sondern als Basis-Tool für fast alles, was man so in der Schule programmieren kann. Die Liste der SuM-Derivate für die Klassenstufen 11-13 reicht von 'Abzählreim' bis 'Zahlsuche-Backtracking'. [8]
 

4.  uGrafik - eine Alternative

Viele Betriebssysteme und Programmierumgebungen bieten eine Grafikebene (meist Canvas genannt) an, die Methoden zum Zeichnen von Linien, Rechtecken usw. hat. Um die oben geschilderten Probleme zu umgehen und durchgängig objektorientiert zu arbeiten, wurde am OSZ Handel, Berlin, einer Anregung Monika Seifferts folgend, eine Grafikbibliothek entwickelt, die entsprechende Klassen enthält[9].

uGrafik

Es liegen Portierungen in Delphi, Java, Python vor, die in einigen Schulen eingesetzt werden. Die Klassen sind erweiterbar. Weitere Klassen wie Listen kamen hinzu. Die Objekte stellen sich selbst auf dem Bildschirm dar und haben alle nötigen Attribute und Methoden. Sie können mit der Maus angeklickt und verschoben werden. Kapselung und Geheimnisprinzip sind eingehalten.

Das Paket kann zum gleichen didaktischen Ansatz im Anfangsunterricht verwendet werden wie SuM, nämlich

- Kennen lernen der Programmierumgebung,
- objektorientierte Denkweise und Notation,
- zum Benutzen von fertigen Klassen
- bei  der Entwicklung eigener Klassen.

Mit einem entscheidenden Unterschied: Die Schüler arbeiten vom ersten Tage an durchgängig mit Objekten, die erzeugt und manipuliert werden. Unterrichtssequenzen sind verfügbar[10].

4.1  Billardkugel und Ampel unter uGrafik

Zum Vergleich mit SuM die Billard- und Ampelklassen mit uGrafik:

Beispiel 1: Billard (s.o.)

UNIT uKugel ;
INTERFACE
(* ==================================================================== *)
USES uGrafik;
    
  type
   TKugel = class (TKreis)
              XRichtung,
              YRichtung : integer;
              procedure SetLink(Tisch : TZeichenblatt);
              procedure SetXRichtung (xR : integer);
              procedure SetYRichtung (yR : integer);
              procedure PosVersetzen;
              procedure BandePruefen;
              procedure Bewegen;
            end;
...

TKugel ist eine Unterklasse von TKreis, welcher Radius, Farbe, Position und die dazugehörigen Zugriffsmethoden vererbt, sowie Methoden zum Darstellen/Löschen auf dem Bildschirm.

Im FensterFormular wird das Billard gesteuert und dargestellt. Das Programm (Ausschnitt) erklärt sich selbst.

unit uFenster;
interface
(* ==================================================================== *)
uses
 ...
  uGrafik, // import: TZeichenblatt
  uKugel ; // import: TKugel

type
  TFensterFrm = class(TForm)
  ...
  end;
var
  FensterFrm : TFensterFrm;
  Tisch      : TZeichenblatt;
  WeisseKugel,
  GelbeKugel,
  RoteKugel  : TKugel;

implementation
(* ==================================================================== *)
...
procedure TFensterFrm.FormCreate(Sender: TObject);
(* -------------------------------------------------------------------- *)
begin
  Tisch := TZeichenblatt.Create;
  Tisch.SetLink (TischImg);
  Tisch.SetFuellFarbe(clGreen);
  Tisch.Zeigen;

  WeisseKugel := TKugel.Create;
  WeisseKugel.SetRadius(15);
  WeisseKugel.SetFuellFarbe(clWhite);
  WeisseKugel.SetPos(100,200);
  WeisseKugel.Setlink(Tisch);
  WeisseKugel.Zeigen;
  // für die anderen Kugeln das gleiche
end;

procedure TFensterFrm.StartBtnClick(Sender: TObject);
(* -------------------------------------------------------------------- *)
begin
  StopGedrueckt := false;
  WeisseKugel.SetXRichtung(3);
  WeisseKugel.SetYRichtung(-1);
  // für die anderen Kugeln das gleiche
  repeat
    WeisseKugel.Bewegen;
    RoteKugel.Bewegen;
    GelbeKugel.Bewegen
  until StopGedrueckt;
end;
...
end.

 

Beispiel 2: Ampeln

Zur Demonstration der Programmierung mit uGrafik sei hier das gesamte Programm abgedruckt.

UNIT uLampe;
(* ******************************************************************** *)
(* K L A S S E : TLampe                                                 *)
(* -------------------------------------------------------------------- *)
(* Version     : 0.9                                                    *)
(* Autor       : S. Spolwig, OSZ Handel                                 *)
(* Beschreibung: Die Klasse bildet eine Lampe für beliebige Anwendungen *)
(*               ab.                                           		*)
(* Compiler    : Delphi 5.0                                             *)
(* Aenderungen : 0.9	11-MAY-01                                       *)
(* ******************************************************************** *)
INTERFACE
// ======================================================================
uses uGrafik;

type
  TLampe   = class(TKreis)
   public
    constructor Create; 
    procedure Ein;
    procedure Aus;
  end;

IMPLEMENTATION
// ======================================================================

constructor TLampe.Create;
// --------------------------------------------------------------------
begin
  inherited Create;
  SetRadius(12);
end;

procedure TLampe.Ein;
// --------------------------------------------------------------------
begin
  Zeigen;
end;

procedure TLampe.Aus;
// --------------------------------------------------------------------
begin
  Loeschen;
end;

END.

 

UNIT uAmpel;
(* ******************************************************************** *)
(* K L A S S E : TAmpel                                                 *)
(* -------------------------------------------------------------------- *)
(* Version     : 0.9                                                    *)
(* Autor       : S. Spolwig, OSZ Handel                                 *)
(* Beschreibung: Die Klasse bildet eine dumme Ampel mit diskreten       *)
(*               Lampen ab.					        *)
(* Compiler    : Delphi 5.0                                             *)
(* Aenderungen : 0.9	11-MAY-01                                       *)
(* ******************************************************************** *)

INTERFACE
// ======================================================================
uses uGrafik, graphics, uLampe;

type
  TAmpel = class(TObject)
   private
    Kasten : TRechteck;
    RoteLampe,
    GelbeLampe,
    GrueneLampe : TLampe;
    XPosition,
    YPosition : integer;      // wo sie steht
   public
    constructor Create;       // herstellen
    procedure RotSchalten;
    procedure GelbSchalten;
    procedure GruenSchalten;
    procedure SetPosition(xp, yp: integer);
    procedure Zeigen;
    procedure Abschalten;
  end;

IMPLEMENTATION
// ======================================================================

constructor TAmpel.Create;
// --------------------------------------------------------------------
begin
  inherited create;
  Kasten := TRechteck.Create;
  Kasten.SetFuellFarbe(clGray);
  RoteLampe   := TLampe.Create;
  GelbeLampe  := TLampe.Create;
  GrueneLampe := TLampe.Create;
  RoteLampe.SetFuellFarbe(clRed);
  GelbeLampe.SetFuellFarbe(clYellow);
  GrueneLampe.SetFuellFarbe(clLime);
end;

procedure TAmpel.RotSchalten;
// --------------------------------------------------------------------
begin
   RoteLampe.Ein;
   GelbeLampe.Aus;
   GrueneLampe.Aus
end;

procedure TAmpel.GelbSchalten;
// --------------------------------------------------------------------
begin
  RoteLampe.Aus;
  GelbeLampe.Ein;
  GrueneLampe.Aus;
end;

procedure TAmpel.GruenSchalten;
// --------------------------------------------------------------------
begin
  RoteLampe.Aus;
  GelbeLampe.Aus;
  GrueneLampe.Ein;
end;

procedure TAmpel.Zeigen;
// --------------------------------------------------------------------
begin
  Kasten.Zeigen;
  RoteLampe.Zeigen;
  GelbeLampe.Zeigen;
  GrueneLampe.Zeigen;
end;

procedure TAmpel.Abschalten;
// --------------------------------------------------------------------
begin
  RoteLampe.Aus;
  GelbeLampe.Aus;
  GrueneLampe.Aus;
end;

procedure TAmpel.SetPosition(xp, yp: integer);
// --------------------------------------------------------------------
begin
  XPosition := xp;
  YPosition := yp;
  Kasten.SetPos(XPosition,YPosition,XPosition + 30,YPosition + 80);
  RoteLampe.SetPos((XPosition + 15 ),(YPosition + 15));
  GelbeLampe.SetPos((XPosition + 15 ),(YPosition + 40));
  GrueneLampe.SetPos((XPosition + 15 ),(YPosition + 65));
end;

END.

 

unit uFenster;
(* ******************************************************************** *)
(* K L A S S E : 							*)
(* -------------------------------------------------------------------- *)
(* Version     : 2.0                                                    *)
(* Autor       : S. Spolwig,                                            *)
(* Beschreibung: Die Klasse steuert die Anzeige zweier dummer Ampeln im *)
(*               Wechsel an einer Baustelle.                            *)
(* Zweck       : Algorithmen üben bis der Doktor kommt ...              *)
(* Compiler    : Delphi 5.0                                             *)
(* Aenderungen : 0.9	11-MAY-01                                       *)
(* ******************************************************************** *)
INTERFACE
// ======================================================================

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls,
  uGrafik, uZeit, uAmpel;

type
  TFensterFrm = class(TForm)
    SteuerPnl     : TPanel;
    EndeBtn	  : TButton;
    BildImg	  : TImage;
    TestBtn       : TButton;
    AbschaltenBtn : TButton;

    procedure FormCreate(Sender: TObject);
    procedure TestBtnClick(Sender: TObject);
    procedure AbschaltenBtnClick(Sender: TObject);
    procedure EndeBtnClick(Sender: TObject);
  end;

var
  FensterFrm    : TFensterFrm;
  Ampel_1,
  Ampel_2       : TAmpel;
 
IMPLEMENTATION
{$R *.DFM}
// ======================================================================
var  Zeichenblatt  : TZeichenblatt;

procedure TFensterFrm.FormCreate(Sender: TObject);
begin
  Zeichenblatt := TZeichenblatt.Create;
  Zeichenblatt.SetLink(BildImg);
  Ampel_1 := TAmpel.Create;
  Ampel_2 := TAmpel.Create;
  Ampel_1.SetPosition(100,100);
  Ampel_2.SetPosition(300,100);
  Ampel_1.Zeigen;
  Ampel_2.Zeigen;
end;

procedure TFensterFrm.TestBtnClick(Sender: TObject);
// --------------------------------------------------------------------
begin
  Ampel_1.Zeigen;
  Ampel_2.Zeigen;
  Ampel_1.RotSchalten;
  Ampel_2.GruenSchalten;
  Zeit.SetPause(1000);
  Ampel_1.GelbSchalten;
  Ampel_2.Gelbschalten;
  Zeit.SetPause(1000);
  Ampel_1.GruenSchalten;
  Ampel_2.RotSchalten;
end;

procedure TFensterFrm.AbschaltenBtnClick(Sender: TObject);
// --------------------------------------------------------------------
begin
  Ampel_1.Abschalten;
  Ampel_2.Abschalten;
end;

procedure TFensterFrm.EndeBtnClick(Sender: TObject);
// --------------------------------------------------------------------
begin
  Close;
end;

end.

An diesen einfachen Beispielen wird deutlich, dass der Schwerpunkt des Unterrichts auf Modellierung und Konfigurieren liegt, während die Zeit fressende Fummelarbeit der Grafikprogrammierung auf der niedrigen Ebene entfällt. Durch eine sorgfältige Analyse erreicht man eine hohe semantische Klarheit der Klassen und ihrer Hierarchie und daraus folgend i. d. R. eine überraschend einfache Implementierung. Anders ausgedrückt ist eine saubere OOA das sichere Halteseil beim Gang durch die nach oben offene Richter-Skala der Komplexität.

4.2  Ein Stift unter uGrafik

Wenn man einmal wirklich einen Stift zum Zeichnen brauchte, ist der sehr leicht unter uGrafik zu realisieren:

unit uStift;

interface
uses uGrafik;

type
  TStift = class (TLinie)
    procedure StrichZiehen (ax1,ay1,ax2,ay2 : integer);
  end;

implementation

procedure TStift.StrichZiehen (ax1,ay1,ax2,ay2 : integer);
// --------------------------------------------------------------------
begin
  SetPos(ax1,ay1,ax2,ay2);
  Zeigen;
end;

end.

Das ist alles. Der Stift erbt alles von TLinie und bekommt nur der der schönen Bezeichner wegen eine (eigentlich überflüssige) Methode 'StrichZiehen'.

4.3  Fachklassen mit Animation

Darüber hinaus können die Grafikobjekte auch zur Darstellung und Simulation von Anwendungen eingesetzt werden, die ein ordentliches Fachkonzept aufweisen, z. B. Geld, Noten, Münzen in einem Geldwechselautomaten, sofern sich die Objekte selbst auf dem Bildschirm darstellen sollen. Ansonsten ist die Trennung von Daten und ihrer Repräsentation zu präferieren.

Click for more!

Animierter Geldwechselautomat

type
  TMuenze = class (TBargeld)
   protected
    Form     : TKreis;
    Radius   : integer;
    Praegung : TText;
    Farbe    : TColor; (* clYellow, Clwhite *)

   public
    constructor Create; override;
    function IstEcht : boolean; override;
    ...
end;

Aus der Oberklasse TBargeld erbt TMuenze das Attribut Wert mit den dazugehörigen Zugriffsmethoden.
TMuenze ist Oberklasse für Mark, Groschen, Pfennig usw., die Methoden sind polymorph. Daneben hat eine Münze die natürlichen Attribute Form und Prägung zur Darstellung, wobei es schon ein erheblicher Unterschied ist, ob sie als solche konkretisiert sind oder stattdessen eine technisch erzwungene Kombination Stift/Bildschirm auftaucht.

Beispiele zur objektorientierten Modellierung mit/ohne uGrafik stehen stehen unter
http://www.oszhandel.de/gymnasium/faecher/informatik/modellierung/uml.htm

___________________

Literatur und Links

[1]   Ludger Humbert: Objektorientierung im Informatikunterricht der Sekundarstufe II
       http://region.Hagen.de/OOP/welcome.html
[2]   http://www.learn-line.nrw.de/angebote/oop/medio/sum/kern/index.html
[3]   B. Meyer: Objektorientierte Softwareentwicklung. München Wien London, 1990.
[4]   http://www.learn-line.nrw.de/angebote/oop/medio/didaktik/bibliothek/index.html
[5]   G. Dick: Stifte und Mäuse mit JAVA
       http://www.avg-wesel.de/fb/inf/lfb/sumjava/kap5/erstesprogramm.htm
[6]   Hannah-Arendt-Gymnasium : Doku Info Lk 12
       http://www.kubitz-online.de/oop/uebersicht.html
[6a] http://www.krumwiede.de/Informatik/SumJava/start.html
[7]   Hannah-Arendt-Gymnasium : Doku Info Lk 12
[8]   http://www.mg-werl.de/faecher/Informatik/Java/index.html
[9]   Siegfried Spolwig: 'Hello World' in OOP. IN: LOG IN 19 (1999) Heft 5.
[10] Unterrichtssequenzen mit uGrafik.
       http://www.oszhandel.de/gymnasium/faecher/informatik/u-sequenzen/index.htm


OOP.03

05. Oktober 2008   Siegfried Spolwig

page_top