8

Every time I see a method were one of the parameters is an output parameter like

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

I get the feeling that this is just plain wrong. From my point of view, parameters in general should be immutable, and not changed within a method. E.g., the above method could be rewritten to

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

The returned Map could then be merged with the original report Map.

Is this assumption right? Or are both versions equally acceptable?

4

4 回答 4

7

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

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

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

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

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

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

于 2013-08-07T07:54:04.830 回答
2

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

于 2013-08-07T07:59:07.743 回答
0

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

于 2013-08-07T07:52:27.370 回答
0

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

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

于 2013-08-07T07:57:45.673 回答