皆さんは、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
|