HSG

Aktuelle Seite: HSG/Fächer/Informatik/Material

Eine Uhr, objektorientiert

Gruppe: mk, 15.1.03 -

Pflichtenheft

Es ist nach unseren Prinzipien eine Uhr zu programmieren. Die Ansicht soll freigewählt werden. Die Uhr selbst soll natürlich ein Objekt des Fachkonzepts sein. Man soll die Uhr stellen und ablesen können. In diesem ersten Stadium muss sie nicht laufen, man denke an Uhren in Museen, die den Beginn einer nächsten Vorführung anzeigen.
Die Software-Entwicklung ist fortlaufend in dieser Datei zu dokumentieren.

Prototyp

Objektorientierte Analyse

Der Prototyp spiegelt die Benutzeroberfläche, das GUI wieder. Sie repräsentiert die Views und den Controls des MVC-Konzepts.
Der Model-Teil, das Fachkonzept soll natürlich von der GUI getrennt werden.
Objekte sollen nach Zuständigkeiten ausgewählt werden, die Zuständigkeit für die Uhrdaten erhält ein Objekt oUhr, die zugehörige Klasse soll TUhr heißen.
Das Formular-Objekt fUhr1 wird für Erzeugung und Vernichtung aller anderer Objekte verantwortlich gemacht. Es steht in der Hierarchie höher, es "hat" die anderen Objekte. Mit UMLEd wurde folgendes Klassendiagramm erstellt:

Objektorientiertes Design

In dieser Phase erfolgt die Auswahl bzw. der Entwurf der benötigten Algorithmen. Für die einfache Basis-Uhr ist hier noch nichts zu dokumentieren. Das wird bei einer Analog-Uhr eher nötig sein.
Als nächstes steht die Auswahl der zu benutzenden Klassenbibliotheken an. Es soll wieder die Delphi-VCL benutzt werden. Natürlich setzt diese Benutzung ein Mindestmaß an Vertrautheit voraus, was hier erwartet wird.
Beim "Zusammenschieben" der Benutzeroberfläche in der Delphi-IDE hantiert man bewusst oder unbewusst mit Objekten, deren Klassen in diversen Units bereitgehalten werden. Auch das Hauptformular fUhr1 ist ein Objekt, das bei der Erzeugung einer neuen Anwendung automatisch "da ist". Man muss sich um Erzeugung und Vernichtung dieser ganzen Objekte nicht kümmern, das Delphi-System trifft automatisch die nötigen Vorkehrungen. Teils sieht man das am automatisch erzeugten Code, teils werden im Hintergrund Objektattribute und Referenzen gesetzt ohne dass man das merkt.

Implementierung

Es folgt der Delphi-Quellcode, wobei das Fachkonzept mit der Klasse TUhr1 in der Unit "mTUhr1.pas", die Benutzeroberfläche in der Unit "uUhr1.pas" zu finden ist.

unit uUhr1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,mTUhr;

type
  TfUhr1 = class(TForm)
    eH: TEdit;
    lDoppelpunkt: TLabel;
    eMin: TEdit;
    bSetzen: TButton;
    bAnfragen: TButton;
    lAusgabe: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure bSetzenClick(Sender: TObject);
    procedure bAnfragenClick(Sender: TObject);
  private
    oUhr : TUhr;
  public
    { Public-Deklarationen }
  end;

var
  fUhr1: TfUhr1;

implementation

{$R *.DFM}

procedure TfUhr1.FormCreate(Sender: TObject);
begin
  oUhr := TUhr.Create;
end;

procedure TfUhr1.FormDestroy(Sender: TObject);
begin
  oUhr.Free;
end;

procedure TfUhr1.bSetzenClick(Sender: TObject);
var
  h,min : byte;
begin
  h := StrToInt(eH.text); min := StrToInt(eMin.text);
  oUhr.SetH(h); oUhr.SetMin(min);
end;

procedure TfUhr1.bAnfragenClick(Sender: TObject);
var
  h,min   : byte;
  sh,smin : string;
begin
  h := oUhr.GetH; min := oUhr.GetMin;
  Str(h:2,sh); Str(min:2,smin);
  if sh[1]=' ' then sh[1] := '0'; if smin[1]=' ' then smin[1] := '0';
  lAusgabe.caption := sh+':'+smin;
end;

end.

Der folgende Quelltext wurde von UMLEd automatisch erzeugt.
UNIT mTUhr;

interface

type
   TUhr = CLASS

     // Attribute
     private
        FH : byte;
        FMin : byte;

     // Methoden
     public
        procedure SetH(h : byte);
        procedure SetMin(min : byte);
        function GetH : byte;
        function GetMin : byte;

   end;

implementation

//+---------------------------------------------------------------------
//|         TUhr: Methodendefinition
//+---------------------------------------------------------------------

//-------- SetH (public) -----------------------------------------------
procedure TUhr.SetH(h : byte);
begin
  FH := h;
end;

//-------- SetMin (public) ---------------------------------------------
procedure TUhr.SetMin(min : byte);
begin
  FMin := min;
end;

//-------- GetH (public) -----------------------------------------------
function TUhr.GetH : byte;
begin
  result := FH;
end;

//-------- GetMin (public) ---------------------------------------------
function TUhr.GetMin : byte;
begin
  result := FMin;
end;

end.

Test

Ein erster Test ergab, dass mit dem Programm grundsätzlich Setzen und Auslesen bestimmter Zeiten möglich ist.
Jedoch ist die Eingabe unsinniger Uhrzeiten in diesem Stadium noch möglich.