PL/1 er et såkaldt 3. generations programmeringssprog, som kun
er udbredt i mainframe verdenen. PL/1 ligner mest af alt en kloning mellem
COBOL, PASCAL og FORTRAN og har næsten lige så mange år
på bagen som disse sprog. Der var dog ikke tænkt meget på
O-O dengang PL/1 blev opfundet. I denne uge vil vi se på, hvordan
man kan implementere O-O begrebet indkapsling i et PL/1-program.
Som med mange andre ting i PL/1 kan man programmere indkapsling på
forskellige måder. Her vil vi kort gennemgå en "quick and dirty"
metode. Den skal benyttes med omtanke, da den kan/vil give problemer i
reentrante programmer. Indkapsling går ud på at erklære
nogle variabler i en procedure, som overlever fra kald til kald, men som
kun kan benyttes i og af den pågældende procedure. Her er et
eksempel:
ooeks: PROC OPTIONS(MAIN);
CALL oo_procedure;
CALL oo_procedure;
CALL oo_procedure;
oo_procedure:
PROC;
DCL
kald_nr FIXED BIN(31) STATIC INIT(0);
kald_nr
= kald_nr + 1;
IF
kald_nr = 1
THEN
PUT SKIP LIST('Første kald');
ELSE
PUT SKIP LIST('Kald nr' !! kald_nr);
end oo_procedure;
end ooeks;
Variablen kald_nr er i PL/1 kun kendt i proceduren oo_procedure og er derfor
i O-O termer indkapslet. I praksis er det elegant, da man slipper for at
erklære en masse variabler globale, som egentlig kun benyttes lokalt.
Løsningen er "quick and dirty", fordi STATIC variabler i PL/1 egentlig
er beregnet til konstanter, som man jo ikke bør ændre ved.
Og så er der lige den hage ved løsningen, at programmet absolut
ikke er reentrant. Hvis programmet i eksemplet bliver eksekveret i noget
storage, som ikke må opdateres (eks. LPA), så vil det brage
ned i det første statement i oo_procedure med en 0C4-abend (adressing
exception).