コントローラに分岐を増やす前にExecute-CanExecuteパターンでドメイン側に決定権を委譲する

Badなケース

コントローラでドメインのプロパティを見て、決定を下すのはBadパターン。 ドメインの知識がコントローラに漏れ出している。

public string ChangeEmail(int userId, string newEmail)
{
  object[] userData = _database.GetUserById(userId);
  User user = UserFactory.Create(userData);
  
  if (user.IsEmailConfirmed) // コントローラで決定を下してしまっている
    return "Can't change a confirmed email";

  // …
}

Goodなケース

ドメインクラスにCanExecute/Executeパターンを適用する。 これによってコントローラは前提条件を確認せずそのままChangeEmailを実行することができる。

public string CanChangeEmail()
{
  if (IsEmailConfirmed)
    return "Can't change a confirmed email";

  return null;
}

public void ChangeEmail(string newEmail, Company company)
{
  Precondition.Requires(CanChangeEamil() == null);

 // …Email更新処理
}

Precondition