考虑一个示例,其中用户使用两个aspx页面中的表单为客户对象输入值。使用第一种方法时,两个aspx页面都需要在调用构造函数之前先验证ID大于0,并且FirstName不为空。使用第二个选项,两个页面都可以调用Validate函数,并向用户显示错误消息。
基于以上示例,我更喜欢第二种选择。但是,当我在网络上进行研究时,我不断看到它是面向对象的,可以立即引发异常,而不是让对象接受无效数据。就像我前面提到的例外一样,每个调用此构造函数的页面都需要验证输入是否有效。我不喜欢重复逻辑,所以我更喜欢第二种选择。
就域驱动设计而言,首选的选项是什么?
选项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;
}
}
我相信这个问题已经在其他地方得到了回答。但是,这里还有一些其他链接可供阅读:
在“实用程序员”一书中,与使用例外有关的最大问题是“什么是例外?”。
在该部分中,我引用:
...异常应该很少用作程序正常流程的一部分;应该为意外事件保留异常。
尽管在您的情况下是否使用异常是有争议的,但我会说不-因为您可能需要捕获一个请求中所有可能的输入错误,并在表单上反映出来,以便用户更正这些值。
现在我想起来了,是的,您应该在这里使用异常。这就是防御性编码的方式。如果您已经期望将有效的参数传递给Customer
该类,则该代码应引发异常,以防止对该类的无效使用(例如,例如,由另一个程序员使用)。在这种情况下,您应该有另一个输入验证器,以在到达Customer
类之前验证用户对应用程序的输入。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句