Automatische Objektoperationen

Hier wird beschrieben, welche Operationen auf Objekte von der TAA automatisch vorgenommen werden, und zwar einerseits beim Register bzw. Unregister von Modulen, und andererseits beim Aufruf anderer TAA-Bausteine.

Zuerst wird beschrieben, welche Operationen in der PC-Infrastruktur automatisch vorgenommen werden. Diese Angaben gelten für alle Module, die auf dem PC ausgeführt werden, unabhängig von der benutzten Programmiersprache. 

Anschließend wird beschrieben, welche Operationen in vom TAA-Preprozessor erstellte COBOL-Module hineingeneriert werden. Diese Operationen erfolgen zusätzlich zu den von der Infrastruktur vorgenommenen Operationen.

Am Ende steht eine Liste von Unterschieden und Eigenheiten, die für die unterschiedlichen Laufzeitumgebungen beachtet werden sollten.

TAA-Infrastruktur auf dem PC

Register

Die folgenden Operationen werden für alle Objekte ausgeführt, welche in der Modulschnittstelle definiert sind und nicht die Rolle NOP haben:

ObjektartKlasseRolleOperation
Global, ParmalleCREtaaOmObjNew
Global, ParmRECMOD Falls das Objekt noch nicht angelegt wurde (taaOmObjExists), taaOmObjNew
Global, ParmLST, REFalleWenn die Liste nicht leer ist, aber kein Eintrag current ist, wird auf den 1. Eintrag positioniert

Falls (was nur beim Modultest vorkommen sollte) ein Parameterobjekt nicht übergeben wurde, wird ein Objekt als Dummy dafür deklariert und angelegt (NEW).

Unregister

Die folgenden Operationen werden für alle Objekte ausgeführt, welche in der Modulschnittstelle definiert sind und nicht die Rolle NOP haben:

ObjektartKlasseRolleOperation
Global, ParmRECDELtaaOmObjDelete
Global, ParmLST, REFDELtaaOmObjReset
Lokalalle taaOmObjDestroy

Call

Keine automatischen Operationen. Es werden lediglich die Handles der Objekte des Aufrufers mit dem entsprechenden Objekt des aufgerufenen Moduls verbunden. 

In generierten COBOL-Programmen

Bei der Benutzung von COBOL-Modulen ist es unbedingt erforderlich, den Objektinhalt, der im Programm verändert wurde, über einen PUT an die Infrastruktur zu übergeben bzw. nach einem Modulaufruf über einen GET von der Infrastruktur den aktualisierten Inhalt abzuholen. Der Grund dafür ist, dass bei COBOL der Objektinhalt als programmlokale Kopie (in der Linkage Section) bereitgestellt wird, wohingegen bei der Arbeit mit z.B. C oder VB direkt auf dem Objekt in der Infrastruktur operiert wird. Die dafür in COBOL üblicherweise notwendigen Operationen werden in vom Preprozessor generierten Modulen für den Register, Unregister und Modulaufrufe automatisch erzeugt.

Die Generate des TAA-COBOL-Preprozessors sind für Einsatz unter MVS und PC im wesentlichen gleich. Dennoch vorhandene Unterschiede sind, soweit sie Objektoperationen betreffen, unten vermerkt. Auf dem PC bedeutet dies, dass u.U. Operationen im COBOL-Code wiederholt werden, die auch bereits in der PC-Infrastruktur erfolgten, was aber nicht zu Problemen führt. Beispiele hierfür sind der Initialize, oder NEW und DEL für die Rollen CRE bzw. DEL. Für den Programmierer ist es dadurch hinsichtlich der automatischen Objektoperationen nicht von Bedeutung, ob ein Modul für Nutzung auf PC oder MVS erstellt wird. 

Register

Die folgenden Operationen werden für alle Objekte ausgeführt, welche in der Modulschnittstelle definiert sind:

ObjektartKlasseRolleOperation
Parm, GlobalalleCRENEW
Parm, GlobalRECREF MOD DELGET
Parm, GlobalLST, REFREF MOD DELGET FIRST (abhängig vom Setting AutoGetFirst)

Unterschiede LAN/MVS

Unregister

ObjektartKlasseRolleOperation
Parm, GlobalRECMOD CREPUT
Parm, GlobalRECDELDELETE
Parm, GlobalLST, REFDELRESETCONTENTS

CALL

Vor dem Aufruf werden für die zugewiesenen Objekte folgende Operationen ausgeführt, es sei denn, das Objekt hat in dem aufgerufenen Modul die Rolle CRE:

in aufgerufenem Modulim aktuellen Modul
RolleObjektartKlasseRolleOperation
REF MOD DEL Parm GlobalRCMOD CRE DELPUT
REF MOD DEL LokalREC-PUT
 alleLST keine

Bei Rückkehr ins aufrufende Modul werden folgende Operationen ausgeführt:

ObjektartKlasseRolle
alle zugewiesenen ObjekteREC-GET
alle zugewiesenen ObjekteLST-keine
GlobalRECalle1)GET
GlobalLSTalle2)GET CURRENT (abhängig vom Setting AutoGetFirst)

*) außer NOP

