design-patterns - 处理可能产生不同类型结果的函数的模式

标签 design-patterns oop exception

假设您有一个对象上的方法,如果输入根据某些复杂逻辑进行验证,则给定某些输入会更改对象状态。

现在假设当输入没有验证时,可能是由于几个不同的事情,我们希望能够以不同的方式处理每一个。

我相信你们中的许多人都在想:这就是异常(exception)!我也想过这个。

但我对使用异常的保留意见是,在某些情况下,输入未验证并没有什么异常,我真的很想避免使用异常来控制程序预期流程中真正的内容。

如果只有一种可能的解释,我可以简单地选择返回一个 bool 值,指示操作是否导致状态更改,并在没有时做出适当的响应。

当然也可以选择返回一个状态码,然后客户端可以选择解释或不解释。我也不太喜欢这个,因为状态码没有任何语义。

到目前为止,我的解决方案是在调用该方法之前始终检查我能够处理的每种可能情况,然后该方法返回一个 bool 值以通知客户端对象是否更改了状态。这让我可以根据我所处的上下文灵活地处理尽可能少或尽可能多的可能情况。它还具有使我调用的方法更易于编写的好处。缺点是无论我在哪里调用该方法,客户端代码中都有很多重复。

您更喜欢这些解决方案中的哪一个,为什么?

人们还使用哪些其他模式从函数中提供有意义的反馈?我知道有些语言支持多个返回值,如果我有这个选项,我肯定会更喜欢它。

最佳答案

我认为这是一个使用原语的情况,而你最好使用对象。我通过返回状态对象在我自己的代码中处理这个问题。这些对象允许您封装一个简单的“它工作/没有工作” bool 标志,并提供有关发生故障的原因的附加信息,或其他相关元数据,例如某些状态更改的描述。

这类似于 mdma's answer 中描述的“跟踪器”想法。 .状态对象的自省(introspection)程度取决于客户端。不关心细节的客户可以查看status.was_successful()方法。不同之处在于我会直接返回“跟踪器”,而不是将其作为引用传递。这使调用界面更加简单。

返回一个对象还可以有效地处理对多个返回参数的任何需求,因为您可以将所需的所有内容封装在单个状态对象中。

关于design-patterns - 处理可能产生不同类型结果的函数的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2946159/

相关文章:

objective-c - 如何找出在 objective-c 中输入的是数字还是文本?

php - LogicException 与 RuntimeException

python - 对于 python 有没有办法从发生异常的上下文中打印变量范围?

java - 用于实现嵌套 map 之类的数据结构?

c# - 重构 if-else if - else

asp.net - XML 序列化使用的 PropertySpecified 模式的目的是什么?

c# - 如何在子类的工厂方法中避免 switch-case

java - 像这样在构造函数中调用init方法是否违反了Clean Code

php __get() 和 __set() 魔术的要点

Python OOP : how to share a MongoDB connection with all classes