\documentclass[a4j]{jreport}
\usepackage{array}
\usepackage{tabularx}
\pagestyle{empty}
\parindent 1zw
\title{COBOLコーディング規約}
\author{生越昌己}

\begin{document}
\maketitle

\chapter{始めに}

\section{目的}

この規約は以下の事を目的として作成しました。

\begin{itemize}
\item	標準化を行う事による品質の向上
\item	メンテ性の向上
\item	意思の疎通の向上
\item	生産性の向上
\end{itemize}

当社では規約に違反したプログラムのコンパイル及びライブラリでの存在は認め
ません。

\section{概要}

この規約は以下のことについて言及しています。

\begin{itemize}
\item	使用可能な予約語と構文
\item	命名
\item	カラム位置、タブ等
\item	コメントの挿入法
\end{itemize}

\chapter{コーディング規約}

この節ではコーディング規約全般について規定します。

\section{IDENTIFICATION  DIVISION}

ここでは以下の記述を行います。

\begin{itemize}
\item	PROGRAM-ID
\item	コメント
\end{itemize}

\subsection{PROGRAM-ID}

PROGRAM-IDの記述は以下の通りとします。

\begin{quote}
\begin{verbatim}
【例】
     1   1   2   2   2   3   3   4   4   4   5   5   6   6   6   7
7----2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2
 IDENTIFICATION      DIVISION.
 PROGRAM-ID.     <プログラム名>
\end{verbatim}
\end{quote}

\subsection{コメント}

プログラムの簡単な説明等を以下の形式で記述します。

\begin{quote}
\begin{verbatim}
【例】
     1   1   2   2   2   3   3   4   4   4   5   5   6   6   6   7
7----2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2
******************************************************************
*   システム名      ：<システム名>
*   サブシステム名  ：<サブシステム名>
*   コンポーネント名：<コンポーネント名>
*   管理者          ：<所属><名前>
*   日付日付  作業者  記述
*   ??.??.??  ....    修正内容
******************************************************************
\end{verbatim}
\end{quote}

\section{ENVIRONMENT DIVISION}

ここでは以下の記述を行います。

\begin{itemize}
\item	SPECIAL-NAMES 段落
\item	FILE-CONTROL段落
\item	コメント
\end{itemize}

\subsection{SPECIAL-NAMES 段落}

SPECIAL-NAMES 段落の記述は以下の通りです。

\begin{quote}
\begin{verbatim}
【例】
     1   1   2   2   2   3   3   4   4   4   5   5   6   6   6   7
7----2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2
 ENVIRONMENT         DIVISION.
 CONFIGURATION           SECTION.
 SPECIAL-NAMES.
     <機能名>        IS  <呼び名>.
\end{verbatim}
\end{quote}

\subsection{FILE-CONTROL段落}

一般プログラマの記述出来るファイルは、バッチプログラムのワークファイルと
してのシーケンシャルファイルのみです。その他のファイルは全てVASTMACが処
理します。

FILE-CONTROL段落の記述は以下の通りです。

\begin{quote}
\begin{verbatim}
【例】
     1   1   2   2   2   3   3   4   4   4   5   5   6   6   6   7
7----2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2
 INPUT-OUTPUT            SECTION.
 FILE-CONTROL.
     SELECT  <ファイル名>ASSIGN  <ファイル識別名>.
\end{verbatim}
\end{quote}

\section{DATA DIVISION.}

ここでは以下のものを記述します。

\begin{itemize}
\item	FILE SECTION.
\item	WORKING-STORAGE SECTION.
\item	LINKAGE SECTION.
\item	コメント
\end{itemize}

\subsection{FILE SECTION.}

前の節で述べたように、このシステムではファイル操作に於いて一般のプログラ
ムの直接操作出来るファイルは、順ファイルに限定されています。ですから、こ
こで記述されるファイルはワーク用一時ファイルに限定されます。

また、このシステムでは全てのファイルのレコード構成は、COPY句の中に定義し
ます。

\begin{quote}
\begin{verbatim}
【例】
     1   1   2   2   2   3   3   4   4   4   5   5   6   6   6   7
7----2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2
 DATA                DIVISION.
 FILE                    SECTION.
 FD     <ファイル名>
     BLOCK   <レコード数>
     LABEL   RECORD      STANDARD.
     COPY    <コピー句名>.
\end{verbatim}
\end{quote}

\subsection{WORKING-STORAGE SECTION.}

ここでは一般のデータ領域について記述します。命名規約は
\ref{chap:meimei}に規定します。その他の規定は以下の通りです。

\begin{itemize}
\item	{\bf 番号付け}	\\
	レベル番号は01からの連番とし、1づつ増加させる。また、66や77等の特殊
	な番号は使用しない。\\
	独立な項目は作らない。例えばカウンタのような項目でもどこか意味のある
	レコードに所属させる。すなわち、PICTURE を持つ01項目は存在させない。
\item	{\bf タブ規則}	\\
	このシステムのタブは基本的に4カラムです。すなわち、ある記述はその直
	前の記述の書き始めから4の倍数桁後から書き始めます。その他の規則は以
	下の通りです。
	\begin{itemize}
	\item	01はA欄の先頭から記述します。
	\item	02はB欄の先頭から記述します。
	\item	03以降はその前のレベルより2カラム下げて記述します。
	\item	レベル番号の後ろは2カラム空白を入れます。
	\item	PICは項目名の先頭から12カラム目から書きます。ただし、項目名
			の長さが11カラム以上なら、さらに4カラム単位で空白を入れます。
	\item	PIC文字列はPICの後ろ1カラムあけて書き始めます。
	\item	VALUE句、OCCURS句もPICの記述に準じます。
	\end{itemize}
\item	{\bf レイアウト規則}	\\
	特に必要な場合を除き、項目は全て詰められていることを前提とします。す
	なわち、語境界に合わせることは考えません。FILLERが必要な場合は明示的
	に記述します。\\
	1次元以上のテーブルを記述する場合は以下の操作が出来るようにします。
	\begin{itemize}
	\item	基本項目の参照
	\item	集団項目があれば、その各々の参照
	\item	多次元のテーブルの場合は、それより低い次元のテーブルを集団項
			目として参照すること
	\end{itemize}
\item	{\bf USAGE の制限}	\\
	特別な場合を除き、計算用の項目はBINARYを使用します。PIC文字列で同じ
	文字が複数個ある場合は、その個数を書く形式にする。すなわち、"999"と
	言う書き方はしないで、"9(3)と言うように	書きます。
	INDEX使用のテーブルは使用出来ません。
\end{itemize}

\begin{quote}
\begin{verbatim}
【例】
     1   1   2   2   2   3   3   4   4   4   5   5   6   6   6   7
7----2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2
 01  TB1.
     02  TB1-IDX-X   PIC S9(4)   BINARY.
     02  TB1-IDX-Y   PIC S9(4)   BINARY.
     02  TB1-SCR.
       03  TB1-SCR-X     OCCURS  2.
         04  TB1-SCR-Y     OCCURS  16.
           05  TB1-ITEM.
             06  TB1-YY      PIC 9(2).
             07  TB1-MM      PIC 9(2).
\end{verbatim}
\end{quote}

\subsection{LINKAGE SECTION}

LINKAGE SECTION独特の規定は項目の順番だけです。その他の規定は
WORKING-STORAGE SECTIONに準じます。項目の順番は以下の通りです。

\begin{itemize}
\item	帰り値
\item	送り値
\item	スイッチ
\end{itemize}

ロジック上、送り値を変更するプログラムは極力避けて下さい。

\subsection{コメント}

コメントの必要な項目定義には、その直前にコメントを挿入します。また、その
書き始めは項目名の位置に揃えます。

\section{PROCEDURE DIVISION}

ANSI85系のCOBOLは非常に多くの命令がありますが、本規約では使って良い命令
は必要最低限にしています。使用出来る命令は以下のものです。

\begin{itemize}
\item	{\bf 項目値の設定}	\\
	MOVE
\item	{\bf 計算}	\\
	COMPUTE\\
	DIVIDE
\item	{\bf ファイル操作}	\\
	OPEN\\
	CLOSE\\
	READ\\
	WRITE
\item	{\bf 制御}	\\
	IF\\
	PERFORM\\
	EVALUATE\\
	GOBACK
\item	{\bf 特殊命令}	\\
	DISPLAY
	UNSTRING
	INSPECT
\end{itemize}

カラム規定の基本は以下の通りです。

\begin{itemize}
\item	カラムの単位は4カラム
\item	動詞には8カラム使用し、空いたカラムは詰めません。8カラム以上の動
		詞の場合は、4カラム単位で拡張します。
\item	一意名には12カラム使用します。ただし長い一意名は4カラム単位で拡
		張します。
\item	句は4カラム使用します。ただし長い句は4カラム単位で拡張します。
\item	句の多い動詞の場合は、句単位で改行を行い動詞の書き始めから4カラ
		ム下げます。ただし条件文を作る動詞の場合は8カラム下げます。
\item	ブロックの字下げは4カラムを単位に行います。
\end{itemize}

詳細は各々の項目で説明します。

\subsection{コメント}

コメントに頼ったコーディングはなるべくしないようにします。すなわち、明快
なロジックや参考文献のあるアルゴリズムを使い、一意名も適当なものを使いま
す。基本的に節に付ける看板以外のコメントは必要ありません。もちろん、必要
があるコメントは必ず付けなければなりませんが、説明がいらない場合はコメン
ト行は不要です。

節名も、適当で明快なものを使っていれば、看板の内容は空白でも構いませんが、
看板そのものは必ず付けて下さい。看板は節の前に付けます。

看板の右端は空けておきます。閉じてはいけません。

\begin{quote}\begin{verbatim}
【例】
     1   1   2   2   2   3   3   4   4   4   5   5   6   6   6   7
7----2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2
******************************************************************
*    これが看板です。
******************************************************************
 XXX-KOREGA-KANBAN-DESU  SECTION.
\end{verbatim}\end{quote}

\subsection{MOVEの規則}

項目値の設定にはMOVEのみが使用可能です。

同じ値や項目から同じUSAGEの複数の項目へ値設定する場合は、複数対象の
MOVEを使用します。ただし、USAGEの異なる項目の場合はUSAGE毎にMOVEします。

レコードのキーをMOVEする場合は、キーの順番にMOVEします。

\begin{itemize}
\item	MOVEの後ろは4カラム空ける
\item	TOは主体の書き始めから12カラム目から書きます。もし項目名が11カラ
		ム以上の場合は、4カラム単位に書き始めを広げます。
\item	TOの後ろは2カラム空けます。
\item	対象が複数ある場合は、対象毎に改行します。その場合、項目名の書き
		始めは前の行の対象項目名の書き始めに揃えます。
\end{itemize}

\begin{quote}\begin{verbatim}
【例】
     1   1   2   2   2   3   3   4   4   4   5   5   6   6   6   7
7----2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2
     MOVE    A           TO  B.
     MOVE    ZERO        TO  C1
                             C2.
     MOVE    1           TO  TB1-IDX-X.
     MOVE    TB1-ITEM(TB1-IDX-X) TO  WK1-ITEM.
\end{verbatim}\end{quote}

\subsection{COMPUTEの規則}

計算処理の基本はCOMPUTE命令です。ただし、剰余を求める必要がある場合に限
り、DIVIDE命令を使用します。いかなる場合でも、ADDやSUBやMULは使用禁止で
す。

\begin{itemize}
\item	COMPUTEの後ろは1カラムあけます。
\item	各演算子の前後は最低1カラムあけます。
\item	複雑な式になる場合は、項毎に改行します。その場合、+=は=に位置を
		合わせます。
\item	式の記述は素直に行います。極端な変形はしないこと。
\end{itemize}

\begin{quote}\begin{verbatim}
【例】
     1   1   2   2   2   3   3   4   4   4   5   5   6   6   6   7
7----2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2
     COMPUTE A = A + 1 .
     COMPUTE WK1-SEC = WK1-HH * 3600
                     + WK1-MM * 60
                     + WK1-SS.
     COMPUTE WK1-DUR = WK1-EHH * 3600
                     + WK1-EMM * 60
                     + WK1-ESS
                     - ( WK1-SHH * 3600
                       + WK1-SMM * 60
                       + WK1-SSS
                       ) .
     COMPUTE WK1-DUR = ( WK1-EHH - WK1-SHH ) * 3600
                     + ( WK1-EMM - WK1-SMM ) * 60
                     + ( WK1-ESS - WK1-SSS ) .
\end{verbatim}\end{quote}

なお、上に挙げた例のうち2番目のCOMPUTE WK1-DUR は、不可の例です。これは
数学的には正しい式ですが、ちょっと見た時に「おや？」と思わせるものがある
ためです。記述上の演算の回数は後のプログラムの方が少ないので、効率が良さ
そうですが、現代のコンパイラでは同じ効率のコード生成を行うはずです。

\subsection{DIVIDEの規則}

DIVIDEはDIVIDE〜BY〜GIVING〜REMAINDERの構文のみ使用可能です。

\begin{itemize}
\item	DIVIDEの後ろは2カラムあけます。
\item	BYは被除項目名の書き始めの12カラム目から書き始めます。BYの後ろは
		2カラムあけます。
\item	GIVINGは改行して、DIVIDEから4カラム下げて書きます。後ろは6カラム
		あけます。
\item	REMAINDERは改行してGIVINGと同じ位置から書きます。後ろは3カラムあ
		けます。
\item	GIVING,REMAINDERは省略してはいけません。
\end{itemize}

\begin{quote}\begin{verbatim}
【例】
     1   1   2   2   2   3   3   4   4   4   5   5   6   6   6   7
7----2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2
     DIVIDE  WK1-SEC     BY  3600
         GIVING      WK1-HH
         REMAINDER   WK1-RE.
     DIVIDE  WK1-RE      BY  60
         GIVING      WK1-MM
         REMAINDER   WK1-SS.
\end{verbatim}\end{quote}

\subsection{OPENの規則}

一般のプログラムが直接操作出来るファイルは順編成ファイルのみです。

\begin{itemize}
\item	OPENの後ろは4カラムあけます。
\item	同じ行にモードを書きます。
\item\label{item:3}	改行して、OPENから4カラム下げてファイル名を書きます。
\item	同じモードでオープンするファイルが複数ある場合に限り、
		\ref{item:3}を繰り返します。モードが異なる場合は改めてOPENから書きます。
\end{itemize}

\subsection{CLOSEの規則}

\begin{itemize}
\item	CLOSEの後ろには何も書きません。
\item	改行してCLOSEから4カラム下げて、ファイル名を書きます。
\item	ファイルが複数ある場合は2.を繰り返します。
\end{itemize}

\subsection{READの規則}

\begin{itemize}
\item	READの後ろは4カラムあけます。
\item	ファイル名を書きます。
\item	AT ENDを書く場合にはREADと同じ行でファイル名の書き始めから12カラ
		ム後にAT、さらに2カラムあけてENDを書きます。
\item	AT ENDの処理はREADより4カラム下げて書きます。ただしこの処理はフ
		ラグ制御程度にします。
\item	AT ENDがある場合はEND-READが必須です。
\end{itemize}

\subsection{WRITEの規則}

\begin{itemize}
\item	WRITEの後ろは3カラムあけます。
\item	同じ行にレコード名を書きます。
\item	FROM句を書く場合は、レコード名の書き始めから12カラム後ろから項目
		名を書きます。
\item	AFTER句を書く場合は、改行しWRITEから4カラム下げて書き始め、後ろ
		は3カラムあけます。
\item	BEFORE句は使用出来ません。
\end{itemize}

\begin{quote}\begin{verbatim}
【例】
     1   1   2   2   2   3   3   4   4   4   5   5   6   6   6   7
7----2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2
     OPEN    INPUT
         INP-FILE.
     OPEN    OUTPUT
         OUT-FILE
         REF-FILE.
     READ    INP-FILE    AT  END
         MOVE    FLG-TRUE    TO  FLG-END
     END-READ.
     WRITE   OUT-REC     FROM    INP-REC.
     WRITE   REF-REC     FROM    WK1-HEAD
         AFTER   2.
     CLOSE
         INP-FILE
         OUT-FILE
         REF-FILE.
\end{verbatim}\end{quote}

\subsection{IF〜ELSEの規則}

\begin{itemize}
\item	IFの後ろは10カラムあけて括弧でくくり、条件を書きます。
\item	THENは書きません。
\item	ブロックはIFより4カラム下げて記述します。
\item	ELSEはIFより2カラム下げて記述します。
\item	END-IFは必ず記述します。
\item	THENブロックのないELSEは使用出来ません。
\item	ネストレベルは3までにします。
\end{itemize}

\subsection{単純PERFORMの規則}

\begin{itemize}
\item	PERFORMの後ろ1カラムあけて節名を書きます。
\item	UNTIL等は記述してはいけません。
\end{itemize}

\subsection{内PERFORM UNTILの規則}

\begin{itemize}
\item	PERFORMを書き、
\item	改行を行ってから8カラム下げてUNTILを書きます。
\item	終了条件はUNTILの後ろ3カラムあけて括弧でくくって記述します。
\item	ブロックは4カラム下げて記述します。
\item	END-PERFORMは必ず記述します。
\end{itemize}

\subsection{内PERFORM VARYINGの規則}

\begin{itemize}
\item	PERFORMの後ろ1カラムあけてVARYINGを書きます。
\item	VARYINGの後ろ1カラムあけて制御項目名を書きます。
\item	制御項目名の書き始めから12カラム後ろにFROM句を書きます。
\item	FROM句の後ろ4カラムあけて初期値を書きます。
\item	初期値が数値の場合は4カラム、項目名の場合は12カラムの原則に従い
		BY句を書きます。
\item	その他の規則はPERFORM UNTILと同じです。
\end{itemize}

\subsection{EVALUATEの規則}

\begin{itemize}
\item	EVALUATEの後ろ4カラムあけて項目名を書きます。
\item	項目が複数ある場合は、12カラムの原則に従います。
\item	WHENは1行使用します。書き始めはEVALUATEから2カラム下げます。また、
		WHEN値は項目位置に揃えます。
\item	END-EVALUATEは必ず記述します。
\item	EVALUATEで、分岐出来ない条件があってはなりません。一般にWHEN
		OTHERが必要になります。
\end{itemize}

\subsection{EVALUATE TRUEの規則}

\begin{itemize}
\item	EVALUATEの後ろ4カラムあけてTRUEを書きます。
\item	WHEN条件はWHENの後ろ2カラムあけて括弧で括って記述します。
\item	その他の規則はEVALUATEと同じです。
\end{itemize}

\subsection{GOBACKの規則}

\begin{itemize}
\item	1モジュールに1つだけ書きます。
\item	条件文の中に書いてはいけません。
\end{itemize}

\subsection{条件式に関する規則}

\begin{itemize}
\item	条件は1行に1つ書きます。
\item	AND/ORは行の前に書きます。
\item	AND/ORは4カラムの原則に従います。
\item	条件のレベルが深くなれば、それに応じて4カラム単位に字下げします。
\item	全ての条件は括弧で括ります。
\item	括弧の位置はレベル毎に揃えます。
\item	無理な簡略化や、変形は行いません。元に意味がわかるような書き方にします。
\end{itemize}

\begin{quote}\begin{verbatim}
【例】
     1   1   2   2   2   3   3   4   4   4   5   5   6   6   6   7
7----2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2
 IF      (  A  =  B  )
     MOVE    1           TO  A
   ELSE
     MOVE    2           TO  A
 END-IF.
 IF      (    (  A  =  B  )
         AND  (   (  B  =  1  )
              OR  (  B  =  2  ) ) )
     PERFORM ARE
 END-IF.
 PERFORM
         UNTIL   (  FLG-EOF  =  FLG-FALSE  )
     PERFORM ITEM-SET
     PERFORM REC-WRITE
 END-PERFORM.
 PERFORM VARYING I           FROM    1   BY  1
         UNTIL   (  I  >  10  )
     COMPUTE J = A(I) + J
 END-PERFORM.
 EVALUATE    A
   WHEN      1
     PERFORM A-IS-1
   WHEN      2
     PERFORM A-IS-2
   WHEN      OTHER
     CONTINUE
 END-EVALUATE.
 EVALUATE    TRUE
   WHEN  (   (  A  =  1  )
         AND (  C  =  B  ) )
     PERFORM ACB
   WHEN  (   (  A  =  2  )
         AND (  C  =  D  ) )
     PERFORM ACD
   WHEN      OTHER
     CONTINUE
 END-EVALUATE.
\end{verbatim}\end{quote}

\subsection{特殊命令について}

DISPLAY以外の特殊命令はなるべく使用しないようにします。特にSORTや
SEARCH等の複雑な処理をする命令は使ってはいけません。

\begin{itemize}
\item	{\bf 使用制限のない命令}	\\
	DISPLAY
\item	{\bf 使用制限のある命令}	\\
	STRING		文字列操作のみ
	UNSTRING	文字列操作のみ
	INSPECT		文字列操作のみ
	ACCEPT		FROM DATEのみ
\item	{\bf 使用してはいけない命令}	\\
	SORT	\\
	SEARCH
\end{itemize}

\subsection{DISPLAYの規則}

\begin{itemize}
\item	DISPLAYの後ろが項目名なら5カラム、固定文字列なら4カラムあけます。
\item	DISPLAYする内容が、説明−値という対ならば5カラム、固定文字列なら
		4カラムあけます。
\item	UPON句は改行し、DISPLAYから4カラム下げて記述し、4カラムあけて出力
		先を書きます。
\end{itemize}

使用制限のある命令については特に構文等の説明は行いませんが、12カラムと
4カラムの原則に従って下さい。

\chapter{命名規則}\label{chap:meimei}

この章では、命名に関する規則の説明を行います。

\section{セクション名}

この規則では、手続き部の分割はセクションを単位に行います。段落では行いま
せん。

セクション名の構文は以下の通りです。

\begin{itemize}
\item	レベル番号−処理
\item	レベル番号−処理−対象
\item	レベル番号−処理−対象−補足説明
\end{itemize}

ここで、レベル番号とはエントリーセクションを000とし、000から呼ばれるセク
ションを100、200、100から呼ばれるセクションを110、120・・・と言ったよう
な番号のことです。

レベル番号の桁が足りなくなった場合は、ハイフンで区切り3桁単位で桁を追加
します。

\begin{quote}\begin{verbatim}
000
    100
        110
            111
            112
            113
        120
            121
            122
        130
    200
        210
        220
            221
            222
            222-100
            222-200
    300
        310
        320
    400
\end{verbatim}\end{quote}

  構造に関する説明は後の章で説明します。

  また、オンラインモジュールに関しては以下の番号を使用して下さい。

\begin{verbatim}
    100	遷移時の初期化
    200 復帰時の処理
    300 キー入力時の処理
    600 表示のための処理
    700 共通処理
    800 DBやファイルのアクセス
    900 エラー処理
\end{verbatim}

処理名等で使用する単語は、基本的に英語のフルスペルを使用すること。ローマ
字はやむおえない場合以外は使用してはいけません。常識的な略語を使うことは
構いません。

\section{項目名}

項目名の構文は以下の通りです。

\begin{itemize}
\item	{\bf ○○○}	\\
	01レベルに限ります。
\item	{\bf ○○○−○○○}	\\
	レコード名−項目名\\
	属性名−項目名
\item	{\bf ○○○−○○○−○}	\\
	レコード名−項目名−接尾語\\
	属性名−項目名−接尾語
\end{itemize}

属性名は\ref{table:1}のものが既定です。

\begin{center}
\begin{table}[ht]
	\begin{tabular}{|l|l|}\hline
	属性名	&	意味					\\	\hline\hline
	TB?		&	テーブル				\\	\hline
	ED?		&	編集用項目				\\	\hline
	PRM		&	受け取りパラメータ		\\	\hline
	PR?		&	受け渡し｝ラメータ		\\	\hline
	CD?		&	コードテーブル			\\	\hline
	FLG		&	フラグ					\\	\hline
	SPA		&	SPA領域					\\	\hline
	SCR		&	ユーゞー入力データ		\\	\hline
	SCW		&	画面出力データ			\\	\hline
	WRK		&	一般ワーク				\\	\hline
	IDX		&	インデクス				\\	\hline
	CST		&	定数					\\	\hline
	CNT		&	カウンタ				\\	\hline
	CTL		&	コントロールコード		\\	\hline
	\end{tabular}
\caption[属性名]{属性名}
\label{table:1}
\end{table}
\end{center}

接尾語は\ref{table:2}のものが既定です。ただし、文脈から明白な場合の記述
は必要ありません。

\begin{center}
\begin{table}[ht]
	\begin{tabular}{|l|l|}\hline
	接尾語	&	意味					\\	\hline\hline
	X		&	Xタイプ項目				\\	\hline
	N		&	日本語項目				\\	\hline
	9		&	9タイプ項目				\\	\hline
	I		&	アイテム				\\	\hline
	E		&	編集タイプ				\\	\hline
	T		&	テーブル				\\	\hline
	Y,LINE	&	行						\\	\hline
	SET		&	初期値設定				\\	\hline
	R		&	再定義					\\	\hline
	\end{tabular}
