コントローラに分岐を増やす前に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更新処理
}