Single Responsibility Principle(單一職責原則)
面向接口編程中:
- 接口設計要做到單一
不要混合不同用途的方法,復雜接口拆分成若干接口 - 接口方法參數單一
不要有很多參數同時修改很多數據,也要拆分成若干接口
類設計:
- 功能單一
一個類不要聚集太多功能,做到僅有一個原因引起對類的修改。 - 合理劃分粒度
類的功能不能劃的太細,否則會造成類數量太多,同時類間組合增加,也造成了高耦合。
類的功能也不能劃的太粗,否則一個類功能太多,動不動就要被修改。
好處:
- 類的復雜性降低
- 可讀性提高
- 可維護性提高
- 變更引起的風險更低
Open Closed Principle(開放關閉原則)
對擴展開放,對修改關閉;擁抱擴展,拒絕修改。
- 通過添加新的子類來擴展功能
- 不要通過修改當前類去擴展功能
好處:
- 便于測試
只需要測試新添加的子類,因為以前的類并沒有修改。 - 提高復用性
擴展方式帶來了更多的代碼復用 - 提高可維護性
實現:
抽象約束
a. 通過接口,抽象類約束擴展,對擴展進行邊界限定
b. 引用對象,使用接口或抽象類,而不是實現類
c. 抽象層保持穩定,不隨意修改元數據控制模塊行為
即配置化,通過配置來完成功能設定,而不是修改代碼制定開發規范
按照規范進行需求開發,功能擴展,以達來良好了代碼結構封裝變化
a. 將相同的變化,封裝到一個接口,或抽象類中
b. 將不同的變化,封裝到不同的接口,或抽象類中
Liskov Substitution Principle(里氏替換原則)
簡單的說,方法中的參數類型聲明為接口或抽象類,方便調用時傳入不同子類的對象。
“父類能出現的地方,子類就能出現;但子類出現的地方,父類不一定能出現”,意思是說如果方法的參數是基類,則可以傳入任意子類對象,但如果參數是子類型,則不一定可以傳入基類對象了。
前置條件:
方法的輸入參數,子類方法的前置條件范圍,比父類方法前置條件范圍大;反之則不行。
數據流為,從父類到子類,從外到內。所以父類方法參數對象,要能轉換成子類方法參數對象,所以子類參數要是父類參數的基類。
后置條件:
方法的返回參數,子類方法的后置條件范圍, 比父類方法后置條件的范圍小。
數據流為,從子類到父類,從內到外。所以子類方法參數對象,要能轉換成父類方法參數對象,所以父類參數要是子類參數的基類。
Interface Segregation Principle(接口分離原則)
意思是接口要細分,不能用一個接口實現太多用途的方法,因為實現類要實現那些不會用到的方法
控制好接口的粒度很重要,太細會倒置接口數量劇增,使用麻煩;粒度太大,靈活性降低,無法提供定制服務
接口分離與單一職責看起來很像,但其實角度是不同的。單一職責是從業務的角度去分析,業務功能是不是單一;而接口分離,則是說一個接口中的方法不應該太多,對不同的調用模塊,提供不同的接口。
Law of Demeter 迪米特法則
也稱最少知識原則。
一個對象,應該對其它對象有最少的了解。私有化不需要公開的接口。公開的接口越多,修改時帶來的風險也就越多。
Dependency Inversion Principle(依賴倒置原則)
就是面向接口(或抽象類)編程,方法的接口參數類型,要使用接口或抽象類型,避免依賴具體的實現類
- 接口或抽象類不依賴于實現類
- 實現類依賴接口或抽象類
- 模塊間通過抽象發生依賴,實現類間不發生直接依賴,而是通過接口或抽象類產生依賴