代码之家  ›  专栏  ›  技术社区  ›  Peter Sankauskas

用于验证的OO设计模式

  •  14
  • Peter Sankauskas  · 技术社区  · 15 年前

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

    • 验证代码必须在外部类中
      • 也就是说,没有数据类包含它自己的验证
    • 同一对象可以通过不同的方式进行验证
      • 例如,仅验证语法;根据数据库查找验证;针对重复项验证;等等
    • 根据需要,验证输出可能不同
      • 例如,输出单个错误消息;输出所有验证错误的列表;类似但采用JSON格式,包括错误代码;等等

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

    4 回复  |  直到 15 年前
        1
  •  9
  •   Wojciech Bederski    15 年前

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

    为验证器提供常用的方法/接口,以输出数据、分类警告、筛选/处理多次引发的警告。不要创建任何复杂的验证方法,至少不要在编写一些验证之前创建。 真实生活 验证器。

    让开,让验证器做他们应该做的:

    for validator in all_validators:
        validator.validate(model)

        2
  •  2
  •   Dimitrios Mistriotis    15 年前

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

    每个过滤器根据一个“方式”(如您所称)进行验证。
    第一个用于语法,第二个用于数据库查找等(从第二个项目符号开始)。

        3
  •  0
  •   David Smith    15 年前

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

    要执行不同的验证,请实现不同的验证程序类,并将其传递给根对象上的accept方法。我还能够围绕模型创建其他实用程序访问者,这允许我创建一个生成器访问者,该访问者用样本/随机数据填充所有字段。因为我太兴奋了,我有点迷上了它。你可能知道我对它仍然很兴奋,尤其是有变化告诉别人关于它。

        4
  •  0
  •   Peter Tseng    15 年前

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

    我将为任何需要验证的类创建一个验证程序。如果您需要不同的验证方法,例如是否严格,实际上可以创建多个验证程序。您可以将常见的功能和方法分组到类中,如abstractvalidator和validationresult(可能包含错误、严重性等的列表)。

    小心过度设计。试着从一些简单的事情开始,比如:

    new UserValidator().validate(user)
    

    或验证视图:

    new UserPanelValidator().validate(userPanel)
    

    不过,这取决于您的体系结构。例如,如果您自动将输入从视图传播到域,那么您就不需要在视图级别进行太多的验证。