設計原則-SOLID+D
設計是有限度的,不能無限的考慮將來的變動狀況,不然就會陷入設計的泥潭中而不能自拔編程
- S單一職責原則Single Responsibility Principle,SRP
定義: 應該有且僅有一個緣由引發類的變動。測試
單一職責原則要求一個接口或類只有一個緣由引發變化,也就是一個接口或類只有一個職責,它就負責一件事情。設計
優勢:對象
- 類的複雜性下降,實現什麼職責都有清晰明確的定義;
- 可讀性提升;
- 可維護性提升;
- 變動引發的風險下降,變動時必不可少的,若是接口的單一職責作得好,一個接口修改只對相應的實現類有影響,對其餘的接口無影響,這對系統的擴展性、維護性都有很大的幫助。
- O開閉原則Open Closed Principle,ocp
定義:軟件實體應該對擴展開放,對修改關閉,其含義是說一個軟件實體應該經過擴展來實現變化,而不是經過修改已有的代碼來實現變化。繼承
開閉原則是Java世界裏最基礎的設計原則,它指導咱們如何創建一人穩定的、靈活的系統。接口
開閉原則告訴咱們應該儘可能經過擴展軟件實體的行爲來實現變化而不是經過修改已有的代碼來完成變化,它是爲軟件實體的將來時間而定製的對現行開發設計進行約束的一個原則。ip
開閉原則是抽象類,其餘的原則是具體的實現類。ci
優勢:開發
- 開閉原則對測試的影響:只須要保證新增類的正確性,不須要修改原來代碼;
- 提升複用性:全部的邏輯是從原子邏輯組合而來的,而不是一個類中獨立實現一個業務邏輯。這樣代碼才能夠複用。複用減小代碼量,避免相同的邏輯分散在多個角落,避免往後維護人員爲了修改一個微小的缺陷或增長新功能而要在項目中處處查找相關代碼;
- 開閉原則提升複用性:擴展的時候不須要維護原有類;
- 應對面向對象開發的要求:抽象接口;
- L里氏替換原則Liskov Substitution Principle,LSP
定義:只要父類能出現的地方子類就可以出現,並且替換爲子類也不會產生任何錯誤或異常,使用者可能根本就不須要指導是父類仍是子類。可是,反過來就不行了,有子類出現的地方,父類未必能適應。it
規範:
- 子類必須徹底實現父類的方法。若是子類不能完整的實現父類的方法,或者父類的某些方法在子類中已經發生畸變,則建議斷開父子繼承關係,採用依賴、彙集、組合等關係代替。
- 子類能夠有本身的個性。
- 覆蓋或實現父類的方法時輸入參數能夠被放大。利用重載實現。
- 覆寫或實現父類的方法時輸出結果能夠被縮小。
優勢: 面向對象的語言中,繼承是必不可少的,具備代碼共享、多態、擴展性等優勢,可是也加強了耦合性,下降了靈活性,因此須要里氏替換原則減小弊端,發揮優勢。
- I接口隔離原則Interface Segregation Principle
定義:客戶端不應依賴他不須要的接口,類間的依賴關係應該創建在最小的接口上。
創建單一接口,不要創建龐大臃腫的接口
接口分類:
- 實例接口:Java中的類也是一種接口
- 類接口:interface關鍵字定義的接口
接口隔離原則與單一職責原則是不同的:接口隔離原則與單一職責的審視角度是不相同的,單一職責要求的是類和接口職責單一,注重的是職責,這是業務邏輯上的劃分,而接口隔離原則要求接口的方法儘可能少。
接口隔離原則是對接口進行規範約束:
- 接口要儘可能小。根據接口隔離原則拆分接口時,首先必須知足單一職責原則;
- 接口要高內聚。接口中儘可能少公佈public方法,接口是對外的承諾,承諾越少對系統的開發越有利,變動的風險也越少,同時也有利於下降成本;
- 定製服務。拆分接口,只提供個體須要的服務;
- 接口設計是有限度的;
最佳實踐:
- 一個接口只服務於一個子模塊或業務邏輯;
- 經過業務邏輯壓縮接口中的public方法;
- 已經被污染的接口,儘可能去修改,若變動的風險較大,則採用適配器模式進行轉化處理; 瞭解環境,拒絕盲從。
- D依賴倒置原則Dependence Inversion Principle,DIP
含義:
- 高層模塊不該該依賴低層模塊,二者都應該依賴其抽象;
- 抽象不該該依賴細節;
- 細節應該依賴抽象;
表現:
- 模塊間的依賴經過抽象發生,實現類之間不發生直接的依賴關係,其依賴關係是經過接口或抽象類產生的;
- 接口或抽象不依賴於實現類;
- 實現類依賴接口或抽象類。
面向接口編程
採起依賴倒置原則能夠減小類間的耦合性,提升系統的穩定性,下降並行開發引發的風險,提升代碼的可讀性和可維護性。
抽象是對實現的約束,對依賴着而言,也是一種契約,不只僅約束本身,還同時約束本身與外部的關係,其目的是保證全部的細節不脫離契約的範疇,確保約束雙方按照既定的契約共同發展。 最佳實踐:
- 每一個類儘可能都有接口或抽象類,或者抽象類和接口都具有;
- 變量的表面類型儘可能是接口或者是抽象類;
- 任何類都不應從具體類派生
- 儘可能不要覆寫基類的方法;
- 結合里氏替換原則使用。
- D迪米特法則Law of Demeter,LOD
定義:應該對其餘對象有最少的瞭解。
迪米特法則的核心觀念就是類間解耦,弱耦合,只有弱耦合以後,類的複用率才能夠提升。