オブジェクトの初期化を中止するには、コンストラクタに例外をスローします。無効な入力を拒否することをお勧めします。
public class User
{
public User(String name) {
if (String.IsNullOrWhiteSpace(name)) {
if (name == null) {
throw new System.ArgumentNullException("Cannot be null.", "name");
}
else {
throw new System.ArgumentException("Cannot be empty.", "name");
}
}
}
}
コンストラクタで定義したいビジネスロジックは、そこに収まりません。コンストラクターは、軽量でインスタンス化する必要があります。一部のデータソースを照会するのは、コンストラクターにとって高価すぎます。このため、代わりにファクトリパターンを使用する必要があります。ファクトリパターンを使用すると、呼び出し元はオブジェクト作成に伴う重労働が予想されることがあります。
public class User
{
private User(String name) {
if (String.IsNullOrWhiteSpace(name)) {
if (name == null) {
throw new System.ArgumentNullException("Cannot be null.", "name");
}
else {
throw new System.ArgumentException("Cannot be empty.", "name");
}
}
}
public static User CreateUser(String name) {
User user = new User(name); // Lightweight instantiation, basic validation
var matches = allUsers.Where(q => q.Name == name).ToList();
if(matches.Any())
{
throw new System.ArgumentException("User with the specified name already exists.", "name");
}
Name = name;
}
public String Name {
get;
private set; // Optionally public if needed
}
}
あなたは工場出荷時のパターンは、より良いフィット、それは方法だから呼び出し側はそれを呼び出すことによって起こっていくつかの仕事があると期待するかもしれないことがわかります。コンストラクタを使用すると、軽量であると予想されます。
コンストラクタルートに移動する場合は、データソースへの実際の挿入が試行されたときなど、ビジネスルールを強制する他の方法を試してみることをお勧めします。
public class User
{
public User(String name) {
if (String.IsNullOrWhiteSpace(name)) {
if (name == null) {
throw new System.ArgumentNullException("Cannot be null.", "name");
}
else {
throw new System.ArgumentException("Cannot be empty.", "name");
}
}
}
}
public class SomeDataSource {
public void AddUser(User user) {
// Do your business validation here, and either throw or possibly return a value
// If business rules pass, then add the user
Users.Add(user);
}
}
強引な方法で、オブジェクト – RhysW
を削除これは単なるサンプルコードであってもよいが、場合には、それはない、ヌルフィールドを持つオブジェクトを追加し、nullにすべてのフィールドを設定します。あなたはどれ 'に述語を供給することができます'だから、あなたは' Where'を通過する必要はありません。 –
@BrianRasmussenどちらもまったく同じ結果になるので、あなたが使う個人的な好みです。一方、 'ToList'呼び出しは' Any'の短絡がクエリ全体を評価しないようにします。 – Servy