首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >工厂模式是否包含验证逻辑?

工厂模式是否包含验证逻辑?
EN

Stack Overflow用户
提问于 2013-04-25 17:24:36
回答 3查看 4.1K关注 0票数 8

当使用工厂模式时,工厂itsel是否应该包含验证逻辑,还是应该让调用类在传入上下文数据之前处理验证?

我有一个简单的工厂方法,但它依赖于传递给它的配置树来决定要实例化哪个对象。

可能会出现配置xml格式良好的情况,但不是工厂所期望的正确格式,我不知道应该在哪里验证。

EN

回答 3

Stack Overflow用户

发布于 2016-01-02 13:49:20

当使用工厂模式时,工厂itsel是否应该包含验证逻辑,还是应该让调用类在传入上下文数据之前处理验证?

组织验证有两种不同的备选方案:

  1. 验证作为一个单独的过程

有一个单独的验证方法Validate(Config)。在构造方法之前调用此方法,并返回Config是否有效的信息。如果Validate方法返回Config是有效的,则调用构造方法。施工过程中的任何错误都被视为例外。

  1. 验证作为施工过程的一部分

没有单独的验证方法。相反,当需要时,验证会在构造方法中进行。允许构造方法失败并返回已构造的对象或指示错误的结果。

第二个变体可以使用几乎为零代码和性能开销的monads很好地实现。

票数 3
EN

Stack Overflow用户

发布于 2016-01-02 19:07:27

你所说的验证是什么意思?是什么使您认为作为工厂设计模式实例的一部分的代码不同于任何其他代码?

如果您所说的验证意味着检查从用户或输入文件中读取的输入值,则答案是否定的:解析输入的代码负责验证,而不是随后使用读取值的工厂。

如果您所说的验证意味着让工厂的工厂方法检查它们的调用方是否提供了符合这些方法的先决条件的值,那么对其参数施加先决条件的任何其他方法的答案都是相同的:对于Java的一致样式是方法检查它们的先决条件并在不满足先决条件的情况下抛出一个合适的RuntimeException

现在,在实践中,这意味着一些输入值将被检查两次。首先通过输入验证代码,然后通过工厂的前提检查。这在一定程度上是将代码分解为模块的成本(这里是一个单独的输入模块和服务层)。

但它也允许支票以不同的方式报告,而这些方式更适合他们的目的。

  • 失败的前提检查(在本例中为Factory )表示程序中有错误。我们希望在更改程序状态之前,前提条件失败能够快速而艰难地报告,以获得最有用的调试信息(在许多情况下,错误的位置将是调用堆栈中的一种方法)。
  • 对于输入验证失败,我们通常希望程序为输入的一个解析报告尽可能多的输入错误,这样用户就可以全部修复它们。想想您使用的编译器:如果它在您的源代码中找到第一个语法错误后停止,您将感到沮丧。抛出异常来实现这一点是不合适的。如果可能的话,代码应该注意到错误并继续解析,而不是如果程序抛出异常会弹出更高级别的部分(这就是抛出异常的原因)。
票数 3
EN

Stack Overflow用户

发布于 2013-04-25 18:03:14

为什么不两者都提供呢?这样,您就可以将责任传递给调用者,以确定他是否需要验证他的输入。

以Apache Commons-InstantiateFactory中的示例为例

它的默认构造函数不提供验证:

InstantiateFactory(java.lang.Class classToInstantiate) 构造函数,该构造函数执行不验证

但是在getInstance中提供了验证

静态工厂getInstance(java.lang.Class classToInstantiate,java.lang.Class[] paramTypes,java.lang.Object[] args) 执行验证的工厂方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16221010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档