2009-07-14 54 views
13

我在编写基于这些假设一些验证代码的过程:OO设计模式要用于验证

  • 输入验证码必须在外部类
    • 即没有数据类包含它的自己的验证
  • 同一个对象可以以不同的方式进行验证
    • 例如仅验证语法;根据数据库查找进行验证;验证重复;这取决于需要它
      • 例如等
    • 验证输出可以是不同的输出单个错误消息;输出所有验证错误的列表;相似但是采用JSON格式并包含错误代码;等

设计模式是最好的OO什么组合来解决这个问题?工厂可能是获得具体验证者的好方法,但是他们的方法更好吗?

回答

8

一个尺寸不适合所有!简单点!

为验证器提供通用方法/接口来输出数据,对警告进行分类,不止一次提出过滤/处理警告。不要创建任何复杂的验证方式本身,至少在写几个现实生活验证器之前不要。

迁出的方式,让验证做他们应该做的事情:

 
for validator in all_validators: 
    validator.validate(model)

2

我想我做同样的事情现在。
这里应用的模式是过滤器模式和过滤器链。

每个过滤器都会根据一个“方法”进行验证(如您所称的那样)。
首先用于语法,第二次用于Db查找等(从第二个项目符号开始)。

0

我有这个相同的问题,我发现访问者模式在将验证逻辑与数据对象分离时真的很有效。你需要用accept(访问者)方法来测试你的数据类层次结构,但是如果你正在构建足够简单的一切。即使您在没有访客支持的情况下使用第三方层次结构,也可以创建提供接受遍历树的包装,这非常接近于在类中使用方法。

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

+4

**真正的**兴奋是试图躲开维护开发商,而他正在用步枪在城镇周围追逐你:)而真正的,真正的“乐趣”部分是当你是维修人员,没有人时追逐,但你自己......等等,这不是很有趣...(在那里,做到了)。 – 2009-07-15 09:06:20

0

如果你正在做任何类型的GUI工作,你应该看看JGoodies验证:http://www.jgoodies.com/downloads/libraries.html(也有一些文章在这里:www.jgoodies.com/articles/)。

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

警惕过度设计。试着开始喜欢简单的东西:

new UserValidator().validate(user) 

或验证一个观点:

new UserPanelValidator().validate(userPanel) 

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