2011年4月12日 星期二

OOAD - Dependency

這兩天看dependency / association 看到快抓狂,有些書上的資訊不是很能解釋得通,都快不知道哪一段說明才是最正確的,
再次翻閱Head First Design pattern,看到一小段範例,我覺得可以來做個簡單的註解了...

首先必須說的是,Dependency 是一種較為弱化的類別相依關係的描述,他不像是去說明 abstract / concrete / structural 的描述,對於類別結構性的描述並不是dependency要講述的內涵,dependency比較像是簡單地指出類別之間的相互存有或使用的概念,在P.138當中,舉例提到了一個 PizzaStore,再產生pizza的時候,是直接透過判斷客戶要什麼口味的pizza(傳入 type),則透過一堆 if else 來直接實際 new一個特殊口味的pizza來,這樣的動作中,我可以很清楚的理解到, PizzaStore 跟 Pizza derived classes是完全的相依了,這表示說一但 Pizza derived classes改過了,那麼我的PizzaStore的產生pizza程式就得到處改了(違反了OCP原則),像這樣的狀況,就是Dependency。

好吧,雖然還沒有勇氣去直接翻UML Spec找 Dependency定義,但就先從這樣的概念來逐步驗證我的想法了。
Dependency 可以想見的是,在某個method中傳入一個類別來使用,至於是不是一定都有初始化這就不一定了!!!

很明確的在程式中減少這麼多的依賴是對的,在OO Principle中就有這一條 : Dependency inversion Principle
通則是: 依賴抽象類別,不要依賴具象類別,也就是說在PizzaStore中再產生pizza時,是傳入一個Pizza介面,而非一個具象的Pizza類別。

顛覆相依守則的幾個原則

  • 變數不可持有具象類別的參考

  • 不要讓類別繼承自具象類別

  • 不要讓子類別中的方法override父類別的方法

沒有留言: