有没有关于在方法签名中返回布尔值以指示成功操作的硬性规定,而不是声明void的规定?我发现对于我的调用方法中更为关键的操作,我想知道是否完成了某个操作,以便记录任何问题。这是使用布尔值的“不适当”用法吗?
有关在方法签名中返回布尔值或声明void来指示成功操作是否存在硬性规定,目前没有。在一些情况下,将布尔值用于表示操作的成功或失败可能不太合适。但是,如果您需要在调用方法中记录任何问题,则返回布尔值可能是一个好选择。通常我使用Exception
来表示出现了问题。
与其返回false
,不如抛出一个带有详细信息的Exception
,说明出了什么问题。
返回false
并不能提供太多关于问题的信息。
然后,如果你预计方法可能会失败,就不要检查false
的返回值,而是将方法调用放在try
/catch
中。
许多人会抱怨这种方法较慢。但是,你所获得的好处远大于减速。此外,如果你使用Java,速度不应该是你的首要考虑因素。
通常情况下,如果出现失败,抛出异常比返回布尔值是更好的解决方案,因为通常我并不关心进程是否成功,我只关心进程是否失败。通过使用异常,我可以提供任意数量的关于进程失败原因的信息。
如果异常看起来让人不舒服,你可以返回一个自定义的状态对象,其中包含布尔值和状态消息(例如“添加了6个新Foobars!”或“无法添加Foobars,因为Foobin已满!”),不过这当然更加复杂。
使用布尔值表示非异常的失败结果。例如,搜索功能的标准失败结果是“未找到(not-found)”。用异常来传达这种结果很不方便。将异常保留给特殊情况;区分“未找到”和“无法搜索(cannot-search)”。
这是一种可以的范例,但如果你想强制调用者处理操作未能成功完成的情况,你可能会想要抛出一个 checked 异常。
这个模式在 Java 核心库中确实存在。比如 File.delete()。
通常情况下,返回成功的方法有以下几种:
如果您需要了解异常行为的信息,那么返回布尔值表示成功是没有问题的。
如果出现意外的结果,抛出异常。 如果你只想让函数告诉你“我是否做了X”,那么返回布尔值。
在实践中,当失败意味着我们需要中止进程时,我发现抛出异常是最好的选择。例如,如果您正在尝试处理订单——向客户结算、安排运输、支付销售税等等——如果找不到订单记录,那么做所有其他工作可能没有多大意义。你只想走人。异常能让你轻松实现这一点。只需在块底部捕获异常,显示或记录错误,然后退出。
另一方面,如果“错误”意味着我的程序采用了不同的流程路径,则返回布尔值更有意义。例如,如果我正在寻找特定的客户,并且如果他存在,则更新他的记录,如果不存在,则创建一个新的客户记录,那么返回布尔值就很有意义,在调用者测试它并在为真时遵循一条路径,在为假时遵循另一条路径。
实际上,“错误”这个词有两种非常不同的含义,需要不同的处理方式。同一个函数完全可以同时处理两种情况。例如,当找到时返回true,在未找到时返回false,在尝试读取时发生I/O错误则抛出异常。
看起来还不错,但细节决定成败。 ;-)
抛出异常是主要的替代方案,有好处也有坏处。
我认为您可以通过提供精确的编码示例来获得更多的见解...