【问题标题】:Is using output parameters considered bad practice? [closed]使用输出参数是否被认为是不好的做法? [关闭]
【发布时间】:2013-08-07 07:49:40
【问题描述】:

每次我看到一个方法的参数之一都是output parameter 之类的

void addTokenErrorsToReport(List<String> tokens, Map<String, Integer> report)

我觉得这完全是错误的。从我的角度来看,参数通常应该是不可变的,并且不会在方法中更改。例如,上面的方法可以重写为

Map<String, Integer> createTokenErrorsReport(List<String tokens)

然后可以将返回的Map 与原始报​​告地图合并。

这个假设正确吗?还是两个版本都一样可以接受?

【问题讨论】:

    标签: java coding-style


    【解决方案1】:

    与大多数事情一样,如果它导致代码功能不佳/不可读/难以维护,或者您不知道为什么要这样做,这只是“不好的做法”。

    在大多数情况下,使用输出参数不会产生这些效果。

    在您的 addTokenErrorsToReport 中,这当然是一种合适的方法。您正在将标记错误添加到报告中 - 该函数需要知道它正在添加的标记以及它正在添加到的报告。 该函数清楚地执行了它被设计执行的操作,没有任何缺点。

    如果您要采用 createTokenErrorsReport 方法,则必须通过在现有报告中插入新标记来跟踪对其的每次调用。如果将标记添加到现有报表是一种常见操作,那么使用添加的方法绝对是有意义的。这并不是说 createTokenErrorsReport 也不应该存在 - 如果从令牌列表创建新报告是一种常见操作,那么您需要一个函数来执行此操作。

    很好地使用输出参数的一个很好的例子是Collections.sort,它可以对列表进行适当的排序。避免了创建列表的新副本并返回排序后的副本对性能的影响,同时它不会限制您创建副本并根据需要对副本进行排序。

    只需使用最适合工作的工具并保持代码简洁。

    【讨论】:

      【解决方案2】:

      在第二个示例中,您将如何向地图添加内容?我认为如果你必须传递一个填满addTokenErrorsToReport 的空地图,那将是一个不好的做法。但在这种情况下:不,我不认为这是不好的做法。如果您有多个要处理的List&lt;String&gt; tokens,您将如何实现?我认为第一个例子是直截了当的。

      【讨论】:

        【解决方案3】:

        我认为这取决于您来自哪里(语言)。如果您曾经编写过 c 或 c++,您可以在其中使用指针作为参数,这既好又实用,您可以像第一个示例一样轻松编写代码。我真的不认为有什么好或坏,而是你的编码风格如何。

        【讨论】:

          【解决方案4】:

          我经常看到这种编码实践,发现它非常优雅。它允许您“返回”多个对象。

          例如,在上面的示例中,您可以返回一个与错误代码对应的整数值。

          【讨论】:

            猜你喜欢
            • 2011-06-11
            • 1970-01-01
            • 2012-11-25
            • 2010-09-26
            • 2019-06-08
            • 2022-01-09
            • 2018-08-11
            • 1970-01-01
            • 2015-10-29
            相关资源
            最近更新 更多