2009-12-07 24 views
2

我正在做一个意大利面怪物(不幸的不是飞行品种),我有一个关于正确设计的问题。无效,值或其他?

我在服用返回对象一个巨大的静态Java方法,它分裂成可重复使用的(和可读的)部件的处理。现在,该方法读取一个XML文档,然后将摘要和详细信息从文档附加到“dataModule”,然后dataModule从该方法返回。

在打破我的代码成一个getSummaryData和getDetailedData方法,我发现我做了以下内容:

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

(参照方法中传递,追加详实的数据数据模块)

这大多具有与详细数据需要以基于汇总数据进行正确分析业务逻辑,并改变了数据模块的结构涉及大量改变应用程序的前端事实的事实有关。

是这种方法的任何优于:

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

(按引用传递,方法内详细的数据添加到数据模块,数据模块返回)

我不能分享更多的代码不透露“秘密”,但是有一个强有力的理由去对付另一种方法吗?或者,我刚刚陷入了哪种口红的滋味,我在这里?

感谢,
IVR复仇者

+0

第二种形式让我想写:dataModule = setDetailedData(xmlDocument,getSummaryData(xmlDocument));虽然看起来有点奇怪,但在那里有两次xmlDocument – barrowc 2009-12-07 23:53:25

回答

4

我找到你的第二个方法,在这里你返回相同的对象,更混乱 - 因为它意味着给不同的对象可能会返回调用函数。如果你修改对象,你的第一个解决方案对我来说看起来很好。我会用它来回答你的问题

+0

我同意,第二种方法看起来像你可能会返回相同类型的另一个对象。 – Benj 2009-12-07 19:15:36

+0

在这两种选择中,第一种不太令人困惑。我假设你不能改变DataModule代码。如果你可以改变它,我认为Jonathan在DataModule中结合这两个函数的想法可能会更好,因为我们有限的信息。 – 2009-12-07 19:25:40

1

的一个原则是,你想要的东西,才可能进行final,让您对国家少一些麻烦推理。按照这个原则,你想避免无意义的重新分配。

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

但这也是错误的。为什么总结和详细数据是分开的步骤?你会做一个没有另一个?如果不是,那么这些步骤应该是DataModule专用的。真的,数据模块可能应该知道如何将自己从XML数据构建。

final DataModule dataModule = new DataModule(xmlDocument); 
+1

如果出于某种原因,setDetailedData确实需要分开,它应该仍然是DataModule上的一个方法,因此您可以执行dataModule.setDetailedData(xmlDocument) – 2009-12-07 19:27:51

+0

上一个代码示例中描述的内容是:给定无限时间,我想这样做。不幸的是,考虑到我目前正在经历的时间紧迫,目前无法完成对数据模块的更改。在支持这个应用程序的过程中,我将不得不重写大部分这些和相关的类,所以我可以在将来一直这样做。我只是想在本周的黑客中得到一些验证。 :-) – 2009-12-07 21:18:02

0

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

假设你有,除了setDetailedData(),setMoreData(),并且这两个函数都被写入来返回对象。然后,你可以写:

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

我不认为您所提供的好处,从链语法的方法很多的例子,但也有例子,其中它可以导致真正的美丽,富有表现力的代码。它允许什么Martin Fowler的调用Fluent Interface