2012-12-04 55 views
0

我有一個遊戲,它由幾個模塊組成。數據庫模塊摘要(獨立於)來自遊戲的其他模塊

其中之一是數據庫模塊。 我想讓它類似的東西:

Database{ 
    public: 
     save(&Object); //all my classes in the all modules inherit from Object 
     load(&Object); 
}; 

什麼是使獨立於其他模塊,該模塊的最佳方式(使用其他模塊將存儲在Database數據saveload功能)

我考慮幾個解決方案:

  1. 所有對象都具有類似的東西從Object類(類似於Java的)繼承serialize()方法。 Database使用該方法獲取字符串並將其保存。明顯的缺點是:所有對象都必須實現新的方法,並且它不會最適合保存字符串(不知道類的結構)。
  2. 爲所有類別製作'清單'(例如,文本文件將發送到Database)。該清單將描述類的結構(例如,一個字符串,兩個double,一個罕見的int)。缺點是靈活性 - 更改其他模塊中的類將會影響清單。
  3. 所有類別都有自己的saveload方法和Database使用它們。我不想要它,因爲所有類都必須知道數據庫類型,並且saveload應該在Database類中,而不是分佈在整個代碼中(這是製作此類模塊的一個要點)。
  4. Database瞭解所有其他模塊(並知道如何保存所有對象)。這裏的壞事是很多依賴。任何模塊的更改都會影響Database

哪條路好?或者,也許有更好的選擇?

+0

當你談論像你想使用一個名稱值存儲(鼻翼的NoSQL)這聽起來序列化()方法。通常,數據庫會在表中存儲每列一個值。 –

回答

0

我遇到的一個解決方案是讓所有的Object子類實現一個virtual void serialize(ISerializer& serializer)方法。

ISerializer將有純虛方法,如void onInt(int value)void onString(const char* string)等由其serialize() - 方法裏面的對象子類中調用。您的數據庫模塊可以實現ISerializer兩個獨立的類別,DatabaseReaderDatabaseWriter。後來,你可以添加ObjectInspectionFileDumperOnScreenObjectStateDebuggerNetworkWriter也實現ISerializer,但在其他模塊。每個對象只需要執行一次方法即可獲得所有擴展的可能性。

優點:

  • 閱讀與寫作是相當多保證,只要投其所好,你不沒有某種形式之上的版本控制方案的讀取舊版本的對象的數據。
  • 這是一個正交設計,對象類型和串行器類型的數量可以彼此獨立增長。

缺點:

  • 主要是一些虛函數的開銷,如果這是你的項目的問題。但這並不是你在常規遊戲中通常會做的很多事情。

之後,你可能會遇到你想打電話給你不想對象序列的東西,那麼它可能是有意義的分開了這一點到ISerializable的接口類,只包含純虛serialize() -方法。爲了適應串行器的重要性(如調試串行器),您可能需要改爲void onInt(const char* name, int value)等。

HTH