COBOL2002 ユーザーズガイド

[目次][用語][索引][前へ][次へ]

33.2.2 チェック項目の説明

<この項の構成>
(1) 半角かたかなは使わないようにできないか
(2) 16進英数字定数は使わないようにできないか
(3) 日本語文字データの転記,比較に英数字定数を使わないようにできないか
(4) 日本語定数の中に空白を含まないようにしているか
(5) プログラム名には英小文字を使わないようにできないか
(6) 異なった文字集合間での順序の比較はしていないか
(7) 数値の内部表現を意識したコーディングをしていないか
(8) 9xの入出力状態は利用しないようにできないか
(9) 固定形式正書法の場合,日本語を含む原始プログラムの1行をプログラム原文領域の2/3程度で終わらせているか
(10) COPY文のREPLACING指定およびREPLACE文の作用対象に日本語を使わないようにできないか
(11) CALL文で直接システム関数を呼び出していないか

(1) 半角かたかなは使わないようにできないか

このシステムのコンパイラのコード系はシフトJIS(SJIS)ですが,EUC(UJIS)を使っているコンパイラもあります。

半角かたかな文字のバイト数が,シフトJISコードと日本語EUCコードでは次のように異なります。このため,半角かたかな文字は使わないで全角かたかなを使った方が移植性が良くなります。

[図データ]

(2) 16進英数字定数は使わないようにできないか

内部コードはシステムによって異なります。16進英数字定数を使うということは内部コードを意識しているということなので移植性が悪くなります。

(3) 日本語文字データの転記,比較に英数字定数を使わないようにできないか

システムによってはシフトコードを指定することで日本語文字データを区別しているものがあります。日本語定数を使わないで,英数字定数で日本語文字データを指定すると,英数字定数の長さが異なってきます。日本語文字データの転記,比較などは日本語定数を使った方が移植性が良くなります。

(4) 日本語定数の中に空白を含まないようにしているか

全角の空白を記述した場合,システムによってコード値が(2020)16になったり,(8140)16になったりします。このため,比較や転記などで使用する日本語定数の中に空白があると,生成されるオブジェクトコードが異なります。

(5) プログラム名には英小文字を使わないようにできないか

システムによっては,プログラム名に英小文字を使えないものや英大文字と英小文字の等価規則が適用されないものがあります。このため,プログラム名段落やCALL文のプログラム名に英小文字を使わない方が移植性が良くなります。

(6) 異なった文字集合間での順序の比較はしていないか

異なった文字集合(例えば,かたかな文字と英数字文字)の順序は,システムによって異なります。このため,異なった文字集合間の比較をしない方が移植性が良くなります。

(7) 数値の内部表現を意識したコーディングをしていないか

数値の表現方法は,符号表現を含めてシステムに依存します。このため,数値の内部表現を意識したコーディングを避けた方が移植性が良くなります。

(悪い例)
       01 X.
         02 A PIC 9(2) USAGE COMP-X.
         02 B PIC X.
       01 FILLER REDEFINES X.
         02 AA PIC X.
         02 BB PIC 9(2) USAGE COMP-X.
           :
       PROCEDURE DIVISION.
           :
           MOVE 65 TO A.
           IF AA = 'A' THEN
               :

(8) 9xの入出力状態は利用しないようにできないか

9xの入出力状態はシステムによって異なります。このため,比較などに使わない方が移植性が良くなります。

9xを使う必要があるときは,90以上かどうかを問う比較にした方が,移植性が良くなります。

(悪い例)
           :
       SELECT A-FILE...
               FILE STATUS IS RTN.
           :
       PROCEDURE DIVISION.
           :
         IF RTN = '90'

(良い例)
           :
       SELECT A-FILE...
               FILE STATUS IS RTN.
           :
       PROCEDURE DIVISION.
           :
         IF RTN NOT < '90'

(9) 固定形式正書法の場合,日本語を含む原始プログラムの1行をプログラム原文領域の2/3程度で終わらせているか

システムによっては,シフトコードを指定することで日本語文字を区別しているものがあります。

日本語を含む1行でプログラム原文領域すべてを使った原始プログラムをほかのシステム(例えば,VOS3など)に移植すると,シフトコードを付加してプログラム原文領域をはみ出てしまうおそれがあります。このため,日本語を含む原始プログラムは,シフトコードを意識して1行を終わらせた方が移植性が良くなります。

(10) COPY文のREPLACING指定およびREPLACE文の作用対象に日本語を使わないようにできないか

システムによっては,COPY文のREPLACING指定およびREPLACE文の作用対象に,日本語が指定できないものがあります。このため,COPY文のREPLACING指定およびREPLACE文の作用対象に日本語を使わない方が移植性が良くなります。

(11) CALL文で直接システム関数を呼び出していないか

C言語のシステム関数は,#defineによって実際の関数名とは別の関数名で宣言され,マクロ展開後に置き換えられることがあります。COBOLではC言語のマクロは展開しないため,COBOLプログラムからC言語のシステム関数をCALL文で直接呼び出すと,COBOLからマクロ展開前の関数名を呼び出し,予期しない不具合が発生するおそれがあります。

COBOLプログラムからC言語のシステム関数を呼び出す場合は,直接呼び出さないで,システム関数を呼び出すCプログラムを作成し,このCプログラムを呼び出すようにしてください。

注※
Microsoft C/C++の関数