\caption[接尾語]{接尾語}
\label{table:2}
\end{table}
\end{center}

\chapter{モジュール構造}

\section*{はじめに}

規約ではないですが、プログラムを書く際の意思統一を図るために必要なことと
して、モジュールの構造があります。このモジュール構造に対する十分な考察こ
そが、わかり易くメンテナンスを行い易いプログラムの作成に重要な事柄である
と言っても過言ではありません。また、「構造化プログラミング」とはプログラ
ムをモジュールと捉えてプログラムすることにほかなりません。　この章では、
モジュールの構造に関する考察を行います。

\section{基本概念}

プログラム構造を考える時に、以下の基本概念があります。

\begin{itemize}
\item	step (statement)
\item	block
\item	module
\item	routine
\item	function
\item	procedure
\end{itemize}

以下の節で、これらの言葉の意味を説明します。

\subsection{step (statement)}

プログラムを構成する最小の単位です。普通COBOLでは単純に行と対応されます
が、厳密に言うなら動詞を基準として数えます。

\subsection{block}

１つ以上のstepの集まりで、処理の流れが一つの入口と一つの出口で表現される
ものです。内部で分岐するのは構いません。

\begin{quote}\begin{verbatim}
【例】
     1   1   2   2   2   3   3   4   4   4   5   5   6   6   6   7
7----2---6---0---4---8---2---6---0---4---8---2---6---0---4---8---2
     IF          (  A  =  10  )             ------------(1)
         MOVE    A           TO  B          ------------(2)
         MOVE    1           TO  A          ------------(2)'
       ELSE
         PERFORM                            ------------(3)
                 UNTIL   (  A  =  10  )
             IF      (  B  =  2  )          ------------(4)
                 MOVE    5           TO  C  ------------(5) (5)'
             END-IF                         ------------(4)'
             PERFORM DDD                    ------------(6) (6)'
         END-PERFORM                        ------------(3)'
     END-IF.                                ------------(1)'
\end{verbatim}\end{quote}

このの例で、同じ番号（(1)と(1)'のように）の対をとるとblockになっています。
1stepでもブロックになりますし、内部で分岐していても構いません。ただし、
入口と出口は各々1つづつでなくてはなりません。

\subsection{module}

システムの構成要素に対する一般的な呼び名です。例えばハードウェアの部品等
もmoduleと呼ばれます。

構造化されたmoduleは、より下位のmoduleを組み合わせて構成されています。

\subsection{routine}

決められた処理を行うmoduleの一般的な呼び方です。普通はある処理の中から呼
び出して使用することが可能です。

COBOLを例にとると、

\begin{itemize}
\item	SECTION
\item	段落
\item	他のプログラム
\end{itemize}

等は、routineです。

\subsection{function}

プログラムモジュールの内、以下の機能を目的として作られたものを言います。

\begin{itemize}
\item	言語仕様の補間
\item	環境の差異の吸収
\item	処理のまとめ
\end{itemize}

すなわち、機能がはっきりしていてプログラムの構造を考える際にstepと同じよ
うに考えることの出来るもので、機能だけに着目して使用出来るものを言います。

１例を挙げるなら、「ファイルを読んでAT-ENDならフラグを立てる」と言う機能
を持つSECTIONや、「日付から曜日を算出する」外部プログラムはfunctionです。

\subsection{procedure}

プログラムモジュールのうち、以下の機能を目的とするものを言います。

\begin{itemize}
\item	プログラム機能を分割した要素
\item	他のprocedureの補助を行うモジュールで、functionでないもの
\end{itemize}

すなわちprocedureは単なる機能モジュールと言う意味の他に、プログラムの構
成要素と言う色合いが濃いです。

\section{procedureの設計}

前節の説明から、プログラムの構成要素として深い考察の必要なものは
procedureであると言うことはわかったと思います。そこでこの節では
procedureをデザインする際に注意すべき事柄を説明します。

\subsection{構造}

ごく一般論として、構造は簡単な程理解は容易です。また、一度に把握するべき
事柄は少ない程把握するのは容易です。ですから、プログラムの構造を考える時
にも、このことは十分留意して行う必要があります。

