ガード節を用いるメリット
私は「ガード節による入れ子条件記述の置き換え」がもっとも重要なリファクタリングだと考えています。
理由は「保守性が向上し仕様変更に対応しやすく」なるからです。
以前にも書きましたが、コードを保守する人は「この場合はどう動くのか?」にスコープを当てて追いかけます。ガード節で適宜returnしてあげると、それ以上無駄なコードを読む必要がなくなりますので保守性が向上します。
次に仕様変更への対応ですが、たとえば会員管理の登録処理で「住所、氏名は必須入力。男性は年収が必須入力、女性は趣味が必須入力」という仕様から、「住所は男性のみ必須にする」という変更が入ったとします。
●
仕様変更前のコード
// 登録できるかを判定します
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;
}
●
仕様変更後のコード
// 登録できるかを判定します
private bool CanRegister()
{
// 氏名が空の場合
if (string.IsNullOrEmpty(NameTextBox.Text) == true)
{
return false;
}
// 男性の場合
if (MenRadioButton.Checked == true)
{
// 住所が空の場合
if (string.IsNullOrEmpty(AddressTextBox.Text) == true)
{
return false;
}
// 年収が空の場合
if (string.IsNullOrEmpty(AnnualIncomeTextBox.Text) == true)
{
return false;
}
}
else
{
// 趣味が空の場合
if (string.IsNullOrEmpty(HobbyTextBox.Text) == true)
{
return false;
}
}
return true;
}
コードがリファクタリングされていたため、「住所のガード節」を男性の条件分岐の下に移動するだけで対応することができました。
このようにリファクタリングされたコードは、仕様変更への対応を容易にしてくれます。
コメントはまだありません。