最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

13.11.CLPソースを薄化粧美人にしよう

[ Previous ] [ HOME ] [ Upper ] [ Next ]


皆さんは、CLPを作るとき、プロンプトを使いますか?人によっては、プロンプトを付け忘れた行を見つけると、わざわざプロンプトしている人も、います。

この機能自体は、システム38からあるSEU機能ですが、私は、「大嫌い」です。ごちゃごちゃ、くどくど、プロンプチングされたら、うるさくて、イラツキます。

厚化粧

あー、暑苦しくて、やかましい!大嫌いです。ソースの声が聞こえてきません!自分以外に読んでもらおうという気持ちが無いみたいですね。

0001.00              PGM                                                        
0002.00                                                                         
0003.00              DCL        VAR(&ALC) TYPE(*LGL)                            
0004.00              DCL        VAR(&OBJTYP) TYPE(*CHAR) LEN(8)                 
0005.00              DCL        VAR(&OBJNAM) TYPE(*CHAR) LEN(10)                
0006.00              DCL        VAR(&RTNLIB) TYPE(*CHAR) LEN(10)                
0007.00              DCL        VAR(&PARM1) TYPE(*CHAR) LEN(1)                  
0008.00                                                                         
0009.00          /*   ... SNIP ...     */                 
0010.00                                                                         
0011.00              IF         COND(&OBJNAM *NE ' ') THEN(DO)                  
0012.00              IF         COND(&ALC) THEN(DO)                             
0013.00              RTVOBJD    OBJ(&OBJNAM) OBJTYPE(&OBJTYP) RTNLIB(&RTNLIB)   
0014.00              CRTDUPOBJ  OBJ(&OBJNAM) FROMLIB(&RTNLIB) +                 
0014.01                           OBJTYPE(&OBJTYP) TOLIB(QTEMP)                 
0015.00              OVRDBF     FILE(&OBJNAM) TOFILE(QTEMP/&OBJNAM)             
0016.00              CALL       PGM(RPG0010) PARM(&PARM1)                       
0017.00              DLTOVR     FILE(&OBJNAM)                                   
0018.00              IF         COND(&PARM1 = 'A') THEN(DO)                     
0019.00                                                                         
0021.00                                                                         
0022.00              ENDDO                                                      
0023.00              ENDDO                                                      
0024.00              ENDDO                                                      
0025.00                                                                         
0026.00                                                                         
0027.00              RETURN                                                     
0028.00              ENDPGM                                                     

薄化粧

ほう、さっぱり、やっと静かになった。ソースのささやき声が、聞こえてきました。ふむふむ、そうか、なんだ、単純だな。作った人は、かなり、頭がいいぞ。ソースの意味がすぐにわかったもんな。

0001.00 PGM                                                                     
0002.00                                                                         
0003.00    DCL   &ALC      *LGL                                                 
0004.00    DCL   &OBJTYP   *CHAR     8                                          
0005.00    DCL   &OBJNAM   *CHAR    10                                          
0006.00    DCL   &RTNLIB   *CHAR    10                                          
0007.00    DCL   &PARM1    *CHAR     1                                          
0008.00                                                                         
0009.00 /*   ... SNIP ...     */                                                
0010.00                                                                         
0011.00    IF (&OBJNAM *NE ' ') DO                                              
0012.00       IF &ALC  DO                                                       
0013.00          RTVOBJD    &OBJNAM  &OBJTYP  RTNLIB(&RTNLIB)                   
0014.00          CRTDUPOBJ  &OBJNAM  &RTNLIB  &OBJTYP  QTEMP                    
0015.00          OVRDBF     &OBJNAM  QTEMP/&OBJNAM                              
0016.00          CALL       RPG0010  &PARM1                                     
0017.00          DLTOVR     &OBJNAM                                             
0018.00          IF (&PARM1='A') DO                                             
0019.00                                                                         
0020.00             /*   ... SNIP ...     */                                    
0021.00                                                                         
0022.00          ENDDO                                                          
0023.00        ENDDO                                                            
0024.00    ENDDO                                                                
0025.00                                                                         
0026.00                                                                         
0027.00 RETURN                                                                  
0028.00 ENDPGM                                                                  
インデントの有る無しは、大きな違いですね。さらに、各変数が読みやすいです。

