Let all your things have their places; let each part of your business have its time.

— Benjamin Franklin, Thirteen Virtues, autobiography

核心概念#

當程式碼依賴的值可能在應用程式上線後變動時,將這些值保留在應用程式之外。當你的應用程式將在不同環境中運行,且可能面對不同的客戶時,將環境和客戶特定的值保留在應用程式之外。透過這種方式,你在參數化你的應用程式——程式碼適應它運行的地方。

Tip 55 - Parameterize Your App Using External Configuration(使用外部設定參數化你的應用程式)

常見的設定項目#

你可能想放入設定資料的常見內容包括:

  • 外部服務的憑證(資料庫、第三方 API 等)
  • 日誌等級和目的地
  • 應用程式使用的 Port、IP 位址、機器和叢集名稱
  • 環境特定的驗證參數
  • 外部設定的參數,如稅率
  • 網站特定的格式化細節
  • 授權金鑰

基本上,尋找任何你知道會變更的東西,且能在主要程式碼之外表達的,把它放入某個設定容器中。

靜態設定#

許多框架和自訂應用程式將設定保存在扁平檔案或資料庫表中。如果資訊在扁平檔案中,趨勢是使用某種現成的純文字格式——目前 YAML 和 JSON 很流行。如果資訊是結構化的且可能由客戶變更(如銷售稅率),可能更適合存放在資料庫表中。

無論使用什麼形式,設定都會在應用程式啟動時作為資料結構被讀入。通常這個資料結構被設為全域的,認為這使得程式碼的任何部分都更容易取得其持有的值。

作者偏好不要這樣做。相反地,將設定資訊包裝在一個(薄的)API 後面。這將你的程式碼從設定的表示細節中去耦合。

設定即服務(Configuration-as-a-Service)#

雖然靜態設定很常見,作者目前偏好一種不同的方法。我們仍然想要設定資料在應用程式之外,但不是放在扁平檔案或資料庫中,而是存放在服務 API 後面。這有幾個好處:

  • 多個應用程式可以共享設定資訊,搭配認證和存取控制
  • 設定變更可以全域進行
  • 設定資料可以透過專門的 UI 維護
  • 設定資料變成動態的

設定應該是動態的這一點至關重要——隨著我們邁向高可用應用程式,為了更改一個參數就需要停止和重啟應用程式的想法已經完全跟不上現代現實了。使用設定服務,應用程式的元件可以註冊接收它們使用的參數的更新通知。

不要寫渡渡鳥程式碼#

沒有外部設定,你的程式碼就沒有它本可以擁有的靈活性和適應性。在現實世界中,不適應的物種會死亡。渡渡鳥沒有適應人類和牲畜在模里西斯島上的存在,很快就滅絕了。這是人類手中物種滅絕的第一個紀錄案例。

不要讓你的專案(或你的職涯)走上渡渡鳥的老路。

不要過度使用設定: 不要把每個東西都變成可設定的。一個早期客戶決定應用程式中的每個欄位都應該是可設定的,結果他們有約 40,000 個設定變數。也不要出於懶惰把決策推到設定中——如果有真正的爭議,先試著做一個決定,然後從回饋中學習。

相關章節#

  • Topic 9,DRY——邪惡的重複
  • Topic 14,領域語言
  • Topic 16,純文字的力量
  • Topic 28,去耦合