2010-08-21 66 views
1

我经常看到人们通过创建接受委托来执行验证的规则对象来验证域对象。像这样的例子“:http://www.codeproject.com/KB/cs/DelegateBusinessObjects.aspx如何在领域层进行验证

我不明白的是这是怎么有利地说只是制作方法

举例来说,特别是文章中有它创建的代表来检查方法?字符串为空

但是,这是不一样的只是有一样的东西:。

Bool validate() 
{ 
    Result = string.IsNullOrEmpty(name); 
} 

为什么经过时,这些在委托制作的对象来保存规则和定义规则的麻烦规则a对上下文敏感并且可能不会被共享。用方法可以达到完全相同的效果。

回答

1

有几个原因:

SRP - 单一责任原则。对象不应该对自己的验证负责,它有自己的责任和存在的理由。

此外,当涉及到复杂的业务规则时,明确声明它们使验证代码更易于编写和理解。

业务规则也倾向于变化很多,比其他域对象更多,所以将它们分开有助于隔离更改。

您发布的示例太简单,无法从完全成熟的验证对象中获益,但它非常方便,一个系统变得庞大,验证规则变得复杂。

1

这里最明显的例子是一个webapp:填写表单并点击“提交”。你的一些数据是错误的。怎么了?

  • Something引发异常。某些东西(可能更高)会捕获异常并将其打印出来(也许您只会捕获UserInputInvalidExceptions,但假定其他异常只需记录)。你看到的第一件事是错的。
  • 你写了一个validate()函数。它说“不”。你向用户展示什么?
  • 您编写了一个validate()函数,它返回(或抛出一个异常,或附加到)消息列表。你显示消息...但按字段分组不是很好吗?或者将它显示在错误的字段旁边?你使用元组列表还是元组列表?你想要规则占多少行?

将规则封装到对象中可让您轻松地遍历规则并返回被破坏的规则。您不必为每个规则编写样板附加消息到列表代码。你可以在破坏他们的领域旁边粘上破碎的规则。