ところで、薄化粧といっても、ある程度ルールはあります。

出題頻度、いや、出現頻度の高いコマンドは、当然そのパラメータは、覚えているのが、プロです。だから、たとえば、DCLときたら、次にくるのは、定義フィールド名で、その次はその属性、さらに長さです。つまり、もし、&TESTを文字で、長さ3で、宣言したいならば、

DCL   &TEST    *CHAR     3

と、あっという間に書けますよね。でも小数点は、( 3   0 )と、括弧をつけて、小数点以下の桁数を明示したほうがいいでしょう。もし

DCL  &TESTD   *DEC    3

と書くと、コンパイルリストを見ると、コンパイラが勝手に、( 3   0 ) と、小数以下は0と解釈されます。「しょうがないプログラマーだなぁ」、というコンパイラのぼやきが聞こえてきそうです。

DCL  &TESTD   *DEC    ( 3   0 )

と記述しましょう。

コラム

定位置の記法が可能な数は、コマンド別に定義されています。DCLの場合、4つなので、VALUEまで、定位置で可能です。定位置での記法とは、キーワードを付さすに、コマンドのパラメータの順番のまま、値を記す方法のことです。この順番を無視する場合はキーワード(値)の形式が必要です。

コマンド情報の表示 
コマンド . . . . . . . : DCL ライブラリー . . . . . : QSYS 

コマンドを処理するプログラム . . . . . : QCLDCL 
ライブラリー . . . . . . . . . . . . : QSYS 
プログラムを呼び出すために使用される 
状態 . . . . . . . . . . . . . . . : *USER 
ソース・ファイル . . . . . . . . . . . : 
ライブラリー . . . . . . . . . . . . : 
ソース・ファイル・メンバー . . . . . . : 
妥当性検査プログラム . . . . . . . . . : *NONE 
有効なモード . . . . . . . . . . . . . : *PROD 
*DEBUG 
*SERVICE 
実行可能な環境 . . . . . . . . . . . . : *BPGM *IPGM 
制限されたユーザーで可能 . . . . . . . : *NO 
最大定位置パラメーター数 . . . . . . . : 4 

続く ... 
続行するためには,実行キーを押してください。 

F3= 終了 F12= 取消し 
(C) COPYRIGHT IBM CORP. 1980, 2000. 

この他にも、IFならば、その次は論理値または計算式で、その次には、実行内容がきます。

IF COND(&TEST = 'YES') THEN(STRDBG PGM(XXXXXX)) 

よりも、

IF ( &TEST = 'YES' )  STRDBG  XXXXXX

のほうが、よっぽどロジックがきれいに見えます。

もちろん、

    CRTDUPOBJ  &OBJNAM  &RTNLIB  &OBJTYP  QTEMP 

になってくると、やりすぎかもしれませんね。でも、共通して、コマンド直後のキーワードはいつもはずします。また、IF文は、CONDやTHENは必ずはずします。GOTOも余計なものは入れず、

GOTO CMDLBL(NEXT) 

ではなく、

GOTO NEXT 

にします。これだけで、無駄なEBCDICが、ソースの上で、踊り狂うことはなくなります。

そもそも表形式プログラムRPGに慣れ親しんだ我々、旧言語族プログラマーにとって、フリーカラムの扱いはなれていません。でも、見やすいプログラムは、ほかの人への「情け」です。そう、

情けは、人のためならず。

少し、記法を考えてみませんか?さあ、目を覚ましてください。CLPも立派なプログラムです。いや、もっと大事かもしれません。

こちらも参考にどうぞ。13.1 The Essential CL Style Guide ほとんど同じことを、USの人も言っています。ちなみに、一人や二人ではないですよ。

2002-4-28


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送