※ 引述《yan04870449 (楊伯)》之銘言:
分享一下我理解的,如果有錯再請各位版友提出
: 這個原則的摘要是說
: "要依賴於抽象,而不要依賴於具體,因為抽象相對穩定。"
: 意思是說我的class裡面的function都盡量用interface來做嗎?
↑ 我覺得應該是這個
但書上有強調,他的"界面"並非強調是interface class
也可以指 abstract class。
"要依賴於抽象,而不要依賴於具體"
感覺他是在強調 decouple(鬆綁),直接操作一個abstract class,不需要new出來
不要實體化。 舉例,p是一個 abstract class
pizza p = createPizza("起司");
p.prepare();
p.cut();
而不是
pizza p = new cheesePizza();
p.prepare();
p.cut();
"因為抽象相對穩定"
這句話我是覺得他是在講說,你操作的是abstract class,此程式不需要改變
以上例來說,多一種口味的pizza,你只要在createPizza()裡加就好
前者直接操作抽象介面
也就是已經經過測試沒問題了,所以相對穩定
就我理解,Dependency inversion principle是說
你Top down的規畫程式,結果規畫到最底時,發現其實某些可以取出抽像類別
取出後,再由上位"高階元件"來操作
換句話說,如果你沒抽出抽象類別的話,則原先依賴的方向是
高階物件 -> 實體化物件1
\> 實體化物件2
…
但你把這些實體化物件,弄出一個抽象類別,依賴的圖就變成
高階物件 -> 抽象類別 <- 實踐1
<- 實踐2
…
看起來就變成 inversion
: 如果是這樣子的話,那我interface的實做到底要寫在父類別
: 還是衍生類別?或者是其他位置?
可以的話就寫在父類別,因為寫在父類別表示他的行為都一樣,所以就放到
abstract class裡面,不然一樣的事情用abstract method延到子類別來做
到時候修改,又要針對每個子類別修改,就違反書上強調的少修改程式的目的
: 另外我有在網路上爬到說,這個原則很難遵守;因為我對這個
: 原則還不太熟,所以我不太能理那文章中所提的"很難遵守",
: 想問各位前輩在進行物件導向的設計時,會刻意去遵守這些原
: 則嗎(含另外四個原則)?
深入淺出設計模式中,有提到說如何來達成DIP
他列出了3個原則 ex 不要實體化,另外兩個忘了...
但這3個原則常常會互相抵觸,可能只能達成某些原則,而其它的就會做不到。
所以才會說"很難遵守"
至於你提到的,是否會去遵守這些原則,書上有提到說
你程式一開始就規畫它不會改變,就不需要這麼麻煩
就直接實體化就好了,遵守這些方式只會造成更複雜而已
: 感謝各位。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.79.168
※ 編輯: motocyman 來自: 140.114.79.168 (06/08 10:53)
※ 編輯: motocyman 來自: 140.114.79.168 (06/08 20:06)