Das bedeutet, dass prinzipiell alle notwendigen PUTs und GETs für REC-Objekte, die als Parameter übergeben werden automatisch generiert werden. Bei LST-Objekten dagegen muss der Programmierer selbst für die erforderlichen PUTs/GETs sorgen.

Eine häufig auftauchende Frage ist, warum für globale REC-Objekte zwar nach einem Call ein GET gemacht wird, nicht aber vor einem CALL ein PUT. Wenn ein Modul den Inhalt eines globalen Objekts in der Infrastruktur verändert hat, sorgt die Infrastruktur dafür, dass anderen betroffenen Modulen dieser neue Inhalt bekannt gemacht wird. Ob aber ein Modul den lokal veränderten Zwischenstand eines globalen Objekts zum Zeitpunkt eines Modulaufrufs bereits an die Infrastruktur übergeben möchte, entscheidet dieses Modul, sprich der Programmierer. 

Es besteht auch keine direkte Beziehung zwischen globalen Objekten und aufgerufenen Modulen: Es ist nicht ohne weiteres erkennbar, ob und wie ein globales Objekt in der Hierarchie des Modulaufrufs benutzt wird. Anders ist es bei Objekten, die als Parameter zugeordnet wurden: Hier besteht eine explizite Beziehung zwischen dem Objekt in dem aufrufenden Modul und dem Objekt in dem aufgerufenen Modul.

Um andererseits sicherzustellen, dass die Änderung in einem globalen Objekt, die in einem aufgerufenen Modul vorgenommen wurde, nicht verloren gehen kann, ist der GET im Anschluss ein einen CALL unbedingt notwendig und liegt deshalb nicht im Ermessen des Programmierers. Würde der GET nach einem CALL nicht durchgeführt, würden Änderungen, die in anderen Modulen durchgeführt wurden, durch Rückkehr in das aufrufende Modul implizit zunichte gemacht, ohne dass irgendjemand davon etwas merken würde.

Unterschiede Steuerung/nicht-Steuerung

Da Steuerungen keine Objektoperationen durchführen, enthalten sie auch keine Datenstrukturen für die Objekte, und wird ausschließlich ein GETHANDLE durchgeführt, aber kein GET, PUT o.ä. Ausnahme sind Objekte, die von Steuerungen intern benutzt werden (z.B. SYSTVAR bei Verwendung des START-Konstrukts); für solche Objekte gelten dieselben Regeln wie für Objekte in nicht-Steuerungs-Modulen.

Unterschiede LAN/MVS

Obwohl wir uns bemühen, das Generat und die Laufzeitumgebungen für COBOL-Module unter MVS und im LAN so zu gestalten, dass sich die Module in beiden Umgebungen gleich verhalten, ist dies nicht immer vollständig möglich. Wir möchten hier auf einige Stellen hinweisen, wo Unterschiede bei der Objektbehandlung auftreten können, damit dies, falls notwendig, bei der Programmierung berücksichtigt werden kann und Probleme und aufwändige Fehlersuchen vermieden werden können.

  • Bei der Nutzung von Listenobjekten in objektgesteuerten Schleifen sind einige Vorsichtsmaßnahmen zu beachten.
  • Die Art und Weise der Objektinitialisierung beim NEW ist unterschiedlich.
  • In bestimmten Konstellationen kann es vorkommen, dass ein REC-Objekt im LAN initialisiert vorliegt, unter MVS aber der Inhalt des Datenbereichs undefiniert ist:
    • Wenn  ein Record-Objekt in einer Steuerung die Rolle CRE  hat, wird unter  MVS zwar sein Inhalt gelöscht, aber der Datenbereich nicht neu initialisiert. Dies ist nicht anders möglich, da MVS die Initialisierung nur im generierten COBOL erfolgen kann. In Steuerungen werden aber keine Datenstrukturen erzeugt, sodass kein Bereich vorhanden ist, der initialisiert werden könnte.
    • Im LAN wird für ein Objekt, welches in einem Modul die Rolle MOD hat, aber noch nicht angelegt ist, wird von der Infrastruktur ein NEW ausgeführt, um die Datenstruktur zu initialisieren. Dies ist unter MVS nicht möglich; der Datenbereich solcher Objekte bleibt undefiniert. Um Probleme zu vermeiden, sollten Objekte, von denen bekannt ist, dass sie bei bestimmten Ereignissen bei Modulbeginn leer sind, für diese Ereignisse mit CRE definiert werden.
    • Record-Objekte, die im LAN mit ByValue übergeben werden, aber beim Aufrufer noch nicht angelegt waren, kommen beim aufgerufenen Modul initialisiert an (nicht nur bei Rolle MOD oder CRE, vgl. voriger Punkt). Es ist aus Kompatibilitätsgründen nicht zu empfehlen, sich auf dieses Verhalten zu verlassen: Das aufrufende Modul sollte sicherstellen, dass das ByValue-Objekt vor der Übergabe existiert.
1) , 2)
außer NOP
faq:allg:autoobjoperations · Zuletzt geändert: 14.03.2018 09:33

Copyright © 1992-2024 TeamWiSE Gesellschaft für Softwaretechnik mbH         Adressen |  Kontakt |  AGB |  Datenschutzerklärung |  Impressum