看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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)