介紹
SOLID 原則是由 5 個設計原則組成的,分別為:(S)單一職責原則、(O)開閉原則、(L)里式替換原則、(I)接口隔離原則和(D)依賴反轉原則;
單一職責原則 SRP
單一職責原則的英文是 Single Responsibility Principle,縮寫為 SRP;
它的意思是一個類或者模塊只負責完成一個職責,也就是說不要設計大而全的類,要設計粒度小、功能單一的類;
換個角度講,就是一個類如果包含兩個或兩個以上業務不相干的功能,那它就不滿足單一職責原則,比如一個類包含了用戶的操作和訂單操作;
如何判斷一個類是否單一呢?其實還是要根據實際情況來分析,例如:我們可以先寫個大概的類來滿足現有的業務需求,當這個類業務不斷擴展,代碼越來越多時,這時候我們就需要考慮拆分為幾個更細的顆粒度;
開閉原則 OCP
開閉原則的英文全稱是 Open Closed Principle,簡寫為 OCP;
它的意思是軟件實體(模塊、類、方法等)應該對擴展開放、對修改關閉,即應該在已有代碼基礎上拓展代碼,而不是直接修改已有代碼(當然並不是說完全不修改代碼,而是以最小修改代碼的代價來完成新功能開發);
換個角度講,就是一段代碼是否易擴展,如果某段代碼能應對未來需求變化時,做到開閉原則,那就是說明這段代碼擴展性好;
里式替換原則 LSP
里式替換原則的英文翻譯是:Liskov Substitution Principle,縮寫為 LSP;
它的意思是父類定義了函數的約定,子類可以改變函數的內部實現邏輯,但不能改變函數原有的約定,即不破壞原有程序的正確性(這里的約定包括:函數聲明要實現的功能;對輸入、輸出、異常的約定;甚至包括注釋中所羅列的任何特殊說明);
換個角度,比如,父類定義了一個按照數量排序的函數,而子類重寫了這個函數是按日期來排序的,這就違反了里式替換;或者說父類定義了函數拋出TestException異常,那么子類設計時只能允許拋出TestException異常,其他任何異常拋出都不行;
接口隔離原則 ISP
接口隔離原則的英文翻譯是“ Interface Segregation Principle”,縮寫為 ISP;
它的意思是客戶端不應該被強迫依賴它不需要的接口,這里的接口可以理解為1:api接口集合 2:單個api接口或者函數 3:oop中的接口;
換個角度,比如,一個接口有查詢的函數又有刪除的函數,如果一個類實現了這個接口,但只用到查詢的函數,而更新函數不用,就違反了接口隔離原則;
依賴反轉原則 DIP
依賴反轉原則的英文翻譯是 Dependency Inversion Principle,縮寫為 DIP;
它的意思是高層模塊不依賴低層模塊,它們共同依賴同一個抽象。抽象不要依賴具體實現細節,具體實現細節依賴抽象。這里的高層模塊為調用者,底層模塊為被調用者;
換個角度,比如,tomcat是運行web應用程序的容器,web應用部署在tomcat下,便可被tomcat調用執行,所以tomcat為高層模塊,web應用程序為底層模塊。tomcat和應用程序代碼之間沒有直接依賴關系,而是兩者依賴同一個抽魈,即servlet規范;