A COBOL programozási nyelv

Objektum-orientált programozás

Az eredeti Cobol nem tartalmaz objektum-orientált eszközöket. Ez nem is csoda, hiszen a nyelv sokkal korábbi, mint az objektumelvűség definíciója. Ugyanakkor a modernizálás szelleme a Cobolt sem kerülte el, így megalkotásra került az OO Cobol. Erről egy rövid összefoglaló található itt. Egy bővebb linkgyűjtemény pedig itt.

OO Cobol

Az OO COBOL lehetőséget ad osztályok, objektumok definiálására, adat enkapszuláció, metódusok megadására. Lehetőség van öröklődésre és alosztályok létrehozására, megvalósítható a polimorfizmus. Az objektumok valamely osztályhoz tartoznak, az osztály megadja az adattagokat és a metódusokat. Az object osztály egy olyan objektum, mely létrehozza a többi objektumot. Az interfész független az osztály objektumaitól. Az interfészek között akkor áll fenn egyezőség, amennyiben egy olyan objektum, amely tartalmazza az első interfész minden metódusát bárhol használható ahol használható egy olyan objektum, amely tartalmazza a második interfész minden metódusát.

Az osztály definíciója:

CLASS-ID. osztalynev IS { TRANSIENT / COLLECTABLE / PERSISTENT } [ INHERITS {class-name-2}...].
[Class Environment Division]
:
[IDENTIFICATION DIVISION.
CLASS-OBJECT.
[Class Object Environment Division]
:
[Class Object Data Division]
:
[PROCEDURE DIVISION.
[{Class Methods}...]]
:
END CLASS-OBJECT.]

[IDENTIFICATION DIVISION.
OBJECT.
[Object Environment Division]
:
>[Object Data Division]
:
[PROCEDURE DIVISION.
[{Object Methods}...]]
:
END OBJECT.]
END CLASS.

A metódus rendelkezik mewtódus-névvel és rendelkezik saját adatszegmenssel (Data Division), és eljárás-szegmens (Procedure Division). A metódus meghívása az objektumra mutató referencia és a metódusnévvel lehetséges. Definiálhatunk paraméterlistát és visszatérési értéket. A metódusban definiált adatok lokálisak az adott metódusban.
A metódus definíciója:

IDENTIFICATION DIVISION

METODUS-ID. metodusnev IS { PUBLIC / RESTICTED / PRIVATE } [ PROTOTYPE OF osztalynev ]

DATA DIVISION.
.
.

PROCEDURE DIVISION [ USING { INPUT / OUTPUT / I-O } adat1 RETURNING adat2 ].
.
.

END METHOD metodusnev.

Egy adott objektum M nevű metódusának meghívása:

OBJ :: M(PAR)

ahol PAR a paraméterlista, vagy ugyanez beszédesebb utasítással:

INVOKE OBJ M USING PAR RETURNING ANS



Az OO COBOL klasszikus objektum-modellt valósít meg.

Az OO COBOL kommunikációs modellje: szinkronikus.

Élettartam

Az objektum életciklusa a létrehozásával kezdődik és a megszüntetésével ér véget. Egy osztály adott objektumának létrehozása az object osztály CBL-CREATE metódusa segítségével történik. Egy objektum lehet:

A tranziens osztályok objektumai automatikusan megszűnnek, amikor a futó egység (programfuttatáskor) terminál. Ha az osztály állandó az osztály objektumai csak akkor törlődnek a memóriából, ha meghívjuk rájuk az object osztály CBL-DISCARD metódusát. Az állandó osztályok objektumai léteznek a következő futtatási egységekben is. Ha az osztály collectable lesz, az osztály tranziens és innentől automatikusan megszűnik, amikor a futó egység terminál. Ezen kívül egy osztály objektumai megszűntethetők a futó egység terminálása előtt is a futó egység szemétgyűjtője (garbage collector) segítségével, amennyiben már más tranziens objektumok nem hivatkoznak rá az egységen belül.

Polimorfizmus

Az OO COBOL-ban egy adat tartalmazhat különböző objektumokat különböző osztályokból; ez azt jelenti, hogy ezen az adaton megvalósított metódushívás összekapcsolható több lehetséges metódus közül eggyel. Bizonyos esetekben ez a metódus már futási idő előtt meghatározható, de általában a metódus nem határozható meg futtatás előtt.

Egy adat tartalmazhatja egy adott osztály objektumait, azonban deklarálhatjuk úgy is, hogy egy adott interfésszel egyező objektumokat tartalmazzon. Amennyiben az interfészt adjuk meg, az egyező objektumok osztályai teljesen különbözőek is lehetnek.

Megadása:

[ interface-neve ]
[ ]
[ [ { CLASS-OBJECT } ] ]
OBJECT REFERENCE [ [ { } OF ] SELF ]
[ [ { CLASS } ] ]
[ ]
[ [ CLASS-OBJECT OF ] osztaly-nev [ONLY] ]

Láthatóság, enkapszuláció

Az objektum definiálásakor a metódusok lehetnek

Az adattagok lehetnek PRIVATE és RESTICTED (publikus adatok nem engedélyezettek). Ha a metódus vagy az adattag láthatósága PRIVATE, akkor a az adattag vagy a metódus csak olyan metódusokból érhetők el, amelyeket ugyanabban az objektumban deklaráltak. Ha a metódus vagy az adattag láthatósága PRIVATE, akkor a az adattag vagy a metódus olyan metódusokból elérhető, amelyeket ugyanabban az objektumban deklaráltak, ezen kívül elérhetővé válik azon objektumok metódusaiban, amely az eredeti objektum osztályából öröklődött osztálynak egy példánya. Ha a metódus láthatósága PUBLIC, akkor a metódus látható minden olyan objektumban, amely hozzáfér az eredeti objektumhoz. Adattagokra PUBLIC láthatóság nem lehetséges.

