清洁代码 - 输出参数是否不好?

时间:2014-11-29 17:14:39

标签: c# solid-principles

我正在看一位前同事的帖子。他引用了article

中的内容
  

"在清洁代码中,Bob Martin贬低了输出参数,并说“通常应该避免输出参数。”

我目前的代码库是C#。我在一个相当大的应用程序中工作。它主要以程序风格编写,经常打破SOLID原则。当我有机会时,我经常会将违反单一责任原则的一些方法分解为单独的方法。有时我会使用几个输出参数创建方法,如下所示。

var value1 int;
var value2 int;

DoSomeWork(out value1, out value2);

我更喜欢创建一个特殊类型,如果创建了一个类型,它永远不会被重用。这是可接受的还是有更好的方法?

2 个答案:

答案 0 :(得分:4)

<强> TL:DR;如果您正在编写高级代码,则不应使用输出参数。

在某些情况下,有充分的理由使用输出参数。例如,int.TryParse是使用输出参数返回第二个值的函数的完美示例。

有人可能会说,原因就是效率,因为它不需要构造一个包装器对象来解析一个整数。

另一方面,如果编写高级代码,则应该使用包含这两个值的类或结构。如果您所做的只是返回两个值,则可以使用Tuple或编写自己的struct,几乎不会产生任何开销。我说几乎没有开销,因为所有对象创建都会有一些开销

如果您正在编写一个需要尽可能快地运行的紧密循环,例如某种解析器,您可能会因使用输出参数而受益更多,这些参数不会分配任何参数。过多的物体。

答案 1 :(得分:2)

通常应该避免输出参数。如果可能(并且合理),最好只返回结果。使用输出变量为您提供了一个准备 - 调用 - 处理的过程,它比以前更加复杂。

您不必始终创建用于返回值的新类型。您可以使用框架中的类型,只要您不需要返回值中组件的特定名称:

public Tuple<int, int> CalculateMinMax()

如果返回值的含义明显,那么这只是好事。在上面的示例中,预计这两个值将是按此顺序计算的最小值和最大值。

如果返回值更复杂,最好为其创建一个类型。如果它很复杂,那么使用输出变量也不会产生简单的代码。