RPG

191. 同じ END でも ...

次はあるプログラムの演算の一部である。

-----------------------------------------------------------------------------
0001.00 C     1             DO        100           N                 4 0                  
0002.00 C                   SELECT                                                         
0003.00 C                   WHEN      OPT = 'NXT'                                          
0004.00 C     SHCODE        SETGT     SHOHIN                                               
0005.00 C                   READ      SHOHIN                                 50            
0006.00 C                   WHEN      OPT = 'PRV'                                          
0007.00 C     SHCODE        SETLL     SHOHIN                                               
0008.00 C                   READP     SHOHIN                                 50            
0009.00 C     N             IFGT      *ZEROS                                               
0010.00 C     N             SUBST     RESULT:16     SHCODE                                 
0011.00 C                   ELSE                                                           
0012.00 C                   MOVE      *BLANKS       SHCODE                                 
0013.00 C                   END                                                            
0014.00 C                   END                                                            
0015.00 C                   END                                                            
-----------------------------------------------------------------------------

13 〜 15 行目に END が3つも重なっている。
よくある話だが構造化プロゴラミングがもてはやされた時代では GOTO, TAG 命令は使わずに、
IF THEN ELSE END 等で構造化したプログラミング・ロジックにすべきであるという手法であった。
ところが END が多数重なると END は、どの条件の END であるのか余計に複雑になってしまい
混乱を生じるものである。

次のソースを見て欲しい。

-------------------------------------------------------------------------------------------
0001.00 C     1             DO        100           N                 4 0                  
0002.00 C                   SELECT                                                         
0003.00 C                   WHEN      OPT = 'NXT'                                          
0004.00 C     SHCODE        SETGT     SHOHIN                                               
0005.00 C                   READ      SHOHIN                                 50            
0006.00 C                   WHEN      OPT = 'PRV'                                          
0007.00 C     SHCODE        SETLL     SHOHIN                                               
0008.00 C                   READP     SHOHIN                                 50            
0009.00 C     N             IFGT      *ZEROS                                               
0010.00 C     N             SUBST     RESULT:16     SHCODE                                 
0011.00 C                   ELSE                                                           
0012.00 C                   MOVE      *BLANKS       SHCODE                                 
0013.00 C                   ENDIF                                                          
0014.00 C                   ENDSL                                                          
0015.00 C                   ENDDO                                                          
------------------------------------------------------------------------------------------- 

同じ END であっても ENDIF, ENDSL, ENDDO というように識別して記述しておけば
その END は、どの命令に対応する END であるのかが一目瞭然となって修正のときや
フローを追いかけるときにも明確でわかりやすいものとなる。
同じ END でも、ほんの少しの工夫でわかりやすいプログラム・ソースとなる。