2011-01-14 90 views
3

编写不带参数且有副作用,改变对象状态或带参数并处理它的单参数方法的方法会更好吗?如果第二种方法更可取,那么最好是显式地返回输入参数还是仅仅处理它,因为调用者应该有一个对它的引用。输入输出参数与不带副作用的参数

更确切地说:我正在处理XML并阅读了第一章的Clean Code book我试图将大处理方法拆分为许多小方法,因此这种方法可以像故事那样读取:

cleanHeader(); 

extractMetaInfo(); 

appendStuff(); 

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

恕我直言,减少参数计数与没有副作用的最佳做法似乎在这里相互矛盾。如下写作会更好吗?

doc = cleanHeader(doc); 

doc = extractMetaInfo(doc); 

doc = appendStuff(doc); 

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

编辑:发现一个related question与矛盾的答案。谨慎阐述?

+1

副作用是所有邪恶的母亲。甚至没有得到接近。 – leppie 2011-01-14 09:11:06

+0

谢谢你,leppie。这是相当明确:)并且似乎非常合理。你能否提供一个链接/其他信息来支持你的判断?最好是返回原始的论点还是改变它的“功能风格”,即,含蓄? – kostja 2011-01-14 09:17:59

+0

我强烈推荐阅读Joshua Bloch撰写的“有效的Java”一书 - 他在这个具体问题中投票反对(使用参数)。在一般布洛赫prefere无国籍班不同的原因(性能和可用性)。 @kostja - 你可以用它作为leppie语句的参考 – Ralph 2011-01-26 16:26:09

回答

1

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

0

我会从面向对象的设计角度来讨论这一点。如果你有一大堆方法对doc这样的对象进行操作,那么你可能需要一个包装该对象的类,并将行为封装到一个bigProcessingMethod()中,该对象调用更小的处理方法,以便进一步分解任务。

public class DocUtil { private String doc;

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

public bigProcessingMethod() 
{ 
    cleanHeader(doc); 

extractMetaInfo(doc); 

appendStuff(doc); 

} 

//等。 }

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

无论您是否将doc变量显式传递给每个处理方法,您都在同一个内存位置上处理同一个对象。我每次通过它的唯一原因是明确表示这些是可变文档工作的方法。

这取决于你。