一个简单的最佳实践问题,我在阅读的介绍性编程书籍中没有看到过这个问题......
如果一个函数或方法执行了一个动作但没有返回实际数据,一个例子是一个递增类属性或数据库值的函数,它应该总是返回一个布尔成功值吗?
我的一部分说“当然,呃”,然后我的一部分说我的代码会很快溢出每次小操作的布尔成功检查。
目前我检查关键功能是否成功,但是如果通过关键检查则运行的级联功能没有成功,假设第一次成功确保了以下那些的有效数据/成功。
但我只是一个业余爱好者。专业人士做了什么?
答案 0 :(得分:1)
这取决于你所遵循的语言和范例。如果方法失败并处理异常,我倾向于拥有不返回值的方法抛出异常,如果成功则返回任何内容(无效意义)。这很大程度上受到这样一个事实的影响,即大多数(如果不是全部)我使用的语言都支持异常处理。在一种不支持异常处理的语言中,我可能会返回一个具有成功定义值的数值,然后具有为不同类型的失败返回各种值的自由度,但仅限于明显可能出现故障的情况。
所以回答你的问题......可能不是。对所有方法执行此操作首先会产生过多的开销,对于需要完成的地方,布尔成功/失败可能不是最佳答案。
答案 1 :(得分:0)
当不期望某些内容失败时,返回成功值通常是糟糕的设计。您可能忘记检查返回值或以错误的方式检查它们,如果您开始对不同的错误使用不同的值,事情很快就会失控。 (-1
:成功还是失败?这取决于作者!)
相反,您应该在特殊情况下使用例外。当未处理异常时,它们通常会导致应用程序终止,这肯定会让您记住检查它们。它们的语法很清晰,你不需要用支票来丢弃你的代码。
您尚未指定语言,因此这是一个分割数字的VB.NET示例:
Function FloorDivide(ByVal a As Integer, ByVal b As Integer) As Integer
Dim result As Boolean = a / b
If Double.IsNaN(result) Then Throw New DivideByZeroException()
Return CInt(Math.Floor(result))
End Function
您可以在不检查成功值的情况下使用它,但您仍然可以使用Try...Catch
语句处理错误:
Try
FloorDivide(1, 0)
Catch ex As DivideByZeroException
MessageBox.Show("Something went terribly wrong! :D")
'Exit, maybe?
End Try
(不是我说你应该以这种方式防止被零除;过滤你的输入!)
如果您忘记进行检查,则很快就会在测试阶段提醒您,而不是让您的代码无声地失败。它也更清晰,Try...Catch
的范围可以大到你想要的范围,也许可以处理特定容易出错的方法中发生的任何错误并抛弃它们。谁知道?
因此,通常使用例外。但是,如果您发现自己计划处理它们,则需要进行验证。
答案 2 :(得分:0)
老实说,有正确的做事方式,我需要做到这一点。很多时候我发现自己处于两种情况。
我觉得差异在于我非常擅长查看应用程序并查看弱链接的可能性。那些是我有错误检查和返回布尔值的那些。我认为在所有不返回值的函数上返回布尔值有点过分,但在这种情况下,一个简单的try catch是一种非常好的方法,可以查看函数是否无法正常工作并安全地退出或重定向与崩溃应用程序。
我确信有些硬编程员真的相信分类并为所有事情返回布尔值,事实上它们是正确的......但是有时候你正在处理你无法控制的项目,例如客户端的服务器配置,现有应用程序的编码平台等。
我20多年来处理困难情况并被需要在一周或更短时间内创建或修复的应用程序的客户调用。
答案 3 :(得分:0)
对于“最佳实践”的许多问题,意见会有所不同。
但是有一个名为Command-query separation的共同原则,即一个方法应该做一些事情或返回一个值,而不是两者。
不是从所有内容返回布尔成功/失败,而是更喜欢使用异常来处理失败,而不是从目的是做某事的方法返回任何内容。