2009-01-27 36 views
1

我正在研究由幾個模塊組成的應用程序,這些模塊又將用於其他應用程序。每個模塊都需要一些配置選項,但不應該意識到其他模塊的選項,也不應該要求其他模塊存在。一些設置在模塊之間共享。將配置傳遞給應用程序不可知模塊的最佳方式是什麼?

可以說模塊A需要設置x和y,模塊B需要設置y和z。

設置存儲在註冊表中或一個或多個.ini文件中。

到目前爲止,我已經考慮了以下方法:

  1. 有一個全球性單位(「global.pas」) 包含在所有模塊和 包含與 設置全局變量。我不太喜歡這種方法 非常多,因爲它需要 所有應用程序都有這樣一個單位 它必然會收集大量的 附加代碼,這些代碼與 沒有任何關係。所以 最終每個應用程序將 有其自己的不兼容全球 單位。
  2. 具有包含該模塊所需的所有設置的每個模塊的配置類。這些從應用程序中的某個中心點傳遞到模塊中,該中心還處理讀取和寫入它們的永久形式(例如使用JvAppStorage)。這需要在模塊之間進行一些同步,因爲它們之間會共享某些選項,所以如果在一個模塊中更改了選項,則必須以某種方式在另一個模塊的配置中反映此更改(不一定實時,但下一次模塊被初始化)。
  3. 有一個傳遞給每個模塊並且包含所有模塊設置爲屬性的通用配置類。每個模塊只訪問它所知道的設置。這裏的問題可能是名稱衝突可能在沒有被發現的情況下發生。另外,我不喜歡在模塊中傳遞配置選項的想法。另外,每個應用程序將包含不同的模塊子集,但最終會包含相同的配置類以及所有可能模塊的選項。 (這與上面的全局單元方法並無太大差別。)
  4. 有一個傳遞給每個模塊的通用配置類,就像上面一樣。但不是有屬性,模塊通過名稱訪問它們的設置(最簡單的情況下,這可能是一個TCustomIniFile)。這樣可以避免設置所有應用程序中可用的所有模塊,但會引入可能的類型兼容性問題,並且名稱衝突可能成爲一個問題(除非每個模塊在其選項前加上名稱,但不能再共享選項)。

我想每個編寫模塊化系統的人都會遇到這個問題,並且發現他們稍後會遇到一些解決方案,不管他們是否仍然喜歡它們。我也曾去過幾次,我仍然在尋找金色的子彈。

也許別人已經找到了理想的解決方案?

(這是德爾福2007年的情況下,它很重要。我已經使用了JCL/JVCL)

回答

0

我曾經有過的應用程序一樣,(用C++ Builder中)。 我有一個基本模塊(BaseClass.BPL),所有其他(如Payment.BPL)繼承。因此,您可以使用基類來讀取通用參數並覆蓋繼承的模塊以讀取特定設置。

void PaymentForm::Readsettings() 
{ 
    BaseClass::ReadSettings(); //to read common stuff 
    IniFile->ReadString("Payment Module", "setting1,...); //read specific stuff 
} 

我將設置保存在INI文件中 - 處理該註冊表要容易得多。爲避免類似名稱的衝突,每個模塊使用INI中的不同部分。

[Common] 
Datapath=... 
Server=... 

[MainModule] 
setting1=.. 

[Payment module] 
setting1=.... 
setting3=.... 
3

我可能會創建一個通用的配置類,並讓每個模塊依賴於一個或幾個具體的單身配置類。模塊依賴於一個配置類實例,其中的設置僅對該模塊有意義,並且可選地在一個或多個其他配置類實例上進行設置,該設置涉及多個模塊。由於配置對象是單例,共享配置對象的模塊會自動獲得相同的設置。

您將根據功能創建配置類,而不是根據模塊使用情況。模塊使用的功能涉及它需要的配置對象。

每個添加到應用程序的模塊都會將所有需要的配置類添加爲依賴項,但不會添加其他配置類。單例配置對象將自己添加到應用程序啓動時的這些對象的列表(或註冊表,如果您願意的話)。應用程序本身不需要知道詳細信息,只需加載和保存持久存儲的設置就足夠了。 OTOH可以在需要時使用相同的基礎設施。

通常我會根據接口實現一切,並將持久性機制留在外面。因此,稍後您可以在INI文件,註冊表或甚至數據庫中進行配置(這會爲您提供實現配置更改歷史記錄的簡單方法)。我發現自從我開始針對接口而不是類的層次結構編程以來,我並未將自己鎖定在一種做事方式上。

相關問題