我有幾個類,例如那些概述數據庫表結構或那些概述應用程序配置的類,它們在整個程序執行過程中根本不會改變狀態。我目前有這些類作爲單身人士和希望檢索信息的類請求類實例(例如,從公共getInstance()方法),然後繼續檢索他們所需的信息。雖然這有效,但我希望在配置時允許更多的模塊化,這是我卡住的地方。使用可互換的單例簡化調試?
我的主要目標是允許使用模塊化配置更容易的調試,同時仍保持代碼的可讀性。我不知道我將如何允許爲了調試而允許交換配置的功能,而不包括使用配置設置的類可以從中檢索正確的配置實例的另一個Singleton(tm)。
這是一個PHP Web應用程序,但沒有標記爲這樣,因爲我猜這個解決方案很可能是獨立於語言的。
編輯:爲了澄清我的問題,即使依賴注入在我的問題的答案中發癢,但讓我提供一個(也許是過度簡化的)示例。
比方說,我有一個PHP中的MySQLi類將簡單地使用任何連接信息在配置單被標識的包裝...
class Mysql {
// ...
private $mysqli;
public function __construct() {
$conf = Config::getInstance(); // Get the configuration
$this->mysqli = new Mysqli(
$conf->getHost(),
$conf->getUsername(),
$conf->getPassword()
);
// ...
}
// ...
}
在這個例子中,Mysql的類將接受只有哪些設置包含在Config中,除了Config中包含的配置外,不可能使用任何配置。在這個例子中,簡單地通過主機/用戶名/密碼/其他任何東西到構造函數可能會更有意義,但是然後它落在客戶端上使用Mysql類從Config單例中檢索它,並且問題在許多更多的類。由於它最終總是從配置中檢索依賴關係,因此無法使用此設置輕鬆嘗試不同的設置。
從我一直在閱讀的幾個地方,包括這裏的精彩評論,似乎依賴注入是我最好的選擇。對於未來的讀者,關於PHP依賴注入的一篇很好的文章我發現了here,以及對概念的簡單介紹(用Java編寫)here。
我在遇到問題時遇到問題。你能說明你的意思是「模塊化配置」,最好是通過一個例子嗎? – 2009-01-14 04:28:12