dotenv 2到3版本設計模式重構實戰分析

老大說了這個dotenv的重構比較適合用來學習,進行了分析,並分享了出來php

github項目地址: github.com/vlucas/phpd…git

dotenv是一個php寫的從文件中加載環境變量的庫,庫自己文件數量較少,比較容易閱讀。github

核心api變更

2.x實例化方式設計模式

$dotenv = new Dotenv\Dotenv(__DIR__, 'myconfig');
$dotenv->load();
複製代碼

3.x實例化方式api

$dotenv = Dotenv\Dotenv::create(__DIR__, 'myconfig');
$dotenv->load();
複製代碼

靜態工廠方法設計模式應用

這個3.x版本create方法建立對象使用的是工廠方法設計模式數組

核心實例化dotenv對象由手動調用構造方法重構成了靜態工廠方法,這個改變是由於這個dotenv加載.env文件須要判斷env文件、envFactory對象是否傳遞,而這個判斷是個if else的邏輯,根據構造方法不宜寫邏輯定理,若是不使用靜態工廠方法進行重構,那麼在new DotEnv以前,必須手動判斷.env是否存在。在屢次實例化這個Dotenv對象時,必然形成代碼重複。工具

經過工廠方法封裝建立對象的邏輯,以免建立對象的代碼重複,是很是常見的一種設計模式的最佳實踐學習

靜態方法封裝的邏輯

每次建立dotenv實例省掉的這部分代碼量仍是至關客觀的,而且建立的邏輯統一到這一處了,也提升了維護可維護性

目錄結構分析

能夠看到核心目錄3.x比2.x多了Environment和Regex目錄 核心文件3.x比2.x多了Lines.php,查看 lins.php,能夠看到裏面所有是靜態工具方法

異常3.x比2.x多了InvalidCallbackExceptionspa

env文件加載-適配器設計模式應用實戰

3.x比2.x重要的改變是多了Adapter目錄,這個是由於2.x僅支持將.env使用putenv加載到環境變量中,而3.x支持將.env加載到多個環境變量中,包括設計

  1. putenv加載到應用環境變量中
  2. array加載到數組中
  3. 加載到$_ENV全局變量中
  4. 加載到$_SERVER全局變量中 能夠看到3.x支持設置的目標更多了,可是這4鍾加載方式實際執行的代碼並不相同,dotenv爲了可以統一這四種加載方式的接口,使用了適配器模式進行統一適配成了AdapterInterface接口

每一個適配都實現這個接口

在使用時就能無差異對待了,這樣無需調用時候的if else判斷了

DotenvVariables.php#L81

一些注意的點

接口可替換設計

dotenv庫一共包含4個接口

  1. AdapterInterface
  2. FactoryInterface
  3. VariablesInterface
  4. ExceptionInterface

這些接口都是可替換的,這種面向接口的設計方式使得代碼很是容易擴展

參考資料

  1. github.com/vlucas/phpd…
  2. github.com/vlucas/phpd…
相關文章
相關標籤/搜索