【问题标题】:Input-output arguments vs. no arguments with side-effects输入输出参数与没有副作用的参数
【发布时间】:2011-06-09 00:33:08
【问题描述】:

编写不带参数但有副作用的方法,改变对象状态,还是带参数并处理它的单参数方法更好?如果第二种选择更可取,是显式返回输入参数还是只处理它更好,因为调用者应该有对它的引用。

更准确地说:我正在处理 XML 并阅读了Clean Code book 的第一章的:

cleanHeader();

extractMetaInfo();

appendStuff();

等等,这些方法都对存储为成员的 XML 文档进行操作。

恕我直言,减少参数数量与没有副作用的最佳实践在这里似乎相互矛盾。写成下面这样会更好吗?

doc = cleanHeader(doc);

doc = extractMetaInfo(doc);

doc = appendStuff(doc);

在这个问题上是否有明确的“正确”?一个明确的答案还取决于多少上下文?还是有第三种我没有想到的选择?

编辑:发现 related question 的答案相互矛盾。需要详细说明吗?

【问题讨论】:

  • 副作用是万恶之母。甚至 goto 都没有接近。
  • 谢谢你,leppie。这非常明确:) 并且似乎非常合理。您能否提供一个链接/其他信息来支持您的判断?返回原始参数或将其更改为“函数样式”会更好,即隐含的?
  • 我强烈推荐阅读这本书:Joshua Bloch 的“Effective Java” - 他在这个特定问题中投票反对(使用参数)。一般来说,出于不同的原因(性能和可用性),Bloch 更喜欢无状态类。 @kostja - 您可以将其用作 leppie 声明的参考

标签: parameters arguments coding-style


【解决方案1】:

我会从面向对象设计的角度来论证这一点。如果你有一堆方法在像 doc 这样的同一个对象上运行,那么你可能需要一个类来包装该对象并将行为封装到一个 bigProcessingMethod() 中,该方法调用你想要进一步分解任务的较小的处理方法.

公共类 DocUtil { 私有字符串文档;

public DocUtil(String doc)
{
     this.doc = doc;
}

public bigProcessingMethod()
{
     cleanHeader(doc);

 extractMetaInfo(doc);

 appendStuff(doc);

}

//等等。 }

我误解了你的问题。我没有意识到您已经在像 DocUtil 这样的包装类中。

无论您是否将 doc 变量显式传递给每个处理方法,您都是在同一内存位置处理同一对象。我每次都通过它的唯一原因是明确说明这些方法适用于变量 doc。

这取决于你。

【讨论】:

  • 谢谢你,user381091。我不太确定你想指出什么。我的问题是关于你提出的这个包装器的隐式和显式状态变化。考虑到最佳实践的应用,我想看看这两种可能性的一些基本原理。
【解决方案2】:

如果您的算法可以由多个线程并行使用,那么干净代码书中推荐的方式(statfull 但没有参数)将不起作用。这种情况下必须使用参数方式!

【讨论】:

  • 这是一个很好的理由。谢谢你,拉尔夫。再次感谢您的书参考。
猜你喜欢
  • 2020-05-05
  • 2016-05-28
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多