这可能听起来很愚蠢。但是每当我开始创建一个新api时,我发现自己仍然坚持这个问题。
让我们说,我正在编写一个接收输入,将其写入数据库或文件并返回布尔变量true / false的编写器。
如果作者返回true,则表示写入成功。 如果编写器返回false,则表示写入不成功。
现在假设输入为null或空字符串,在这种情况下,writer应该返回false还是应该返回True?
一个明显的解决方案是抛出一些异常(可能是非法的)。但是,如果我不想抛出异常怎么办?让我们假设,我只是解析一些日志条目并尝试将其写入文件。每次我写一个数据,我都期待真/假。
答案 0 :(得分:2)
这取决于你想要用返回值做什么,以及是否可以合理地处理输入。
如果null或空String不是有效输入,通常会抛出一些异常,因为您的API用户不尊重其合同。但是对于某些事情,例如日志记录,成功可能并不重要,你可能只想忽略它,不写任何内容并返回布尔值。
然后取决于布尔值应该与用户通信的内容。如果必须声明写入的内容,则只有成功写入的有效输入应返回true,失败或输入错误。如果要表明处理输入成功,无论它是否有效,如果写入了某些内容或者正确处理null / empty的情况,则返回true,仅在处理合理输入的实际失败时返回false。您的API的用户可能希望在返回值为false的情况下重试该操作,但如果问题是由输入本身引起的话,它会继续失败,而不是像连接被丢弃那样的瞬态故障。
也许真正的问题是布尔值可以有两个值,而我们有两个以上的场景。返回一些值来表示成功,失败或错误输入会更好。在许多较旧的API中,您经常会找到整数返回值来指示结果(例如在许多命令行程序中)。在Java中,使用Enum是有意义的。值可以是SUCCESS
,FAILURE
和INVALID_INPUT
。然后,API的用户可以确定如何处理每种情况。更重要的是,它可以扩展到涵盖其他情况,例如不同的故障模式。
但请记住,在某些时候,这只是开始类似于已检查异常的替代品。最后,正确的答案取决于API以及它应该如何使用,讨论可能不仅仅是技术问题,而是风格和偏好问题。