2009-12-07 23 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