導入:なぜデータの「書き換え禁止」が重要なのか
メインフレームのCOBOLやPL/Iといった言語で開発をしていると、消費税率や支店コード、システム定数といった「絶対に途中で変わってはいけない値」を扱う機会が多くあります。もし、プログラム内の予期せぬ場所でこれらの値が誤って書き換えられたらどうなるでしょうか。計算結果が狂い、最悪の場合、売上の集計や基幹業務に甚大な影響を及ぼします。
今回紹介する「NONASSIGNABLE(読み取り専用)」属性は、そうした人為的なミスをコンパイラに検知させ、未然に防ぐための強力な武器です。
基礎知識:NONASSIGNABLE属性とは?
この属性は、変数の値を「初期化時以外は代入不可」に制限するものです。
通常、変数はプログラムの進行とともに値が変化することを前提としていますが、ビジネスロジック上の「不変の値(定数)」は、変化しないことが保証されている必要があります。この属性を付与することで、コンパイル時に「代入不可」というフラグが立てられ、もしプログラムのどこかで値を変更しようとすると、コンパイラがエラーを出して止めてくれます。これは、現代のJavaにおける「final」修飾子と同じ役割を果たす、非常に重要な防御的プログラミングの手段です。
実装・解決策
実装は非常にシンプルです。変数を宣言(DCL)する際に、属性として付与するだけです。これにより、プログラムの可読性が上がるだけでなく、コンパイラが「この値は変わらない」と認識するため、最適化(性能向上)のヒントにもなります。
サンプルプログラム
以下のサンプルはPL/I形式を想定したコードです。
/ 読み取り専用の定数宣言 /
DCL TAX_RATE FIXED DEC(4,2) NONASSIGNABLE INIT(0.10);
/ 通常の変数宣言 /
DCL SALES_AMOUNT FIXED DEC(10,0);
DCL TOTAL_PRICE FIXED DEC(12,0);
/ 処理開始 /
SALES_AMOUNT = 1000;
/ OK: 読み取ることは問題ありません /
TOTAL_PRICE = SALES_AMOUNT (1 + TAX_RATE);
/ NG: ここで値を書き換えようとすると、コンパイル時にエラーが発生します /
/ TAX_RATE = 0.15; <-- この行を書くとコンパイルエラーとなります /
応用・注意点
現場で活用する際のポイントをいくつか挙げます。
1. 再代入の明確化
「この変数は定数なのか、それとも途中で変わる変数なのか」を一目で判別できるため、コードの可読性が飛躍的に向上します。特に大規模な保守開発では、仕様書を見ずとも変数の性質が分かるため、バグ混入のリスクを下げられます。
2. Java移行への布石
将来的にメインフレームの資産をJavaなどのオープン環境へ移行する際、NONASSIGNABLE属性を付与していたデータは、そのまま「private static final」定数として変換できます。設計意図をコードに埋め込むことは、将来の資産継承においても非常に有利です。
3. 注意点
当然ですが、プログラムの実行中に動的に値が変わるべき変数には決して使用しないでください。あくまで「システム全体で不変」であるべきパラメータに限定して使用することが、この属性を賢く使うコツです。

コメント