关闭。这个问题是opinion-based .它目前不接受答案。
想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.
5年前关闭。
Improve this question
考虑一个示例,其中用户使用两个 aspx 页面中的表单为客户对象输入值。对于第一种方法,在调用构造函数之前,两个 aspx 页面都需要验证 ID 是否大于 0 并且 FirstName 不为空。使用第二个选项,两个页面都可以调用 Validate 函数并向用户显示错误消息。
基于上面的例子,我更喜欢第二个选项。然而,当我在网上研究时,我一直看到它更面向对象,立即抛出异常而不是让对象接受无效数据。正如我之前所说的,除了异常(exception),调用此构造函数的每个页面都需要验证输入是否有效。我不喜欢重复逻辑,所以我更喜欢第二种选择。
领域驱动设计的首选方案是什么?
选项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;
}
}
最佳答案
我确信这个问题已经在别处得到了回答。但这里有一些其他的阅读链接:
从“The Pragmatic Programmer”一书中,与异常用法有关的大问题是“什么是异常?”。
在该部分,我引用:
... exceptions should rarely be used as part of a program's normal flow; exception should be reserved for unexpected events.
虽然在您的情况下是否使用异常是有争议的,但我会说不 - 因为您可能需要在一个请求中捕获所有可能的输入错误并反射(reflect)在表单上,以便用户更正这些值。
现在回想起来,是 你应该在这里使用异常。这就是您防御性编码的方式。如果您已经期望将有效参数传递到
Customer
类,然后代码应该抛出异常以防止类的无效使用(例如,由另一个程序员)。在这种情况下,您应该有另一个输入验证器来验证用户对应用程序的输入,然后才能到达 Customer
类(class)。
关于c# - 抛出异常是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37336192/