簡體   English   中英

在大型C ++項目中處理配置的最佳方法

[英]The best way to handle config in large C++ project

為了啟動我的C ++程序,我需要閱讀一些配置,例如IP地址,端口號,文件路徑......這些設置可能會頻繁更改(每周或每天!),因此將它們硬編碼到源文件中不是好主意。

經過一些研究,我很困惑是否有一個最佳實踐從文件加載配置設置,並使這些配置可用於同一項目中的其他類/模塊/ * .cpp。

靜是壞的 ; 單身是壞的反模式 ?)那么,我們還有其他選擇嗎? 或者,也許“配置文件”的想法是錯誤的?

編輯:我沒有加載配置文件的問題。 我擔心,在將所有這些設置加載到內存中的std :: map <string,string>之后,如何讓其他類,函數訪問這些設置。

編輯2:感謝大家的投入。 我知道我在這里列出的這些模式很精細 ,很多程序都使用它們。 我很好奇是否有一種(某種) BEST模式來處理程序的配置。

可以說,配置文件是Singleton的合法用途。 Singleton模式通常不受歡迎,因為Singletons在多線程環境中引起競爭條件的問題,並且由於它們是全局可訪問的,因此遇到了與globals相同的問題。 但是,如果您在讀取配置文件時初始化了一次Singleton對象,並且在此之后從未改變過,那么我無法想到將其稱為“反模式”的正當理由,而不是某種貨物崇拜心態。

話雖這么說,當我需要將配置文件作為我的應用程序的對象提供時,我不使用Singleton。 通常我將配置對象傳遞給需要它的那些對象/函數。

我知道解決這個問題的最佳模式是通過一個選項類,它在創建/配置時被注入到代碼中。

腳步:

  1. 創建一個選項解析器類
  2. 配置解析器應該接受哪些參數和選項,以及它們的默認值(默認值可以是“最可能的”默認值)
  3. 編寫客戶端代碼以接受選項作為參數(而不是單例和/或靜態東西)。
  4. 在創建對象時注入選項。

看一下已經成熟的程序選項模塊的boost.program_options 如果您熟悉python,請查看argparse文檔中示例 (相同的概念,在python庫中實現)。 他們很容易從中獲得概念和互動。

運行時如果要在運行時讀取配置,可以將它們存儲在.ini文件中,並使用准備好的類庫來解析和讀取它們。 然后將它們保存在程序的內存中以有效地訪問它們。

編譯時這是一種方式,您可以使用單獨的頭文件並將配置存儲為const項。 你可以使用constexternenum ,...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM