我正在看一位前同事的帖子。他引用了article
中的内容"在清洁代码中,Bob Martin贬低了输出参数,并说“通常应该避免输出参数。”
我目前的代码库是C#。我在一个相当大的应用程序中工作。它主要以程序风格编写,经常打破SOLID原则。当我有机会时,我经常会将违反单一责任原则的一些方法分解为单独的方法。有时我会使用几个输出参数创建方法,如下所示。
var value1 int;
var value2 int;
DoSomeWork(out value1, out value2);
我更喜欢创建一个特殊类型,如果创建了一个类型,它永远不会被重用。这是可接受的还是有更好的方法?
答案 0 :(得分:4)
<强> TL:DR;如果您正在编写高级代码,则不应使用输出参数。
在某些情况下,有充分的理由使用输出参数。例如,int.TryParse
是使用输出参数返回第二个值的函数的完美示例。
有人可能会说,原因就是效率,因为它不需要构造一个包装器对象来解析一个整数。
另一方面,如果编写高级代码,则应该使用包含这两个值的类或结构。如果您所做的只是返回两个值,则可以使用Tuple
或编写自己的struct
,几乎不会产生任何开销。我说几乎没有开销,因为所有对象创建都会有一些开销。
如果您正在编写一个需要尽可能快地运行的紧密循环,例如某种解析器,您可能会因使用输出参数而受益更多,这些参数不会分配任何参数。过多的物体。
答案 1 :(得分:2)
通常应该避免输出参数。如果可能(并且合理),最好只返回结果。使用输出变量为您提供了一个准备 - 调用 - 处理的过程,它比以前更加复杂。
您不必始终创建用于返回值的新类型。您可以使用框架中的类型,只要您不需要返回值中组件的特定名称:
public Tuple<int, int> CalculateMinMax()
如果返回值的含义明显,那么这只是好事。在上面的示例中,预计这两个值将是按此顺序计算的最小值和最大值。
如果返回值更复杂,最好为其创建一个类型。如果它很复杂,那么使用输出变量也不会产生简单的代码。