【问题标题】:OO design patterns to use for validation用于验证的 OO 设计模式
【发布时间】:2009-07-14 20:40:04
【问题描述】:

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

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

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

【问题讨论】:

    标签: design-patterns oop


    【解决方案1】:

    一种尺寸不适合所有人!让它变得简单!

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

    让开,让验证者做他们应该做的事情:

    for validator in all_validators:
        validator.validate(model)
    

    【讨论】:

      【解决方案2】:

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

      每个过滤器都针对一种“方式”(正如您所说的那样)进行验证。
      首先是语法,其次是 Db 查找等(来自您的第二个项目符号)。

      【讨论】:

        【解决方案3】:

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

        要执行不同的验证,您需要实现不同的验证器类并将其传递给根对象的接受方法。我还能够围绕模型创建其他实用程序访问者,这使我能够创建一个生成器访问者,该访问者使用样本/随机数据填充所有字段。我让一个小游客为之疯狂,因为我太兴奋了。你可能会说我仍然对此感到兴奋,尤其是有机会告诉别人这件事。

        【讨论】:

        • 真正的兴奋是在维护开发人员拿着步枪在城里追你的时候试图隐藏他 :) 而真正真正“有趣”的部分是当你维修人员,除了你自己没有人可以追逐......等等,这不是很有趣......(去过那里,做到了)。
        【解决方案4】:

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

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

        警惕过度设计。尝试从简单的开始,例如:

        new UserValidator().validate(user)
        

        或验证视图:

        new UserPanelValidator().validate(userPanel)
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-16
          • 1970-01-01
          • 1970-01-01
          • 2012-12-30
          • 2010-09-07
          相关资源
          最近更新 更多