![]() |
定数の定義は,定数クラス(定数定義クラス)に集約するのが一般的である。JavaやC++では,例えば図1のように定数クラスを実装する。
【Javaの場合】
public class Construct {
public static final int MY_CODE = 100;
}
【C++の場合】
class Construct {
public
static const int MY_CODE = 100;
}
定数クラスについての指針は,アプリケーション開発指針などに簡潔に記されていることが多い。大規模プロジェクトであるにもかかわらず,役割や目的に応じた定数クラスの分割方針が示されず,単に「定数に関しては,分散しないよう定数専用のクラスを用意する」などと記されている場合は,一つの定数クラスに全定数の定義が集中し,巨大な定数クラスができ上がってしまう。
実装者の作業効率が悪化する
通常,定数クラスの利用者となるプログラマが必要とする定数は,一つないし数個に限られる。プログラマが,図2のような巨大な定数クラスから,必要な定数を探すことを想像してほしい。
【Javaの場合】
public class Construct {
/** 処理結果コード : 対象なし */
public static final int NOT_FOUND = -1;
/** 処理結果コード : 正常 */
public static final int SUCCESS = 0;
/** 応答メッセージ : 変更なし */
public static final String NOT_CNANGE = "Not change.";
/** 応答メッセージ : 変更あり */
public static final String UPDATED = "Updated.";
/** 処理オプション : 通常 */
public static final int NORMAL_OPT = 100;
/** 処理オプション : 拡張 */
public static final int SPECIAL_OPT = 101;
・・・(以下,さまざまな定数の定義が延々と続く)・・・
}
プログラマは,開発支援ツールにもっぱらIDE(統合開発環境)を用いている。IDEには,プログラミング作業を効率よく実施できるよう,コード・アシスト機能(入力を補完したり,入力候補を提示したりする機能)が備わる。ところが,定数クラスが巨大だと,コード・アシスト機能によって膨大な入力候補群が表示される。その中から適切な定数を選ぶのは難しく,作業効率が大きく落ち込んでしまう。
定数クラスを分割する
本来,定数クラスを設ける目的は,多様な定数を定数クラスに整理することにある。「ごった煮」状態の巨大な定数クラスは,あるべき姿ではない。定数クラスは,機能や目的ごとに,適切なサイズになるように分割するのが正しい。先に示した巨大な定数クラスの場合は,例えば「処理結果コード」「応答メッセージ」「処理オプション」などに分類するとよいだろう。
筆者が以前携わったプロジェクトでは,顧客区分などのコード分類ごとに,独立した定数クラスを作成するという方針が示された。そこで,必要とされる定数クラスを設計書から洗い出し,自動生成するツールを作った。大規模プロジェクトにおいては,設計書から自動的に定数クラスを生成するという考え方は分かりやすく,定着しやすいと思う。
定数クラスの作成粒度と並び,クラス名や定数名のネーミングも重要だ。ある分類基準に従って定数クラスを分割したとしても,各定数クラスにどのような定数が集まっているのかがクラス名から推察できないと,クラスを分割した意味が薄れてしまう。
分割指針を早期に打ち立てる
適切なサイズになるように定数クラスを分割する作業を,開発工程の途中で実施するのは現実的でない。プロジェクト・メンバーの混乱を招くからだ。
定数クラスの分割指針は,設計工程の初期に決定するのが望ましい。遅くとも,開発工程に入るまでには,打ち立てる必要がある。方針を決定したらアプリケーション開発指針などに明記し,プロジェクト・メンバーに周知しよう。
NTTデータ 法人システム事業本部 モバイルビジネス事業部
(シニアITスペシャリスト ソフトウェアアーキテクチャ)