ユーザーが2つのaspxページでフォームを使用して顧客オブジェクトの値を入力する例を考えてみましょう。最初のアプローチでは、両方のaspxページは、IDが0より大きく、FirstNameがコンストラクタを呼び出す前に空でないことを検証する必要があります。 2番目のオプションでは、両方のページが検証機能を呼び出し、エラーメッセージをユーザーに表示できます。例外をスローするのは良い方法ですか?
上記の例に基づいて、私は第2の選択肢を好む。しかし、私がWeb上で研究しているときには、例外をすぐにスローし、オブジェクトに無効なデータを受けさせないようにすることが、よりオブジェクト指向であることが分かり続けます。以前の例外と同様に、このコンストラクタを呼び出すすべてのページは、入力が有効であることを検証する必要があります。私は論理を繰り返すのが好きではないので、私は第二の選択肢を好む。
ドメインドリブンデザインではどのような選択肢がありますか? 1
public class Customer{
public int ID { get; set; }
public string FirstName { get; set; }
public Customer(int ID, string FirstName){
if (ID < 0)
throw new Exception("ID cannot be less than 0");
if (string.IsNullOrEmpty(FirstName))
throw new Exception("First Name cannot be empty");
this.ID = ID;
this.FirstName = FirstName;
}
}
オプション2
public class Customer{
public int ID { get; set; }
public string FirstName { get; set; }
public Customer(int ID, string FirstName){
this.ID = ID;
this.FirstName = FirstName;
}
public List<string> Validate(){
List<string> ErrorMessages = new List<string>();
if (ID < 0)
ErrorMessages.Add("ID cannot be less than 0");
if (string.IsNullOrEmpty(FirstName))
ErrorMessages.Add("First Name cannot be empty");
return ErrorMessages;
}
}
DDDは例外処理とは関係ありません。前者は_言語ニュートラルなデザインに関係していますが、後者は実装上の問題です – MickyD