2010-03-10 38 views
1

這是一個設計問題。我試圖在2個實現之間做出決定。我應該在構造中加載Java對象的數據,還是通過方法調用顯式加載?

爲了正確解釋這個,我需要一個例子。所以,爲了舉例:

我有一個類,可以生成關於特定日期某些股票市場價值的報告。我創建了一個StockMarketReportGenerator對象,傳遞它今天的日期,並根據當前的市場價值生成報告。

StockMarketReportGenerator「有一個」StockMarketData對象。 StockMarketData對象的用途是包含存儲在數據庫中的表格(可能稱爲StockMarket :))中的所有股票市場值,以及從表格數據計算出的一些其他值。它具有與數據庫連接的私有方法,檢索數據,進行必要的計算,並將最終值存儲在對象的成員變量中。 (然後它有getter方法來公開這些值,但沒有setter方法。)StockMarketData類基本上是股票市場數據值的「持有者」。我有一個叫做「calculateStockMarketData()」的中央功能,它調用所有這些專用幫助程序方法並設置對象。 (我知道所有這些處理可以通過Hibernate這樣的框架更容易地處理;但是決定手動完成,因爲它是一個非常小的臨時項目,不值得設置。)

我的問題是 - 從我的ReportGenerator類中,我只需要StockMarketData對象以訪問它的屬性/ 成員變量 - 後處理和後期計算。這意味着真的,我想獲得預填充對象 的數據。因此,我保留calculateStockMarketData私有方法,並從StockMarketData 構造函數中自動調用它。但是我對於在構造函數中完成所有處理,然後沒有任何公共方法感到有些不安。這是一個設計缺陷嗎?或者,這是否是最合乎邏輯的方式?基本上,以下兩種實現中的哪一種更好?

1)(我目前的實現)使中央calculateStockMarketData()方法私人和從StockMarketData方法構造函數(通過今天的日期稱呼它),這樣,只要你有一個StockMarketData對象,它已經填補。因此,所有我需要從ReportGenerator類之前,我開始使用對象屬性是線路:

StockMarketData myData = new StockMarketData(someDate); 

2)使中央calculateStockMarketData()方法公開,因此,爲了建立一個StockMarketData對象,你需要明確調用該方法。因此,從ReportGenerator類我將代碼:

StockMarketData myData = new StockMarketData(someDate); 
myData.calculateStockMarketData(); 

第一個給我的印象中更好的設計,特別是因爲有那麼沒有使用對象屬性它們被初始化之前的可能性。但我也不確定關於從構造函數執行大量代碼的標準......我應該選擇哪一個?

回答

1

我會與數字2,特別是如果有可能添加方法的類不依賴於那裏的數據。另一方面,如果您認爲該類在無數據填充的情況下處於無效狀態,則應該在構建時執行該操作。

0

一個好的做法是不在構造函數中執行很多代碼。

1

我總是明確加載,後建設。

從構造函數調用數據庫可能導致調試困難,代碼更脆弱,代碼不靈活,並且如果對象的使用發生更改,則會導致性能問題。

+1

StockMarketData在構建期間可能不會實際執行任何數據庫操作,它似乎更像是一個由StockMarketReportGenerator依賴的DAO。因此在施工時傳遞有效的DAO參考是一件好事。 – crowne 2010-03-10 19:35:43

7

Martin Fowler在dependency injection (Constructor vs. Setter injection)上寫了一篇很好的論文。他的建議是「儘可能在施工時創建有效的物體」。

IMO,最好是在可能的情況下構造有效的對象,因爲它可以更容易地閱讀/觀察代碼的行爲,因爲您可以假定對象構造正確,並且與對象相關的bug更少正確填寫。 setter與構造函數注入的問題與您所問的不同,這是您執行業務邏輯的地方。我認爲最好使用構造函數來創建一個有效的對象,然後在另一個公共方法(#2)中執行實際的業務邏輯,這樣對象的構建可以在與實際業務邏輯不同的時間發生。

+0

+1。在發電機的結構和功能的表現之間有明確的界定。 「Not-Yet-Started」對於報表生成器來說是一個非常有效的初始狀態,所以不需要在構造器中加載所有的工作。 – 2010-03-10 18:53:11

+0

我喜歡Guice所採取的方法,即將所有對象依賴關係一次傳遞給構造函數。 請參閱http://code.google.com/p/google-guice/ – crowne 2010-03-10 19:38:36

相關問題