OO设计模式用于验证

时间:2009-07-14 20:40:04

标签: design-patterns oop

我正在根据这些假设编写一些验证代码:

  • 验证码必须位于外部类中
    • 即。没有数据类包含它自己的验证
  • 可以通过不同方式验证相同的对象
    • e.g。仅验证语法;验证数据库查找;验证重复;等
  • 根据需要,验证输出可能会有所不同
    • e.g。输出单个错误消息;输出所有验证错误的列表;类似但以JSON格式包含错误代码;等

OO设计模式的哪些组合最能解决这个问题?工厂可能是获得特定验证器的好方法,但它们是更好的方法吗?

4 个答案:

答案 0 :(得分:9)

一种尺码并不适合所有人!简单一点!

为验证者提供输出数据的常用方法/接口,对警告进行分类,过滤/处理多次提出的警告。不要在编写一些现实生活验证器之前创建任何复杂的验证方法。

移开方向,让验证人员按照他们应该做的去做:

for validator in all_validators:
    validator.validate(model)

答案 1 :(得分:2)

我想我现在正在做同样的事情 此处适用的模式是过滤器模式和过滤器链。

每个过滤器都会针对一种“方式”进行验证(如您所说) 首先是语法,第二个是Db查找等(来自你的第二个子弹)。

答案 2 :(得分:0)

我遇到了同样的问题,我发现访问者模式在将验证逻辑与数据对象分离时非常有效。您需要使用accept(visitor)方法来设置数据类层次结构,但是如果您正在构建足够简单的所有内容。即使您使用的是没有访问者支持的第三方层次结构,您也可以创建提供接受遍历树的包装器,这非常接近于在类中使用该方法。

要执行不同的验证,您需要实现不同的验证器类,并将其传递给根对象上的accept方法。我还能够在模型周围创建其他实用程序访问者,这允许我创建一个生成器访问者,用所有样本/随机数据填充所有字段。我让一个小游客疯狂,因为我很兴奋。你可能会说我仍然对此感到兴奋,特别是要改变告诉别人有关它。

答案 3 :(得分:0)

如果您正在进行任何类型的GUI工作,您应该查看JGoodies验证:http://www.jgoodies.com/downloads/libraries.html(此处还有一些文章:www.jgoodies.com/articles /)。

我会为任何需要验证的类创建验证器。如果您需要不同的验证方法,例如,您可以创建多个验证器。严格与否。您可以将常用功能和方法分组到类AbstractValidator和ValidationResult(可能包含错误,严重性等列表)。

警惕过度设计。尝试从简单的事情开始:

new UserValidator().validate(user)

或验证视图:

new UserPanelValidator().validate(userPanel)

它确实取决于您的架构。例如,如果您自动将视图中的输入传播到域,则无需在视图级别进行尽可能多的验证。

相关问题