O.O. Et si on codait comme en JAVA

O.O. Et si on codait comme en JAVA

mar 19 août 2025 0 Par Ibmiiste

Intro­duc­tion :

Dans le monde du déve­lop­pe­ment sur IBM i, le RPG (Report Pro­gram Gene­ra­tor) reste un lan­gage essen­tiel. Cepen­dant, avec l’é­vo­lu­tion des pra­tiques de pro­gram­ma­tion, il est pos­sible d’in­té­grer des concepts modernes, simi­laires à ceux uti­li­sés en Java, pour amé­lio­rer la qua­li­té et la main­te­na­bi­li­té du code RPG.

1. Modu­la­ri­té et Pro­cé­dures :

En Java, la modu­la­ri­té est assu­rée par la défi­ni­tion de classes, qui regroupent des pro­prié­tés et des méthodes.
En RPG ILE, il n’existe pas direc­te­ment de notion de classe, mais tu peux t’en appro­cher en utilisant :

des modules qui jouent alors le rôle de « classes » en regrou­pant le nom de la classe, ses pro­prié­tés et ses méthodes.
De cette façon, tu obtiens une struc­ture orga­ni­sée et réuti­li­sable, simi­laire à la modu­la­ri­té offerte par Java.

des copies/includes pour cen­tra­li­ser les pro­prié­tés et les pro­to­types de procédures,

Exemple :

Défi­ni­tion des classes

**FREE

Dcl-DS LineOutput Qualified Template;
  chaine Char(132);
END-DS;
  • ligne 3 à 4 la classe LineOut­put est définie,
  • ligne 4, son unique pro­prié­té chaine est défini,
  • Pas de construc­teur ou de méthode pour cette classe(pour l’instant :-)).
**FREE

/include 'LineOutPut.rpgleinc'
// Spool class
Dcl-ds Spool Qualified template;
    overFlow ind;
    spoolName char(10);
    Dcl-DS lineSpool likeds(lineOutput);
    END-DS;
End-ds;

Dcl-PR setupSpool;
    spoolAInitialiser likeds(Spool);
End-PR;

 Dcl-PR OpenSpool  EXTPROC('OPENSPOOL');
 End-PR;

 Dcl-PR WriteSpool  EXTPROC('WRITESPOOL');
	spoolAEcrire likeds(Spool);
 End-PR;

 Dcl-PR CloseSpool  EXTPROC('CLOSESPOOL');
 End-PR;
  • ligne 5 à 10 la classe Spool est définie,
  • ligne 6 et 9, ses pro­prié­tés over­Flow, spool­Name, de simples variables, sont définis,
  • ligne 8 et 9, cette pro­prié­té fait réfé­rence à une autre classe appe­lée LineOutput,
  • ligne 12 à 14, est la décla­ra­tion d’un construc­teur,
  • ligne 16 à 24 sont les décla­ra­tions des pro­to­types des méthodes de la classe Spool.

Source des méthodes :

**FREE
Ctl-Opt NoMain Option(*SrcStmt : *NoDebugIO) Bnddir('SERVICES');

Dcl-F QSYSPRT PRINTER(132) usropn oflind(overflow);

/include 'Spool.rpgleinc'
/include 'commands.rpgleinc'

// ============================================================
//Construction du Spool  
// ============================================================
Dcl-proc setUpSpool export;
Dcl-pi *n likeds(Spool);
    spoolName Char(10);
end-pi;

 Dcl-s rc Char(1);
 Dcl-ds spoolAInitialiser likeds(Spool) inz;
 
 // 1) Initialiser l’instance locale
 spoolAInitialiser.spoolName = %Trim(spoolName);

 execCommand('OVRPRTF FILE(QSYSPRT) TOFILE(*FILE) +
                  SPLFNAME(''' + %trim(spoolAInitialiser.spoolName) + ''') OVRSCOPE(*JOB)');

 return spoolAInitialiser;
             
End-Proc;

// ============================================================
//  Ouvre le spool.
// ============================================================
 Dcl-Proc openSpool export;
 Dcl-PI *N;
   spoolAOuvrir Likeds(Spool);
 End-PI;
             
 monitor;
     open QSYSPRT;
     print('Executing:   setUpSpool('+ %trim(spoolAOuvrir.spoolName) + ')');
 on-error;
     // ignore errors ...
     // ... but try to remove the override.
     monitor;
         execCommand('DLTOVR FILE(QSYSPRT) LVL(*JOB)');
     on-error;
         dsply '*** Failed to delete QSYSPRT override! ***' rc;
     endmon;
 endmon;
 
 End-Proc;

// ============================================================
//  Écrit un message dans le spool.
// ============================================================
 Dcl-Proc writeSpool export;
 Dcl-PI *N;
     MESSAGE CHAR(132) CONST;	
 End-PI;

 Dcl-DS lineOutput likeds(LineOutput) INZ;
 END-DS;


 lineOutput = %trim(MESSAGE);
    
 write QSYSPRT lineOutput;

 End-Proc;

// ============================================================
//  Ferme le spool.
// ============================================================
 Dcl-Proc closeSpool export;
 Dcl-PI *N;
 End-PI;

 if (%open(QSYSPRT));
     close QSYSPRT;
 endif;

 End-Proc;

Dans ce source complet, 

  • il y a des includes qui contiennent la décla­ra­tion de la DS(Classe et pro­prié­tés) et les pro­to­types des méthodes,
  • et suivent ensuite les méthodes de cette classe SpooL

Paral­lèle d’usage

Java (esprit)

Spool s = new Spool("TESTSPL"); // setup
s.open();                       // open
s.write("Hello");               // write
s.close();                      // close
// ou try-with-resources pour garantir le close

RPG ILE

spool = setUpSpool('TESTSPL');  // setup (DS TEMPLATE, override posé)
openSpool();                    // open (I/O commence ici)
writeSpool('Hello');            // write
closeSpool();                   // close + nettoyage override

Pour­quoi c’est fami­lier aux déve­lop­peurs Java

  • Classe défi­nis par une DS template
  • Pro­prié­tés de la Classe conte­nus dans la DS template
  • Dans le reste du source du module sont codés les construc­teurs et les méthodes par l’in­ter­mé­diaire de sous-procédures.

Le tout est com­pi­lé et lié sous forme de pro­gramme de ser­vice et vous avez accès à la Classe Spool dont on peut se ser­vir des méthodes.

Dans les pro­cé­dures appe­lantes, il suf­fit de de mettre l’in­clude qui décrit la Classe, de créer les « objets néces­saires » en uti­li­sant le mot clef LIKEDS sur la DS classe.

Com­pa­ra­tif Java ↔ RPG ILE

Concept JavaÉqui­valent RPG ILEExemple
ClasseModule RPG + DS TEMPLATESpool.rpgle
Attri­buts (fields)DS TEMPLATE (pro­prié­tés)Spool
MéthodesPro­cé­dures exportéessetupSpool, openSpool, writeSpool, closeSpool
Construc­teurPro­cé­dure d’initialisationDcl-DS mySpool LikeDS(Spool)
sui­vi de l’ap­pel de setupSpool
Objet (ins­tance)DS basé sur le TEMPLATE (LIKEDS)Dcl-DS mySpool LikeDS(Spool_t)