假设您在对象上有一个方法,如果输入根据某些复杂逻辑进行验证,则给定某些输入会改变对象状态.
现在假设当输入未验证时,可能是由于几个不同的事情,我们希望以不同的方式处理每个事物.
我相信很多人都在想:这就是例外情况!我也想过这个.
但我对使用异常的保留意见是,在某些情况下,输入没有验证没有任何例外,我真的希望避免使用异常来控制程序预期流程中的实际内容.
如果只有一种解释可能,我可以简单地选择返回一个布尔值,指示操作是否导致状态改变,并且当它没有时,则适当地响应.
当然还有返回状态代码的选项,然后客户可以选择解释它.我不喜欢这么多,因为状态代码没有任何语义.
到目前为止我的解决方案是始终检查我能够在调用方法之前处理的每种可能情况,然后返回一个布尔值以通知客户端对象是否更改状态.这使我能够根据我所处的上下文灵活处理尽可能少或尽可能多的情况.它还有一个好处,就是让我调用的方法更简单.缺点是,无论我在何处调用该方法,客户端代码中都存在大量重复.
您更喜欢哪种解决方案?为什么?
人们用什么其他模式来提供功能的有意义的反馈?我知道有些语言支持多个返回值,如果我有这个选项,我肯定会喜欢它.
最佳答案 我认为这是一个使用基元的情况,当你最好用对象.我通过返回状态对象在我自己的代码中处理它.这些对象允许您封装一个简单的“工作/不工作”布尔标志,并提供有关失败原因的其他信息,或其他相关元数据,例如某些状态更改的描述.
这与mdma’s answer中描述的“跟踪器”概念类似.状态对象的内在深度取决于客户端.不关心细节的客户端只需检查status.was_successful()方法即可.不同之处在于我会直接返回“跟踪器”,而不是将其作为参考传递.这使调用接口更加简单.
返回一个对象也可以有效地处理对多个返回参数的任何需求,因为您可以在单个状态对象中封装所需的所有内容.