无效,价值还是其他?

时间:2009-12-07 19:09:32

标签: java refactoring

我正在研究意大利面条怪物(不幸的是不是飞行品种),我对正确的设计有疑问。

我正在采用一个巨大的静态Java方法,该方法返回一个对象并将其拆分为可重用(和可读)的组件。现在,该方法读取XML文档,然后将文档中的摘要和详细信息附加到“dataModule”,然后从该方法返回dataModule。

在将我的代码分解为getSummaryData和getDetailedData方法时,我注意到我已完成以下操作:

dataModule = getSummaryData(xmlDocument);
setDetailedData(xmlDocument, dataModule);

(通过引用传递,将详细数据附加到方法中的dataModule)

这主要与以下事实有关:详细数据需要基于摘要数据的业务逻辑才能正确解析,而且更改dataModule结构的事实涉及到大量更改应用程序的前端。

这种做法是否比以下更好:

dataModule = getSummaryData(xmlDocument);
dataModule = setDetailedData(xmlDocument, dataModule);

(通过引用传递,将详细数据附加到方法中的dataModule,返回dataModule)

我不能在没有透露“teh secretz”的情况下分享更多的代码,但是有充分理由采用一种方法而不是另一种吗?或者,我刚刚被卷入我的猪的口红,在这里?

谢谢,
IVR Avenger

3 个答案:

答案 0 :(得分:4)

我发现你的第二种方法,你返回同一个对象,更加混乱 - 因为它意味着调用函数可能会返回一个不同的对象。如果你正在修改对象,你的第一个解决方案对我来说很好。

答案 1 :(得分:1)

我用来回答你问题的一个原则是,你想要尽可能多的事情final,这样你就可以减少对状态的推理。按照这个原则,你想避免无意义的重新分配。

final DataModule dataModule = getSummaryData(xmlDocument);
setDetailedData(xmlDocument, dataModule);

但那也是错的。为什么摘要和详细数据应该是单独的步骤?你会不会做另一个吗?如果不是,那些步骤应该是DataModule的私有。实际上,数据模块应该知道如何从xml数据构建自己。

final DataModule dataModule = new DataModule(xmlDocument);

答案 2 :(得分:0)

第二种方法的(可论证的)优点是它允许方法链接。

除了setDetailedData()setMoreData()之外,假设您已经编写了两个函数来返回对象。然后你可以写:

dataModule = getSummaryData(xmlDocument);
dataModule = dataModule.setDetailedData(xmlDocument).setMoreData();

我不认为你提供的示例会从方法链语法中获益很多,但有些例子可以导致真正漂亮,富有表现力的代码。它允许Martin Fowler称之为Fluent Interface