输出参数已经过时了吗?

3

在尽可能的情况下,我的直觉和长期实践是避免使用输出参数。我认为一个函数应该有一个逻辑目的,并且通常只有一个返回类型(不返回多个内容)。有时候,返回多个内容是可取的(例如std::map::insert)。我知道这可以作为一对/元组或输出参数来完成;对于我来说,使用哪种方式的争论并不重要。

有哪些概念、设计或性能上的原因,使得输出参数或返回值更受欢迎呢?


我认为你的函数可能会返回值字典或返回值对象。例如,如果你计算除法,你可能想知道一些关于这个操作的信息,比如 bool_value、int_value、float_value 等等。但是你也可能想知道 string_value 或 exception_value 等等。 - gaussblurinc
对于那些投票关闭的人:我不是在问在 * 前面或后面放置空格的位置。类似这个问题的最佳实践应该有明确的理由来证明它们,并且应该被合理的人所认可。无论如何,这是我的看法... - David
2个回答

6

你说得对,出参并不是真正需要的,因为RVO使得返回值变得可行,即使是对于大型类型也是如此。有必要返回多个值时,要么是代码异味,要么可以合理地打包成一个结构体。

我认为仅剩下的原因就是一致性,而这是一个重要的原因。如果类已经有数十个通过参数返回的方法,那就保持这种方式(除非你有自由重构它 :))。


你能详细解释一下“代码异味”部分吗?具体来说,为什么会出现这种情况?我在实践中遇到了阻力,我的直觉和表达不清的设计理由显然不能成为有说服力的论据 :) - David
@Dave 这取决于具体情况。如果你想接手重构现有代码的任务,那么赞成意见是不够的,因为它们并不足够好。改变已经运行良好的东西比仅仅为了让代码看起来更漂亮而进行更改更加危险。所谓的“代码异味”是指它可能可以用更清晰的方式实现(这就是为什么它取决于具体情况)。 - Luchian Grigore
“它可能本可以用更简洁的方式实现”:为什么使用 out 参数(通常)表明实现(或设计)质量较差/不够干净? - David
@Dave,这通常意味着需要进行两阶段构造,这是可怕的。如果你正在做像追加到容器之类的事情,那么一个输出参数是可以接受的,也可能是明智的选择。 - Simple

0

根据上下文,第三种选择可能是传递回调函数。如果被调用的函数“产生”多个值,则回调函数可能具有多个方法。

虽然接受回调参数的函数并不真正符合“函数”的定义,但返回多个值的函数也不符合,我认为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接