楽観ロックのつぶやき

皆さんのおそばに一言添えたい。

変数の宣言

 Javaにおいては変数の宣言下記のようにするのだと思います。
int number;
char str[5];  とか string str;
 私はコボリストなので、COBOL85なら次のようにします。
000001 01  NUMBER PIC 9(5).
000002 01  STR    PIC X(5).
 COBOLの場合、数字項目は9タイプで、5桁というようにその数の桁数を指定します。そうするとメモリ上に5バイトメモリが確保されます。5桁なので、表現できる数は0 ~ 99999までとなります。
 英字項目はXタイプと宣言し、5桁と指定すればメモリ上に5桁の場所が確保されます。ASCIIコードで表示すると16進表示で、00001なら「3030303031」、99999なら「3939393939」と表示されます。
 Java等であれば、integerであれば、メモリ上には32bit(4バイト)確保され、表現できる数は-2147483648 ~ 2147483647となるのですよね。同じく16進で表示するなら、1は「00000001」と99999は「0001869F」となるわけです。
 ※ここまで良いですか。日頃皆さんメモリ上でどうなっているか想像してないでしょうね。
 COBOLでは9タイプと宣言した変数は計算に使うことができます。必然的に9タイプで宣言した変数には、0(0x30)~9(0x39)のコードしかはいるはずはありません。しかしプログラムのミスで、そこに英字を代入してしまうことがあります。そうすると「不正十進」というエラーを起こして、プログラムは止まってしまいます。COBOLはerrorのcatchなどないのでおしまいです。
 ここで皆さんにお伝えしたいのは、数字という項目でも計算で使うことのない変数であれば、英字(StringやXタイプ)で宣言すべきである、ということです。私が新人の時に先輩から教わりました。
 なんなら、Stringで宣言しておいて、計算で使いたくなったら型変換して使えば良いと思います。COBOLならXタイプを9タイプにREDEIFINEして使う、という感じ。
 その場合のメリデメは下記の通りです。
メリット
・社員番号のコードで、構内請負作業者を識別するために頭にAをつけることにした、といった場合の影響なし。
・最後の一桁はチェックディジットだと言われた時に、取り出しやすい。
デメリット
・扱う数字や文字列の桁数を意識しておく必要がある
 ※Stringのような参照型なら意識してないでしょ。
・大きな数字を取り扱う時、メモリの消費が多くなる(intの最大値2147483647はintでは4バイトのところを文字で扱うならcharで10バイト必要
 ※メモリ使用量なんて皆さん気にしてコーディングしてないでしょ。。。

 結局デメリットとかもないので、『計算で使わないなら文字列』は黄金の法則なのかも知れません。

#細かいところ間違ってても気にしないでね。
COBOL使いの人達、懐かしいでしょ。