一般にプログラムの構造は、以下の２つに分類されます。

\begin{itemize}
\item	{\bf 階層構造}	\\
	上位モジュールは自分に属する下位モジュールのみを呼び出します。
\item	{\bf 網型構造}	\\
	モジュールは相互に自由に呼び出します。
\end{itemize}

一長一短ありますが、一般には階層構造が望ましいとされています。以下に階層
構造の利点を書くと、

\begin{itemize}
\item	１つのモジュールを考える際に、自分とその下位モジュールだけを考え
		れば良いので、一度に把握する事柄が少なくて済む。
\item	モジュールを変更する際に、影響をあたえるモジュールが少なくて済む。
\item	モジュールの設計において、段階的詳細化の手法が利用出来る。
\end{itemize}

また網型構造の不利な点を挙げると、

\begin{itemize}
\item	モジュールの関連が複雑になるので、ロジックを追い難い。
\item	モジュールの変更が広い範囲に影響をあたえやすい。
\end{itemize}

しかし、階層構造にも不利な点があって、

\begin{itemize}
\item	冗長なコードになりやすい。
\item	階層が深くなりやすい。
\end{itemize}

いくつかの不利な点はありますが、そのリスクを負っても利点の方が大きいので、
階層構造を推奨します。実際には、procedureは階層構造にして、functionを活
用するような設計を行えば、階層構造の欠点をカバーすることが可能です。

\subsection{相互依存関係}

相互依存が少ない方が設計も修正も行い易いため、モジュールは出来る限り各々
の動作は独立している方が良いです。

モジュール間の依存を低くするには「入力と出力が独立で、実行時に副作用がな
い」ようにすることが重要です。しかし、COBOLと言う言語は主にファイル等の
処理を行うもので、また関数と言う概念が存在しないので、副作用の全くない
procedure設計は不可能ですし、入力と出力を完全に独立にすることは困難です。
それでも、出来る限り相互依存はなくすべきですし、またある程度はそれも可能
です。

モジュール間の依存を少なくするために、以下のことを禁止します。

\begin{itemize}
\item	親モジュールの知らないデータを子モジュールでやりとりすること。
\item	フラグやスイッチの多用。
\item	一度に処理すべきことを無理にモジュール分割すること。
\item	他のモジュールの副作用を勝手に使用すること。
\item	モジュールの実行順序に強く依存すること。
\end{itemize}

これらのことは極力避ける必要があります。

\subsection{機能}

良いprocedureを設計するには、どのprocedureでどんな処理を行うかと言うこと
の考察が重要です。少なくとも以下のことには留意しましょう。

\begin{itemize}
\item	{\bf 単機能に努める}	\\
	モジュールの機能を説明する際に、一言で説明出来る程度の機能でなくれは
	なりません。機能を説明する際に接続詞が必要であってはいけません。
\item	{\bf 例外に注意する}	\\
	例外データが入った場合の処理に注意します。もし出来れば例外データは
	別処理にするのではなく、例外データそのものを気にせずに処理が流れるの
	が望ましいです。また、このようにすればテストの効率や信頼性を上げるに
	に役立ちます。
\item	{\bf バグが目立つようにする}	\\
	異常データが入って来た場合は、なるべく障害が{\bf 起こるよう}に作成し
	ます。こうすると他のモジュールのバグが発見しやすくなります。
\item	{\bf 速度を稼ぐ場合はアルゴリズムを工夫する}	\\
	もし処理が遅かった場合は、コーディングを工夫するのではなく、アルゴリ
	ズムを工夫して速度を稼ぐべきです。
\end{itemize}

\chapter{その他}

以下では、今まで説明しなかったことをまとめて説明します。

\section{コーディング上の注意事項}

\subsection{コピー句の活用}

同じようなコードが必要になった場合は、コピー句の活用を考えましょう。似た
ものを複数管理するよりは、１つだけ管理する方がはるかに楽です。

例えば、

\begin{itemize}
\item	DB関係の処理
\item	オンラインの処理振り分け
\item	中間ファイルのレイアウト
\end{itemize}

等はコピー句にするべきです。

\subsection{いらないものは消す}

古いコードやデータは積極的に消すようにしましょう。無用な混乱をなくすため
です。また、大規模な修正が必要なプログラムは最初からコーディングし直した
方が良い場合も多いです。

\end{document}
