Hogeや山田太郎といったメタ構文変数の改善

Self-Describing Value

 プログラミングやテスト実装ではしばしばhogeや山田太郎、山田花子、といったメタ構文変数が使用されます。ただ「Literal value(xUnitTestPatterns読書会)」でも触れましたが、こうしたメタ構文変数は一工夫で可読性や保守性をより向上できる場合があります。
 例えば以下のテストコードを見てみます。

UserList userList;
userList.add("山田太郎");//名前はダミー
EXPECT_EQ(1, userList.size());

 上記の「"山田太郎"」は、userListのサイズを1にするためのダミーで、どのような値をとっても構わないものとします。こうした場合は、以下のように意味や目的を値そのもので表現するとわかりやすくなることがあります。

UserList userList;
userList.add("size()をインクリメントするためのダミー氏名");
EXPECT_EQ(1, userList.size());


 また以下の様な例を考えます。

EXPECT_EQ(false, InputPassword::check("hoge hoge"));//スペースを含む無効な入力
EXPECT_EQ(false, InputPassword::check("hoge/hoge"));//記号を含む無効な入力
EXPECT_EQ(false, InputPassword::check("hogehoge"));//正常な入力

 これも以下のようにするとコメントがなくても意味が読み取れるようになります(一応、日本語にしているのはあくまで解説例としてわかりやすくするためです)。またこうした改善は可読性だけでなく、テスト結果の表示をよりわかりやすくする効果も持ちます。

EXPECT_EQ(false, InputPassword::check("スペースを含む 無効な入力"));
EXPECT_EQ(false, InputPassword::check("記号を含む/無効な入力"));
EXPECT_EQ(false, InputPassword::check("正常な入力"));

 なおこの値や文字列で自らの目的や意味を説明するテクニックは、xUnit Test Patternsにて「Self-Describing Value」と呼ばれています。

Self-Describing Value以外のテクニック

 「Self-Describing Value」でなくてもメタ構文変数を改善できる場合があります。
 例えば以下を考えます

EXPECT_EQ(4, Length("hoge"));
EXPECT_EQ(14, Length("piyo fuga"));

 こうしたものはいっそのこと以下のようにすると、場合によっては読みやすくなります。

EXPECT_EQ(4, Length("1234"));
EXPECT_EQ(14, Length("123456789"));


 また以下の例を考えます。

EXPECT_EQ(true, passwordCheck("hogehoge5"));
EXPECT_EQ(false, passwordCheck("hogehoge"));

 ここで何かしらの都合でSelf-Describing Valueが使いにくい場合は、以下のようにシンボルでわかりやすい名前をつけると可読性が上がることがあります。

string validPassword = "hogehoge5";
string invalidPassword = "hogehoge";

EXPECT_EQ(true, Check(validPassword));
EXPECT_EQ(false, Check(invalidPassword));

まとめ

 メタ構文変数は気軽に使える便利な道具です。ただ気軽に使える分、よく考えずに使用して改善や工夫の余地を見落とすことも少なくありません。なので「hoge」や「山田太郎」といった値を使いたくなったら、Self-Describing Valueやその他工夫で改善できないか、一瞬でも良いので考えてみると良いかもしれません。