Das ATOS-Magazin 3/99
ATOS Programmierpraxis
Moderne Zeiten

# Wahl der konkreten Attribute

Nun geht es um die Frage, an welchem Ort und in welcher Form (also in welcher Kodierung) die Daten über die Fußballspieler und Vereine tatsächlich abgelegt werden. Der Vorteil der zuvor definierten abstrakten Schnittstelle war ja gerade, daß wir uns nun unabhängig vom Modulbenutzer frei entscheiden können, wo und wie diese Informationen gesichert werden.

Im ersten Teil des Kurses wurde aber bereits eine wichtige Anforderung an unsere Realisation gestellt: Es dürfen hierzu keine globalen Variablen benutzt werden, denn sonst würde sich eine durch eine Operation veranlaßte Änderung auf alle Fußballspieler oder Vereine auswirken, und nicht nur auf den akutellen.

An diesem Punkt kommt daher die OT/OB-Lib zum Einsatz. Sie verwaltet für jedes Objekt einen eigenen Speicher. Zunächst zählen wir ihr dabei die gewünschten konkreten Attribute für Fußballspieler und Vereine auf und später kontaktieren wir sie immer dann, wenn wir einen solchen Attributsatz anlegen, freigeben, auslesen oder beschreiben möchten.

Bei der Wahl der Kodierung kann man oftmals Optimierungen vornehmen. Sei es, daß man mehrere Werte in eine größere Variable kodiert, um sonst ungenutzen Speicherplatz, oder daß man Werte doppelt (redundant) in verschiedenen Formen ablegt, um so beim Abruf unter Umständen Rechenzeit zu sparen.

Eine andere Variante besteht darin, die Informationen gar nicht im eigentlichen Objektspeicher, sondern an einem ganz anderen Ort -- vielleicht auf der Festplatte, oder auf einem entfernten Rechner im Netzwerk -- abzulegen. In diesem Fall enthält der Objektspeicher dann üblicherwiese nur Informationen über den Zugang zu diesem entfernten Ort, bspw. die Dateikennung oder die IP-Adresse.

In unserem Beispiel können wir die Daten aber 1:1 kodieren. Die abstrakten Attribute erhalten dabei jeweils genau ein konkretes Attribut:

Der Fußballspieler: | Name (STRING) Spielerstärke als Torwart (WORD) Spielerstärke als Aberwehspieler (WORD) Spielerstärke als Mittelfeldspieler (WORD) Spielerstärke als Stürmer (WORD)
Der Verein: | Name (STRING) Mannschaftsaufstellung (ARRAY aus 11 Fußballspielern)

# Der Fußballspieler

Widmen wir uns nun der Frage, wie wir diese Liste der Bibliothek mitteilen. Im ersten Schritt ist durch Aufruf der Funktion `@ot_create` ein neuer Objekttyp anzumelden. Als Rückgabewert erhält man dann eine Kennung für diesen Typ. Im zweiten Schritt wird die Funktion `@ot_attrib_create()` für jedes anzulegende, konkrete Attribut aufgerufen. Dabei wird die zuvor erhaltene Typkennung des zu erweiternden Typs, sowie die Typkennung des Attributtyps übergeben. Als Rückgabewert erhält man eine Attributkennung, welche man später wieder benötigt, um das entsprechende Attribut auszulesen oder zu setzen:

    ' OB: fussballspieler
    PROCEDURE fussballspieler_typedef                               !call
      '
      ' In dieser Prozedur wird der Objekttyp fussballspieler definiert.
      ' Außerdem werden alle jene Dinge erledigt, die einmal bei
      ' Programmstart zu tun sind, falls Objekt diesen Typs eingesetzt
      ' werden sollen. (Hier werden bspw. einige Konstanten
      ' eingerichtet.)
      '
      '
      ' *** Objekttyp anlegen ***
      '
      LET fussballspieler_%=@ot_create
      '
      ' *** konkrete Objektattribute anlegen ***
      '
      ' +++ Spielername +++
      '
      LET fussballspieler_name_%=
                     @ot_attrib_create(fussballspieler_%,string_%)
      '
      ' +++ Spielerstaerke (in der jeweiligen Position) +++
      '
      LET fussballspieler_tor_%=
                     @ot_attrib_create(fussballspieler_%,word_%)
      LET fussballspieler_abwehr_%=
                     @ot_attrib_create(fussballspieler_%,word_%)
      LET fussballspieler_mitte_%=
                     @ot_attrib_create(fussballspieler_%,word_%)
      LET fussballspieler_sturm_%=
                     @ot_attrib_create(fussballspieler_%,word_%)
      '
      ' *** einige Konstanten festlegen ***
      '
      ' ++SYM
      '
      LET fussballspieler_position_tor_&=0
      LET fussballspieler_position_abwehr_&=1
      LET fussballspieler_position_mitte_&=2
      LET fussballspieler_position_sturm_&=3
      '
      ' ++SYM
      '
    RETURN

Angemeldet wird mit Aufruf der Prozedur `@fussballspieler_typedef` somit der Objekttyp `fussballspieler_%` mit seinen fünf konkreten Attributen `fussballspieler_name_%` (vom Typ `string_%`), sowie `fussballspieler_tor_%`, `fussballspieler_abwehr_%`, `fussballspieler_mitte_%` und `fussballspieler_sturm_%` (jeweils von Typ `word_%`). Anschließend werden noch weitere, einmalig zu tätigende Aktionen durchgeführt, die notwendig sind, wenn Objekte vom Typ `fussballspieler_%` im Programm benutzt werden sollen. Darunter fällt hier das Vorbelegen einiger symbolischer Konstanten mit Werten.

Folgende Typen bietet die OT/OB-Lib als elementare Typen an:

Tabelle 4: elementare Objekttypen der OT/OB-Lib
Typ | Typkennung
boolscher Wert | boolean_%
8-Bit Integer [0; 255] | byte_%
16-Bit Integer [-32768; 32767] | word_%
16-Bit Integer [0; 65535] | card_%
32-Bit Integer [-2 Mrd; 2 Mrd] | long_%
Fließkommazahl | float_%
Zeichenkette (Länge max. 2 Mrd) | string_%
Speicherbereich (Größe max. 2GB) | memory_%
Objekttypkennung | obtyp_%
Objektverweis | link_%
Array (max. 2 Mrd Einträge) | array_%

Typ- und Attributkennungen sind globale Variablen, welche in der OT/OB-Lib stets durch ein den Namen abschließendes Underscore ("`_`") gekennzeichnet wurden.

# Der Verein

Das Anlegen des Objekttyps `verein_%` geht analog, wobei als Attributnamen hier `verein_name_%` und `verein_aufstellung_%` gewählt wurden:

    ' OB: verein
    PROCEDURE verein_typedef                                        !call
      '
      LET verein_%=@ot_create
      '
      ' *** konkrete Objektattribute anlegen ***
      '
      ' +++ Vereinsname +++
      '
      LET verein_name_%=@ot_attrib_create(verein_%,string_%)
      '
      ' +++ Die Mannschaftsaufstellung ist ein Array +++
      ' +++ mit 11 Fußballspielern                   +++
      '
      LET verein_aufstellung_%=@ot_attrib_create(verein_%,array_%)
      '
    RETURN

Die beiden Prozeduren `fussballspieler_typedef` und `verein_typdef` sind bei Programmstart einmalig aufzurufen.

Ausfüllen der Prozeduren mit Leben