使用输出参数被认为是不好的做法?

时间:2013-08-07 07:49:41

标签: java coding-style

每当我看到一个方法时,其中一个参数就像output parameter一样

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

我觉得这是完全错误的。从我的观点来看,参数一般应该是不可变的,而不是在方法中改变。例如,上述方法可以改写为

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

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

这个假设是对的吗?或者这两个版本都同样可以接受吗?

4 个答案:

答案 0 :(得分:5)

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

在大多数情况下,使用输出参数没有这些效果。

在你的addTokenErrorsToReport中,它肯定是一种合适的方法。您正在向报表添加令牌错误 - 该功能需要知道它正在添加的令牌以及它添加的报告。 该功能可以清晰地执行其设计的操作,没有任何缺点。

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我认为这取决于你来自哪里(语言)。如果您曾经编写过c或c ++,可以使用指针作为参数,这很好且实用,您可以像第一个示例一样轻松编写代码。我并不认为有某种好的或坏的,只是你的编码风格如何。

答案 3 :(得分:0)

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

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