# 六角鼠年鐵人賽 Week 36 - Design Pattern - Dependence Inversion Principle ==大家好,我是 "為了拿到金角獎盃而努力著" 的文毅青年 - Kai== ## Jeanne d'Arc :::info I am not afraid. I was born to do this. ::: ## 主題 在上次提到了 **Liskov Substitution Principle** 後,來分享另外一個對於 **Open Close Principle** 也是影響重大的原則 -- **Dependence Inversion Principle** 中文常見名稱 **依賴反轉原則** **Dependence Inversion Principle** 是由 **RobertC.Martin** 在 1996 年 C++ Report 上發表的文章提及 原文: > High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions 其意義為: 高層次或上層的類別不應該依賴低層次或下層的類別,兩者都應該依賴抽象類別;抽象不應該依賴細節的實作,但細節的實作應該依賴抽象。 在程式設計中,方法的內容往往具有許多變化,而抽象則相對穩定,因此透過抽象類別建置的架構也會相對穩定很多,避免掉了在細節實作中的變化導致的錯誤。 ## 幫助 Dependence Inversion Principle 真正影響到了後續程式設計的發展有以下幾點: - 降低類別之間的耦合 - 減少擴展的風險 - 提高系統的可讀性與可維護性 - 提高系統架構穩定 其實現的方式遵循下列幾點: - 類別去繼承抽象或實現介面等方式,以滿足可利用抽象或介面方式提供接口 - 類別的參數盡量來自抽象或介面 - 類別的宣告盡量使用抽象或介面,而不是實體 - 繼承遵循 **Liskov Substitution Principle** ## 實例 再次以之前的 Car 為例,若我們在 Service 的類中需要取得車款的名稱 假設今天要取得 TESLA 車款的名稱,使用以下程式碼是可以執行 ```java= public class carService{ public String getCarInfo(tesla car){ return car.info(); } } ``` 假設今天要取得 BMW 車款的名稱,則可能會改成以下這樣 ```java= public class carService{ public String getCarInfo(BMW car){ return car.info(); } } ``` 假設要同時取得 TESLA 和 BMW 車款的名稱,則可能會透過寫新的 carService 或新的方法達成這件事情 ```java= /*** 建立專屬新方法 ***/ class carService{ public String getTESLAInfo(tesla car){ return car.info(); } public String getBMWCarInfo(BMW car){ return car.info(); } } /*** 建立新 service 類別 ***/ class carService1{ public String getCarInfo(BMW car){ return car.info(); } } class carService2{ public String getCarInfo(tesla car){ return car.info(); } } ``` 第一種方法會遇到後續若有 N 個車廠的車,則方法會無限擴張下去,且這些方法的重複性值非常高! 第二種方法會同樣遇到 N 個車廠建立 N 個類別的問題,同時還會造成專案過於肥大! 依照 Dependence Inversion Principle 來說,讓抽象代替實體發揮抽象的強處,改寫為以下方式 ```java= abstract Car{ public string info(); } class BMW extends Car{ ... } class tesla extends Car{ ... } public class carService{ public String getCarInfo(Car car){ return car.info(); } } ``` :::danger 與 Liskov Substitution Principle 同樣,都是感覺起來很基本的原則,但就是不知道如何對外說明清楚,基本功的不紮實全部在這次學習時候一覽無遺ORZ... 基本的原則與方是目前還有四種,等全部學習完了,希望基本功也紮實了! ::: 首頁 [Kai 個人技術 Hackmd](/2G-RoB0QTrKzkftH2uLueA) ###### tags: `Design Pattern`,`w3HexSchool`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up