【问题标题】:What to return if something failed, rather than return a a 'magic number'?如果某些事情失败了要返回什么,而不是返回一个“幻数”?
【发布时间】:2017-01-31 13:16:59
【问题描述】:

假设我重新实现了一种在字符串中查找字符串位置的方法。所以我要么得到一个整数的位置,要么得到一个像-1这样的“幻数”。我在很多编程语言中都看到了这种模式,其中一些返回像 null 这样的值,一些返回一些随机的“超出范围”值,比如 -`,还有一些完全抛出错误。

在这方面是否有“最佳实践”,或者至少在我不知道的其他编程语言中更明确一些?

【问题讨论】:

    标签: language-agnostic


    【解决方案1】:

    这并不像你想象的那样与语言无关,它在很大程度上取决于语言和函数的确切用途。几乎有三种不同的方法:

    • 抛出异常
    • 在某处设置一个标志,指示是否发生错误
    • 返回一个“超出范围”的值

    现在:

    • 有些语言没有任何异常的概念,或者“错误”并不是真正的“异常”。
    • 设置错误标志对于所讨论的语言可能是理想的,也可能不是理想的。 Go 通过将返回结果和错误指示符作为惯用默认值来使用这种方法。 Javascript 使得接受像function (result, err) 这样的回调变得部分惯用了。对于其他语言,这种方法可能根本不适合。
    • “超出范围”值是动态类型语言的典型值,但对于静态类型语言可能会出现问题。

    哪个最适合所讨论的语言,具体功能需要单独决定。目标需要在有意义(“未找到字符串”可能不是一个异常)和易于编写简单而正确的代码之间权衡。

    【讨论】:

    • 如果你想让你的代码更干净,超出范围的值不是问题吗?使用像 Node.js 这样的标志,您至少可以更明确地区分两种结果,而仅返回“超出范围”值会将所有内容打包在一起。
    • 当然,这是您需要考虑的一个问题。根据语言的不同,可以将它们放在一起实际上很方便;例如PHP 经常返回false一个虚假值,如果你愿意,你可以平等对待,或者在必要时可以更详细地区分(经典示例strpos(...) === false)。当有效的返回值与错误值在某种程度上无法区分时,这会成为非常的问题。出于这个原因,较新的语言选择异常/单独的错误标志。
    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    相关资源
    最近更新 更多