RPG

146. プロシージャー入門(1)

先のモジュラー・プログラミングではサブ・ルーチンではなく、プロシージャーを
使うべきである、との重要性について解説したが、実はプロシージャーは、さらに
大きな汎用性を持ち、広がりを見せてくることは次第に明らかになってくるはずである。
プロシージャーは、EXPORT できる関数と考えることができる。
プロシージャーは、それ自体で完結している。
ここからはプロシージャーの機能をもう少し学習してみよう。

前に GET_HINSHU というプロシージャーを紹介した。

-------------------------------------------------------------------------
C******************************************************             
 *   GET_HINSHU :   品種名の取得                                    
C******************************************************             
P GET_HINSHU      B                   EXPORT                        
D GET_HINSHU      PI            14                                  
D  HNSCOD                        4A   VALUE                         
C                   SETOFF                                       99 
C     HNSCOD        CHAIN     HINSHU                             99 
C                   RETURN    HNSNAM                                
P GET_HINSHU      E                                                 
-------------------------------------------------------------------------

これを少し改造してみよう。

-------------------------------------------------------------------------
C******************************************************               
 *   GET_HINSHU :   品種名の取得                                      
C******************************************************               
P GET_HINSHU      B                   EXPORT                          
D                 PI            14                                    
D  HNSCOD                        4A   VALUE                           
                                                                      
D NOTFOUND        C                   CONST(' 品種エラー   ')         
C                   SETOFF                                       99   
C     HNSCOD        CHAIN     HINSHU                             99   
C   99              MOVEL(P)  NOTFOUND      HNSNAM                    
C                   RETURN    HNSNAM                                  
P                 E            
-------------------------------------------------------------------------
1. プロシージャーの宣言
P GET_HINSHU      B                   EXPORT

は最初に行うプロシージャーの宣言であり、EXPORT は、このプロシージャーを外部の
プログラムから参照できるように EXPORT することを意味している。

2. プロトタイプの宣言
D                 PI            14
D  HNSCOD                        4A   VALUE

の行ではプロシージャーのプロトタイプを宣言している。
最初の PI の行は、プロシージャーの入り口であり、 14 は 14桁の文字列が
このプロシージャーの戻り値となることを示している。
PI に続く行は、すべてプロシージャーのパラメータであり、VALUE がそれを示している。
パラメータでない D-仕様書はこれらに続いて連続して記述してよいが、
バラメータとは混在しないように一行のスペース行を空けて記述すると見やすくなる。
ここでは

D NOTFOUND        C                   CONST(' 品種エラー   ')

という固定値を定義されているが、この箇所にはプロシージャー内で使用する変数を
D-仕様書として自由に定義することができる。
これらの変数は「ローカル変数」として、他のプロシージャーからは参照することは
できない。つまり、例えば、ある変数 SURYO をプロシージャー内のローカル変数として
定義し、別の異なるプロシージャー内でも同じ SURYO というローカル変数を定義したとしても
これらは別物であり、そのプロシージャー内だけでの完結した変数であると見なされる。
同じようにサブ・ルーチンを定義してもよいが定義するとすれば

P                 E

の直前に定義することになる。
しかし折角、プロシージャー定義でオブジェクト指向のプログラミング・モデルを作成している
のであるからサブ・ルーチンは、そろそろ捨ててもいいころである。