2010-02-23 65 views
5

方面組織加載/保存功能的方式,我有一個類定義了數據庫的歷史提取:最好的靜態/非靜態

class ExtractionConfiguration 
{ 
    string ExtractionName; 
    time ExtractionStartTime; 
    time ExtractionEndTime; 

    // Should these functions be static/non-static? 
    // The load/save path is a function of ExtractionName 
    void SaveConfigruation(); 
    void LoadConfiguration(); 
} 

這些ExtractionConfigurations需要保存/從磁盤加載。根據靜態/非靜態組織保存/加載函數的最佳方式是什麼?對我來說,很明顯SaveConfiguration()應該是一個成員函數。然而,隨着LoadConfiguration(),它更有意義調用

ExtractionConfiguration newExtraction; 
newExtraction.LoadConfiguration(); 

,並有一個臨時的空實例或使負載功能靜電

static ExtractionConfiguration LoadConfiguration(string filename); 

並調用

ExtractionConfiguration newExtraction = ExtractionConfiguration::LoadConfiguration(filename); 

這對我來說感覺更加整潔,但打破了加載/保存機制的「對稱性」(這甚至是一個有意義/值得考慮的問題?)。

我想詢問「最佳」答案有些天真。我真的想要更好地理解這裏涉及的問題。

P.S.這是我的第一個問題,所以如果我沒有正確表達,請讓我知道,我會盡量讓問題更清楚。

+0

歡迎。要將代碼格式化,可以通過4個空格或1個選項卡縮進代碼部分。請參閱http://stackoverflow.com/editing-help。 – kennytm 2010-02-23 11:26:41

+0

謝謝Kenny,我很確定*我錯過了格式化技巧! – 2010-02-23 11:30:51

+3

您應該使用較短的名稱。例如。只需保存並加載,因爲他們已經在課堂上了。不是每個人都使用Intellisense :) – Tronic 2010-02-23 11:34:24

回答

1

您應該考慮使用避免了用於保存和加載(即使你不使用庫本身)獨立的功能Boost.Serialization style序列化功能。

在這種方法中可以傳遞函數的任何類型的對象,其具有操作者&,在所有成員變量的操作。一個這樣的對象可能會將數據保存到文件中,另一個可能會從文件中加載,第三種可能會在控制檯上打印數據(用於調試等)。

如果你想保持獨立的功能,讓他們作爲非靜態成員可能是一個更好的選擇。對於保存功能這是顯而易見的,但加載是一個不同的問題,因爲你需要構造對象。然而,相當普遍的加載是通過默認 - 構造,然後調用加載非靜態成員函數,出於對稱原因,我猜。

具有負載爲返回一個新的對象,似乎在某些方面更好的功能,但你需要決定如何返回對象。它是由新的分配還是僅由價值返回?按值返回需要該對象是可複製的,並返回一個指針來強制資源管理方案(不能將對象存儲在堆棧中)。

+0

好的序列化調用。如果出於某種原因不喜歡boost,那麼推出自己的序列化函數並不難。 @Rodion,如果你想避免額外的副本,考慮做一個構造函數或初始化函數,將文件名作爲參數。你可以保留你的負載或反序列化函數作爲幫手。 – thebretness 2010-02-23 12:09:36

+0

我會看看序列化庫,它聽起來很有用。不幸的是,我的老闆對OOP有一種「不相信炒作」的態度,事實上幾乎所有你沒有親自編碼的東西,這就是爲什麼我使用基本的加載/保存結構。 你在加載/保存上的觀點非常符合我的感受。我打算進行非靜態加載/保存。至於在使用靜態負載時要返回什麼,我認爲按值返回是最好的。正如你所說,通過指針決定了你的資源管理方法,它會把你的設計拴在一些相當小的東西上。 – 2010-02-24 10:37:59