Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设计模式-验证输入参数&;创建holder类、J2SE(无框架等)_Java_Oop_Design Patterns_Object Oriented Analysis - Fatal编程技术网

Java 设计模式-验证输入参数&;创建holder类、J2SE(无框架等)

Java 设计模式-验证输入参数&;创建holder类、J2SE(无框架等),java,oop,design-patterns,object-oriented-analysis,Java,Oop,Design Patterns,Object Oriented Analysis,场景:例如,我们接收到两个关于对象的输入参数 课程有讲师姓名、学生人数、课程时间、房间号等 我们需要验证(学生人数>0、上午9点

场景:例如,我们接收到两个关于对象的输入参数

课程有讲师姓名、学生人数、课程时间、房间号等

我们需要验证(学生人数>0、上午9点<时间<晚上9点等)输入并创建对象。我们需要返回无效输入的错误源

我可以想出两种方法

1) 使用静态方法创建单独的验证器类

  • 验证输入,(validate方法返回true,或一些枚举,如VALID、INVALID_TIME、INVALID_STUDENT_NUMBER)
  • 如果输入有效,则实例化Bean
缺点:

  • 如果我们必须在验证输入值之前对其进行处理,那么上面的模式会导致在输入有效时执行两次,一次在Validator类中,一次在bean setters之前。我们不能返回Bean对象,因为validate方法需要在无效的情况下返回错误源
2) 将validate方法放在Bean类本身中,返回无效输入的异常。通过不同类型的异常跟踪错误源

缺点:

  • 需要创建多个自定义异常
  • 在holder对象本身中包含validate方法是否正确
我探索了一些设计模式,但它们并不相关


请帮助我了解上述方法的优缺点,以及更好的方法。

正如上面所指出的,有很多方法可以做到这一点

如果我正在实现类似的东西,我会看看这篇文章 关于fluent接口与生成器模式的组合

也许它适合你的需要。特别注意bean部分的验证


希望它能有所帮助。

一位评论员指出:“您希望最终得到一组验证错误。”这一点很重要

根据我的经验,模型对象内部的验证方法不起作用,因为验证逻辑经常更改,并且在一组情况下无效的东西在另一组情况下也是有效的。例如,如果验证方法认为晚上9点以后的课程无效,学校管理者可以更改规则,使暑期课程可以运行到晚上11点。当这种情况发生时,您不希望在类中使用验证方法,因为这是不可避免的

此外,在不了解系统中其他对象的状态的情况下,通常不可能验证对象。例如,如果您有一个贷款对象,超过$100000的贷款值可能无效,但客户对象类型为Institution时除外。您需要了解贷款和客户对象,才能正确验证贷款

我见过的复杂验证的最佳实践有:

  • 在接受对象之前有效的简单事物。这包括检查数字字段中的无效字符或非数字

  • 创建一个验证框架,一次验证一组依赖对象。不要在发现第一个错误时停止验证例程。相反,创建一个名为ValidationError的类,并让框架创建这些对象的集合。通过这种方法,您可以考虑对象内和对象间的依赖关系。此外,您可以将所有错误一次呈现给用户,而不是强制用户一次更正一个错误

  • 不要硬编码像MinimumNumberOfStudent或Latest ClassTime这样的值。相反,将这些值放在关系数据库表或配置文件中。让验证框架查找正确的值(然后缓存它们)。当值发生变化时(通常会发生变化),您只需更新文件或数据库;无需重建和重新部署整个应用程序。当我做这项工作时,我正在用Smalltalk编写代码。如果您使用的是Smalltalk或Ruby之类的动态语言,那么很容易将源代码作为“验证块”放入数据库中,并在运行时执行


  • 验证框架可能会使用异常,但我建议不要这样做。例外情况应该保留给更难恢复的更严重的错误。此外,异常可能会导致严重的性能损失,如果验证是在服务器上而不是在客户机上进行的,这一点很重要。更糟糕的是,一些平台的异常处理不稳定

    有很多方法可以做到这一点,包括您提到的,还有AOP、JSR-303实现、验证装饰器等等。您将希望最终得到一组验证错误。为什么不尝试一些想法呢?谢谢大家的帮助,我来看看