MainframeSupports
tip uge 20/1999:

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).
 
Sidste uges tip        Tip oversigten