動作環境
C++ Builder XE4
Windowsソフトの実装において、コンポーネント名L_001, L_002, L_003など、自動的にインデックスを増加させながら表示したい項目があったとする。
処理としては以下のようなものを実装している。
float val;
for (int di=0; di < SMR_CALIB_XXX; di++) {
val = line->Strings[SMR_XXX + di].ToDouble();
name = L"L_" + IntToStr(measStat) + L"0" + IntToStr(di);
p = (TLabel*)FindComponent(name);
if (p != NULL) {
switch(SMR_XXX + di) {
default:
p->Caption = UnicodeString().sprintf(L"%.1f", val);
break;
case SMR_XXX:
case SMR_YYY:
case SMR_ZZZ:
case SMR_VVV:
p->Caption = UnicodeString().sprintf(L"%.1f", val);
break;
}
}
p = NULL;
}
name = L"L_" + IntToStr(measStat) + L"0" + IntToStr(di);
により
L_001
,L_002
,...L_008
などの名前を取得している。
問題点
- 2年後にこのコードを変更することになった
- L_001...L_008の部分から1つ項目を消すことになった
関連コードを探そうにもL_00Xで検索しても引っかからない。
5秒で該当場所にたどれない。
対応
案1. コメントを追加する
/* L_001などの項目を代入する */
L_001で検索時に5秒で見つかる。
将来の自分に感謝されるかも。
「コードの意図」を残しておく。
別案: ソース分割をうまくやっておく。2年後にそのソース構造を覚えていたら探しやすいかも。自分は記憶力が悪いので、たぶんソース構造は忘れているだろう。
別案: ソース構造のドキュメントを残す。ソースを変更のたびにそのドキュメントを更新する、というのをきちんとする限りは有効。