我正在根据这些假设编写一些验证代码:
OO设计模式的哪些组合最能解决这个问题?工厂可能是获得特定验证器的好方法,但它们是更好的方法吗?
答案 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)
它确实取决于您的架构。例如,如果您自动将视图中的输入传播到域,则无需在视图级别进行尽可能多的验证。