物件導向設計原則

2021-09-11 08:21:55 字數 1746 閱讀 8553

什麼是軟體架構?可以用多個層次來解答。最高層,軟體模式定義整體軟體的結構。第二層,和軟體應用的目的有關。

第三層,它可以是模組劃分和模組互聯,這是設計模式的領域,比如包,類,元素,這個層次是本文研究的主題。

很多軟體的設計以乙個非常清晰的設計開始,但是再過一段時間,軟體的設計開始變質,慢慢在軟體的迭代中凸顯出來。即使微小的改動影響很大。以至於迫切要求軟體重構。

這種重構很少能夠成功,即使設計者初始目的沒錯,但是他們會發現在打移動靶,因為系統不斷發展和迭代,新的需求必須跟上,但老系統的毛病不斷在新的設計中積累,最終「亦使後人而復哀後人矣」。

糟糕的設計會有四個特點,

這四種特徵是糟糕架構的典型特徵。乙個應用如果表現出這種特徵,那就是爛到骨子裡了,成為豆腐渣工程。

設計退化的直接原因非常好理解,原始的設計沒有預料到的需求改動,導致一些不是特別了解原始設計方案的工程師做設計妥協,積少成多,最終無可救藥。但是,我們不能將責任歸於需求改動上,因為如果軟體設計不能做到彈性,當需求改動時能靈活調整,那就是設計本身的問題。

什麼導致了設計變得糟糕,因為新的,未在計畫內的依賴引入,導致模組間不合理的依賴布局。

為了阻止這種悲劇,需要建立依賴防火牆,使得乙個被劃分的域內,整體來看不依賴於任何其他域。

簡稱ocp原則,模組開放地接收擴充套件而不是接收修改。模組寫好了,可以新增新的類去修改整個模組的功能(即擴充套件),而不是修改原來寫好的類。

可以理解為物件導向中的繼承,子類可以完全替代基類。

基類功能是子類功能的子集,子類不能破壞從父類繼承來的功能約定。這通常由於不合理的繼承設計。

depend upon abstractions. do not depend upon concretions.
因為抽象類和介面是不容易變的(遵照ocp原則,你甚至不該去改變它),而且抽象類和介面是程式實現和程式設計的咬合點,是設計可以擴充套件和改變的地方,乙個合格的軟體結構應該是這樣。

介面定義了乙個物件需要什麼依賴,初始化時,物件本身不負責初始化自己的依賴,而是由容器(其他人)負責依賴注入。

many client specific inte***ces are better than one general

purpose inte***ce

這個原則其實說的是,不應該設計臃腫介面,抽象要分層次,乙個臃腫介面試圖包羅永珍,導致**臃腫,耦合度高。

這個原則其實是介面設計應該遵守的規範。如果乙個外部介面提供乙個大的方面的功能,比如啥?還是比如還是機動車輛(vehicle)和小汽車(car)和貨車(trunk)

乙個方法按說應該只接收介面,這是di給我們的提示。

比如上面的設計就是乙個反例,貨車有敞篷功能簡直就是扯淡,但是還得去實現它,所以兩種不同類別的子類的具體邏輯汙染了介面,導致介面變臃腫。乙個改進方法是將抽象分層,像下面這樣:

這樣實現乙個介面層次,能將給模組更小的耦合性,也符合di給我們的暗示。

移步迪公尺特法則

物件導向設計原則

oo原則 封裝變化 多用組合,少用繼承 針對介面程式設計,不針對實現程式設計 為互動物件之間的松耦合而努力 類應該對擴充套件開放,對修改關閉 依賴抽象,不要依賴具體類 只和朋友交談 別找我,我會找你 類應該只有乙個改變的理由 從設計原則到設計模式 針對介面程式設計,而不是針對實現程式設計 客戶無需知...

物件導向設計原則

物件設計原則 物件導向設計原則 物件導向設計的基石是 開 閉 原則。開一閉 原則講的是 乙個軟體實體應當對擴充套件開放,對修改關閉。這個規則說的是,在設計乙個模組的時候,應當使這個模組可以在不被修改的前提下被擴充套件。從另外乙個角度講,就是所謂的 對可變性封裝原則 對可變性封裝原則 意味著兩點 1 ...

物件導向設計原則

oo原則 封裝變化 多用組合,少用繼承 針對介面程式設計,不針對實現程式設計 為互動物件之間的松耦合而努力 類應該對擴充套件開放,對修改關閉 依賴抽象,不要依賴具體類 只和朋友交談 別找我,我會找你 類應該只有乙個改變的理由 從設計原則到設計模式 針對介面程式設計,而不是針對實現程式設計 客戶無需知...