Azonosítás, egyenlőség

Az OO COBOL megkülönbözteti az objektum referencia és az objektum azonosító fogalmakat. Az OO COBOL-ban az objektum referencia egy érték, amely egyedileg azonosítja az objektumot az élettartama alatt. Két objektumnak nem lehet ugyanaz a referenciája és minden objektumnak van legalább egy referenciája. Megengedett, hogy egy objektumnak több referenciája is legyen, de erősen ajánlott és általánosságban igaz, hogy egy objektumnak egy referenciája van.

Az OO COBOL-ban az objektum azonosító (egy adat) azonosítja az objektumot. A "Data Division" részben deklarálható: USAGE IS OBJECT REFERENCE. Van három előre definiált objektum azonosító:

A SELF és a SUPER mindkettő az aktuális metódus objektumára hivatkozik, arra használható, hogy ezen objektum más metódusait meghívhassuk. SUPER azonosító segítségével az osztályból származott osztályok metódusait is elérhetjük. Van egy speciális osztály: CBL-NULL. A NULL objektum egy CBL-NULL típusú objektum. A NULL objektumra való hivatkozás minden osztályból lehetséges.

Az objektum azonosítók egyenlőségét vizsgálhatjuk. Két objektum azonosító azonos, ha az általuk mutatott objektum ugyanaz.

Öröklődés

Az INHERITS kulcsszóval adhatók meg azon osztályok, amelyekből az osztály származik. Az OO COBOL-ban definiált egy CBL-BASE osztály, amelyből a COBOL osztályok származnak. Nem kötelező az osztályoknak ebből a CBL-BASE osztályból származniuk. Az osztályöröklődés itt implementációs fogalom. Az interfészeket definiálhatom úgy, hogy átörökítsék az osztály interfészeit és/vagy másik interfészeket. Mindét öröklődésnél (osztály és interfész öröklődés) lehetséges többszintű öröklődés. Biztosítani kell, hogy az öröklődés megőrizze az interfész egyezőséget. Az interfész- és osztálydefiníciók összessége valójában egy altípus-hierarchiát ír le az objektumok, osztályok és interfészek közötti egyezőségi reláció segítségével. Minden öröklődés public típusú.

Adattagok, tagfüggvények

Az adattagokra a következők érvényesek:

Minden metódus az osztály PROCEDURE DIVISION részében definiált. Rendelkezik saját WORKING-STORAGE résszel, paraméterek esetén pedig LINKAGE résszel. A metódusok virtuális és public típusúak. Ezeket a metódusokat az INVOKE utasítással hívhatjuk meg. Például:

IDENTIFICATION DIVISION.
PROGRAM-ID. MultiplyNums.


ENVIRONMENT DIVISION.
DATA DIVISION.
LINKAGE SECTION.
01 Param1 PIC 9(3).
01 Param2 PIC 9(3).
01 Answer PIC 9(6) COMP.
01 StrA PIC X(20).
01 StrB PIC X(20).

PROCEDURE DIVISION USING Param1, Param2, StrA, StrB, Answer.
Begin.

DISPLAY ">>>>>>>>>>>>>>>>> In the sub-program"
DISPLAY StrA Param1
DISPLAY StrB Param2

MULTIPLY Param1 BY Param2 GIVING Answer.


MOVE "VALUE OVERWRITTEN" TO StrA
MOVE "VALUE OVERWRITTEN" TO StrB

DISPLAY "<<<<<<<<<<<<<< Leaving sub-program now".
EXIT PROGRAM.

Virtuális tagfüggvények, absztrakt osztályok, operátortúlterhelés

A COBOL-ban nincs lehetőség definíció nélküli függvények deklarálására. Ebből fakadóan, nem lehet absztrakt ősosztályt létrehozni. Az operátortúlterhelés sem támogatott.

Objektumok létrehozása és törlése

Az objektumokat a SOMClass osztály metódusainak segítségével lehet létrehozni és törölni. Egy objektumot a somNew metódus segítségével lehet létrehozni. Ez a metódus az objektumhoz tartozó referenciát adja vissza. Lehetőség van az objektumok törlésére is. Ezt a somFree metódus segítségével lehet megtenni. (több nyelvben ezeket a new és a delete operátorokkal érhetjük el. Pl: c++)

Mivel tömbök allokálása nem lehetséges, ezért a new[] és delete[] operátorokhoz hasonló metódusok nincsenek.

Konstruktor és destruktor

Minden osztály a SOMObject ősosztályból származik. Ez az ősosztály tartalmazza a somInit (konstruktor) és a somUninit (destruktor) metódusokat.

Az objektumok létrehozásánál a somNew metódus meghívja a somInit-et, a somFree pedig a somUninit-et.

Ahogyan a nyelvek többségében is, a COBOL-ban sincs az alap konsturktornak paramétere. A somNew konstrukor működését felül lehet definiálni, de csak paraméter nélküli somNew-val. (tehát nincs lehetőség paraméteres konstruktor írására)

Fordítás

Az OO Cobol program fordítása sokkal bonyolultabb mint egy sima "compile-link-run" folyamat. A főbb lépések a következők: