1.1 單一職責(zé)原則
Single Responsibility Principle
建議:
接口一定要做到單一職責(zé)床绪,類的設(shè)計盡量做到只有一個原因引起變化
1.2 里氏替換原則
Liskov Substitution Pronciple
定義:
只要父類能出現(xiàn)的地方子類就可以出現(xiàn)袖裕,而且替換為子類也不會產(chǎn)生任何錯誤或異常。
規(guī)范:
- 子類必須完全實現(xiàn)父類的方法
- 子類可以有自己的個性
- 覆蓋或?qū)崿F(xiàn)父類的方法時輸入?yún)?shù)可以被放大
>參數(shù)不同相當(dāng)于重載诱担,不是覆寫污秆。
子類的參數(shù)范圍如果比父類小毒费,子類在沒有覆寫父類方法的前提下(將父類換為子類),子類方法可以被執(zhí)行
- 覆寫或?qū)崿F(xiàn)父類的方法時輸出結(jié)果可以被縮小
>如果是覆寫凡蜻,子類的輸出結(jié)果應(yīng) <= 父類的輸出結(jié)果
如果是重載搭综,要求子類的輸入?yún)?shù)寬于或等于父類的輸入?yún)?shù),也就是當(dāng)將用父類的地方換為子類划栓。這個方法也不會被調(diào)用设凹。
建議:
采用里氏替換時,盡量避免子類的“個性”茅姜,一旦子類有“個性”闪朱,這個子類和父類之間的關(guān)系就很難調(diào)和了,把子類當(dāng)做父類使用钻洒,自樂你的“個性”被抹殺——委屈了點奋姿;把子類單獨作為一個業(yè)務(wù)來使用,則會讓代碼見的耦合關(guān)系變得撲朔迷迷離——缺乏類替換的標(biāo)準(zhǔn)素标。
1.3 依賴倒置原則
Dependence Inversioin Principle
含義:
- 高層模塊不應(yīng)該依賴低層模塊称诗,兩者都應(yīng)該依賴其抽象
- 抽象不應(yīng)該依賴細(xì)節(jié)
- 細(xì)節(jié)應(yīng)該依賴抽象
抽象:接口或抽象類。 細(xì)節(jié):實現(xiàn)類
依賴的三種寫法:
1头遭、構(gòu)造函數(shù)傳遞依賴對象
2寓免、Setter方法傳遞依賴對象
3、接口聲明依賴對象
建議:
依賴倒置原則的本質(zhì)就是通過抽象(接口或抽象類)使個各類或模塊的實現(xiàn)彼此獨立计维,互不影響袜香,實現(xiàn)模塊間的松耦合。
- 每個類盡量都有接口或抽象類鲫惶,或者抽象類和接口
基本要求蜈首,接口和抽象類都是屬于抽象的,有了抽象才可能依賴倒置
- 變量的表面類型盡量是接口或者抽象類
注意Utils工具類和 java實現(xiàn)類的clone方法
- 任何類都不應(yīng)該從具體類派生
類的繼承層數(shù)盡量少
- 盡量不要覆寫基類的方法
如果基類是一個抽象類欠母,而且這個方法已經(jīng)實現(xiàn)了欢策,子類盡量不要再覆寫。類間的依賴是抽象赏淌,覆寫了抽象類的具體方法踩寇,對依賴的穩(wěn)定性會有一定影響。
- 結(jié)合里氏替換原則使用
規(guī)則:接口負(fù)責(zé)定義public屬性和方法六水,并且聲明與其他對象的依賴關(guān)系俺孙,抽象類負(fù)責(zé)公共構(gòu)造部分的實現(xiàn),實現(xiàn)類準(zhǔn)確的實現(xiàn)業(yè)務(wù)邏輯缩擂,同時在適當(dāng)?shù)臅r候?qū)Ω割愡M(jìn)行細(xì)化
1.4鼠冕、接口隔離原則
Interface Segregation Principle
Java接口的種類:
- 實例接口(Object Interface):Person zhangSan = new Person(); Person類就是zhangSan的接口
- 類接口(Class Interface):用interface定義的接口
定義:
- 第1種:客戶端不應(yīng)該依賴它不需要的接口
- 第2種:類間的依賴關(guān)系應(yīng)該建立在最小的接口上
概括:
接口盡量細(xì)化胯盯,同時接口中的方法盡量減少懈费。與單一職責(zé)的區(qū)別:審視角度不同,單一職責(zé)要求的是類和接口職責(zé)單一博脑,注重的職責(zé)憎乙,這是業(yè)務(wù)邏輯上的劃分票罐;接口隔離要求接口方法盡量少。職責(zé)相同泞边,訪問模塊不同:盡量使用多個專門的接口该押,每個不同模塊對應(yīng)不同的接口。
建議:
- 一個接口只服務(wù)于一個子模塊或業(yè)務(wù)邏輯
- 通過業(yè)務(wù)邏輯壓縮接口中的public方法阵谚,接口時常去回顧蚕礼,盡量讓接口達(dá)到“滿身筋骨肉”,而不是“肥嘟嘟”的一大堆方法
- 已經(jīng)被污染了的接口梢什,盡量去修改奠蹬,若變更風(fēng)險較大,則采取適配器模式進(jìn)行轉(zhuǎn)化處理嗡午。
- 了解環(huán)境囤躁,拒絕盲從。
根據(jù)經(jīng)驗和常識決定接口的粒度大小荔睹,接口粒度太小狸演,導(dǎo)致接口數(shù)據(jù)劇增,開發(fā)人員嗆死在接口的海洋里僻他;接口粒度太大宵距,靈活性降低,無法提供定制服務(wù)中姜,給整個項目帶來無法預(yù)料的風(fēng)險消玄。
1.5、迪米特法則
Law of Demeter 丢胚,也稱為最少知識原則(Least Knowedge Principle)
定義:
一個對象應(yīng)該對其他對象有最少的了解。通俗地講受扳,一個類應(yīng)該對自己需要耦合或調(diào)用的類知道得最少
四層含義:
- 只和朋友交流
- 朋友間也是有距離的
- 是自己的就是自己的
有這樣一個方法:放在本類中可以携龟,放在其他類中也沒錯,那怎么去衡量呢勘高?
如果一個方法放在本類中峡蟋,既不增加類間關(guān)系,也對本類不產(chǎn)生負(fù)面影響华望,那就放在本類中蕊蝗。 - 謹(jǐn)慎使用Serializable
VO:value object
建議:
- 迪米特法則的核心觀念就是類間的解耦,弱耦合赖舟,只有弱耦合后蓬戚,類的復(fù)用率才可以提高。其要求的結(jié)果就是產(chǎn)生了大量的中轉(zhuǎn)或跳轉(zhuǎn)類宾抓,導(dǎo)致系統(tǒng)復(fù)雜性提高子漩。
- 在實際應(yīng)用中豫喧,如果一個類跳轉(zhuǎn)兩次以上高才能訪問到另一個類,就需要進(jìn)行重構(gòu)了幢泼。因為一個系統(tǒng)的成功不僅僅是一個標(biāo)準(zhǔn)或是原則就能夠決定的紧显,有非常多的因素。跳轉(zhuǎn)次數(shù)越多缕棵,系統(tǒng)越復(fù)雜孵班,維護就越困難,所以只要跳轉(zhuǎn)不超過兩次都是可以忍受的
- 迪米特法則要求類間的解耦招驴,但解耦是有限度的重父。
1.6、開閉原則
Open Closed Principle
定義:
一個軟件實體忽匈,如類房午、模塊和函數(shù) 應(yīng)該對擴展開發(fā),對修改關(guān)閉
如何使用:
** 1. 抽象約束 **
抽象是對一組事物的通用描述丹允,沒有具體的實現(xiàn)郭厌,也就表示它可以有非常多的可能性,可以跟隨需求的變化而變化雕蔽。因此折柠,通過接口或抽象類可以約束一組可能變化的行為,并且能夠?qū)崿F(xiàn)對擴展開放批狐。其包含三層含義:
1.1. 通過接口或抽象類約束擴展扇售,對擴展進(jìn)行邊界限定,不允許出現(xiàn)在接口或抽象類中不存在的public方法嚣艇;
1.2.參數(shù)類型承冰、引用對象盡量使用接口或抽象類,而不是實現(xiàn)類食零;
1.3.抽象層盡量保持穩(wěn)定困乒,一旦確定即不允許修改。
** 2. 元數(shù)據(jù)控制模塊行為 **
元數(shù)據(jù):用來描述環(huán)境和數(shù)據(jù)的數(shù)據(jù)贰谣,通俗地說就是配置參數(shù)娜搂。參數(shù)可以從文件中獲得,也可以從數(shù)據(jù)庫中獲得
** 3. 指定項目章程 **
約定優(yōu)于配置
** 4. 封裝變化 **
- a吱抚、將相同的變化封裝到一個接口或抽象類中
- b百宇、將不同的變化封裝到不同的接口或抽象類中,不應(yīng)該有兩個不同的變化出現(xiàn)在同一個接口或抽象類中秘豹。
- 封裝變化:也就是受保護的變化(protected variations)携御,找出預(yù)計有變化或不穩(wěn)定的點,我們?yōu)檫@些變化點創(chuàng)建穩(wěn)定的接口,準(zhǔn)確地講是封裝可能發(fā)生的變化因痛,一旦預(yù)測到有變化婚苹,就可以進(jìn)行封裝。