RPG

377. RPGソースの注記の活用

RPGソースの記述もほんのわずかな工夫だけで見やすくなったり
プログラムの品質の向上に役立つテクニックがある。
今日はその中のひとつを紹介しよう。
RPGソースには右端に注記を記述できる欄が用意されている。
よく使われるのは次のようなフィールドの意味を説明するものである。

0231.00  *( --WUIF-- )                                                                           
0232.00 D GUIF_P          S               *                                                      
0233.00 D GUIF            DS          1024    BASED(GUIF_P)                                      
0234.00 D                                     QUALIFIED                                          
0235.00 D  NAME                   1      8A                                         名前         
0236.00 D  BYTES                  9     12B 0                                       構造体の長さ 
0237.00 D  BIT                    1   1024    DIM(1024)                             データ       
0238.00                                                                                          
0239.00  *( --WUII-- )                                                                           
0240.00 D GUII_P          S               *                                                      
0241.00 D GUII            DS          1024    BASED(GUII_P)                                      
0242.00 D                                     QUALIFIED                                          
0243.00 D  NAME                   1      8A                                         名前         
0244.00 D  BYTES                  9     12B 0                                       構造体の長さ 
0245.00 D  BIT                    1   1024    DIM(1024)                             データ       

このような注記の利用方法はよくあることであるが
ここで紹介したいのは DO-LOOPやIF-ELSE-ENDIF などの構造化を示す注記を
次のように記述する方法である。

0343.00  *( WUIS の比較 )                                                                           
0344.00 C                   MOVEL(P)  '--WUIS--'    ATTR                                            
0345.00 C                   EXSR      SETSTR                                                        
0346.00 C                   EVAL      BYTES.NEW = GUIS.BYTES                                        
0347.00 C                   EVAL      BYTES.OLD = OUIS.BYTES                                        
0348.00 C     1             DO        GUIS.BYTES    N                              DO 1-GUIS.BYTES  
0349.00  *                                                                                          
0350.00 C     OPTION        IFEQ      '*DIFFER'                                    *DIFFER          
0351.00 C     GUIS.BIT(N)   IFNE      OUIS.BIT(N)                                  <>               
0352.00 C                   EXSR      PRT_GUIS                                                      
0353.00 C                   ENDIF                                                  <>               
0354.00 C                   ELSE                                                   *DIFFER          
0355.00 C                   EXSR      PRT_GUIS                                                      
0356.00 C                   ENDIF                                                  *DIFFER          
0357.00 C                   EXSR      NXTSTR                                                        
0358.00 C                   ENDDO                                                  DO 1-GUIS.BYTES  

[解説]

フリー・フォーマットであれば構造化して表示することが可能であるが
伝統的なRPG記述による固定フォーマットの場合は構造化を示すことが難しい。
しかし上記のように DO-LOOP文や IF-ELSE-ENDIF の始まりと終わり
に注記をつけておくと構造化が非常にわかりやすくなる。
これはC言語のテキストとしてよく使われる手法であるが
RPGでもこの方法は有効であるので紹介した。

また参考までにENDではなくENDDOENDIFと明示的にENDの種類を区別して
記述しておくとコンパイラーが対応を不適切なENDXXをチェックしてくれるので
不用意なエラーを防ぐことができる。
END ではなくENDxxと明示的に記述するようにしたい。