ガード節による入れ子条件記述の置き換え
if – elseが入れ子になって正常系が分かりづらい場合は、「ガード節による入れ子条件記述の置き換え」のリファクタリングを行います。
たとえば会員管理の登録処理で「住所、氏名は必須入力。男性は年収が必須入力、女性は趣味が必須入力」という仕様があったとします。
そこで以下のような登録判定のメソッドを作ったのですが、かなり分かりづらいですね。
// 登録できるかを判定します
private bool CanRegister()
{
// 住所が空の場合
if (string.IsNullOrEmpty(AddressTextBox.Text) == true)
{
return false;
}
else
{
// 氏名が空ではない場合
if (string.IsNullOrEmpty(NameTextBox.Text) == false)
{
// 男性の場合
if (MenRadioButton.Checked == true)
{
// 年収が空の場合
if (string.IsNullOrEmpty(AnnualIncomeTextBox.Text) == true)
{
return false;
}
else
{
return true;
}
}
else
{
// 趣味が入力されている場合
if (string.IsNullOrEmpty(HobbyTextBox.Text) == false)
{
return true;
}
}
}
}
return false;
}
それでは「ガード節による入れ子条件記述の置き換え」を試してみましょう。
●
リファクタリング後のコード
// 登録できるかを判定します
private bool CanRegister()
{
// 住所が空の場合
if (string.IsNullOrEmpty(AddressTextBox.Text) == true)
{
return false;
}
// 氏名が空の場合
if (string.IsNullOrEmpty(NameTextBox.Text) == true)
{
return false;
}
// 男性の場合
if (MenRadioButton.Checked == true)
{
// 年収が空の場合
if (string.IsNullOrEmpty(AnnualIncomeTextBox.Text) == true)
{
return false;
}
}
else
{
// 趣味が空の場合
if (string.IsNullOrEmpty(HobbyTextBox.Text) == true)
{
return false;
}
}
return true;
}
異常系である「住所が空」と「氏名が空」はガード節を用いて最初に「return false」しています。
次に男性の場合は「年収が空」をガード節を用いて「return false」、女性の場合は「趣味が空」をガード節を用いて「return false」、最後に残った正常系で「return true」を返しています。
ここで重要なのは「ガード節は異常系や特殊系に適用し、elseは記述しない」。男性・女性のように「どちらも正常系の場合はelseを記述する」ことです。
elseを記述することで、後からコードを読む人に「どちらの事象も等しく発生する」ことを伝えることができます。
コメントはまだありません。