参数验证与 属性 验证
Parameter validation vs property validation
大多数(几乎所有?)验证框架都基于读取对象的 属性 值并检查它是否遵守验证规则。
- 我们真的需要它吗?
如果我们将有效参数传递给对象的构造函数、属性 设置器和其他方法,对象似乎是完全有效的,并且不需要 属性 值检查!
验证参数而不是属性不是更好吗?
在将参数传递给对象之前可以使用哪些验证框架来验证参数?
更新
我正在考虑客户端调用服务方法并传递一些数据的情况。服务方法必须检查数据、创建/加载域对象、执行业务逻辑和持久化更改。
好像大部分时间数据都是通过数据传输对象来传递的。并且使用 属性 验证是因为 DTO 只有在网络基础设施创建后才能进行验证。
根据我的经验,此类验证是在处理复杂的验证规则时完成的,并且 Parameter object. Since we need to keep the Separation of concerns - 验证逻辑不在对象本身中。这就是为什么 - 是的,我们
we really need it
更有趣的是 - 为什么要构造昂贵的对象然后再验证它们。
这个问题可以扩展到更广泛的话题。首先,让我们看看 Martin Fowler has said:
One copy of data lies in the database itself. This copy is the lasting
record of the data, so I call it the record state.
A further copy lies inside in-memory Record Sets within the application. This data
was only relevant for one particular session between the application
and the database, so I call it session state.
The final copy lies
inside the GUI components themselves. This, strictly, is the data they
see on the screen, hence I call it the screen state.
现在我假设你是在讨论会话状态的验证,验证对象属性是否更好或验证 参数 。这取决于。首先要看你是否使用Anemic or Rich Domain Model. If you use anemic domain model,会明确验证逻辑会驻留在其他class.
其次,这取决于您构建的对象类型。框架/操作/实用程序对象需要针对对象 属性 进行验证。例如:C# 的 FileStream object, in which the stream class need to have valid property of either file path, memory pointer, file access mode, etc. You wouldn't want every developer that use the utility to validate the input beforehand or it will crash in one operation, and giving wrong error message instead of fail fast.
第三,你需要考虑“参数可以有多种来源/形式”,而“class/对象属性只有1个定义”。您需要在每个输入源处放置参数验证,而对象 属性 验证只需要定义一次。但是您还需要了解对象的状态。对象可以在某些状态(草稿模式)下有效,而在其他状态(提交模式)下无效。
当然你也可以在其他状态级别添加验证,比如数据库(记录状态)或UI(屏幕状态),但它也有不同的pros/cons.
What validation frameworks can be used to validate parameters before passing them into an object?
C# 的 ASP.Net MVC 可以在构造对象之前在控制器级别执行一种 parameter validation(对于数据类型)。
结论
这完全取决于您要制作的架构和对象类型。
大多数(几乎所有?)验证框架都基于读取对象的 属性 值并检查它是否遵守验证规则。
- 我们真的需要它吗?
如果我们将有效参数传递给对象的构造函数、属性 设置器和其他方法,对象似乎是完全有效的,并且不需要 属性 值检查!
验证参数而不是属性不是更好吗?
在将参数传递给对象之前可以使用哪些验证框架来验证参数?
更新
我正在考虑客户端调用服务方法并传递一些数据的情况。服务方法必须检查数据、创建/加载域对象、执行业务逻辑和持久化更改。
好像大部分时间数据都是通过数据传输对象来传递的。并且使用 属性 验证是因为 DTO 只有在网络基础设施创建后才能进行验证。
根据我的经验,此类验证是在处理复杂的验证规则时完成的,并且 Parameter object. Since we need to keep the Separation of concerns - 验证逻辑不在对象本身中。这就是为什么 - 是的,我们
we really need it
更有趣的是 - 为什么要构造昂贵的对象然后再验证它们。
这个问题可以扩展到更广泛的话题。首先,让我们看看 Martin Fowler has said:
One copy of data lies in the database itself. This copy is the lasting record of the data, so I call it the record state.
A further copy lies inside in-memory Record Sets within the application. This data was only relevant for one particular session between the application and the database, so I call it session state.
The final copy lies inside the GUI components themselves. This, strictly, is the data they see on the screen, hence I call it the screen state.
现在我假设你是在讨论会话状态的验证,验证对象属性是否更好或验证 参数 。这取决于。首先要看你是否使用Anemic or Rich Domain Model. If you use anemic domain model,会明确验证逻辑会驻留在其他class.
其次,这取决于您构建的对象类型。框架/操作/实用程序对象需要针对对象 属性 进行验证。例如:C# 的 FileStream object, in which the stream class need to have valid property of either file path, memory pointer, file access mode, etc. You wouldn't want every developer that use the utility to validate the input beforehand or it will crash in one operation, and giving wrong error message instead of fail fast.
第三,你需要考虑“参数可以有多种来源/形式”,而“class/对象属性只有1个定义”。您需要在每个输入源处放置参数验证,而对象 属性 验证只需要定义一次。但是您还需要了解对象的状态。对象可以在某些状态(草稿模式)下有效,而在其他状态(提交模式)下无效。
当然你也可以在其他状态级别添加验证,比如数据库(记录状态)或UI(屏幕状态),但它也有不同的pros/cons.
What validation frameworks can be used to validate parameters before passing them into an object?
C# 的 ASP.Net MVC 可以在构造对象之前在控制器级别执行一种 parameter validation(对于数据类型)。
结论
这完全取决于您要制作的架构和对象类型。