1“開(kāi)-閉”原則:一個(gè)軟件實(shí)體應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉,這個(gè)原則說(shuō)的是,在設(shè)計(jì)一個(gè)模塊的時(shí)候,應(yīng)當(dāng)使這個(gè)模塊可以在不被修改的前提下被擴(kuò)展,換言之,應(yīng)當(dāng)可以在不被修改源代碼的情況下改變這個(gè)模塊的行為。
2對(duì)可變性的封裝原則:找到一個(gè)系統(tǒng)的可變因素,將它封裝起來(lái)。
3將一個(gè)進(jìn)行多次條件轉(zhuǎn)移的商業(yè)邏輯封裝到不同的具體子類(lèi)中,從而使用多態(tài)性來(lái)代替條件轉(zhuǎn)移語(yǔ)句。
4由于抽象類(lèi)不可以實(shí)例化,因此一個(gè)設(shè)計(jì)師設(shè)計(jì)一個(gè)新的抽象類(lèi),一定是用來(lái)繼承的,而這一聲明倒過(guò)來(lái)也是對(duì)的:具體子類(lèi)不是用來(lái)繼承的。
5在一個(gè)從抽象類(lèi)到多個(gè)具體類(lèi)的繼承關(guān)系中,共用的代碼應(yīng)當(dāng)盡量移動(dòng)到抽象類(lèi)里。
6與代碼的移動(dòng)方向相反,數(shù)據(jù)的移動(dòng)方向是從抽象類(lèi)到具體類(lèi)。
7一般而言,如果兩個(gè)具體類(lèi)A和B有繼承關(guān)系,那么一個(gè)最簡(jiǎn)單的修改方法應(yīng)當(dāng)是建立一個(gè)抽象類(lèi)C,然后讓類(lèi)A和類(lèi)B成為抽象類(lèi)C的子類(lèi)。
8要針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程,要保證做到這一點(diǎn),一個(gè)具體Java類(lèi)應(yīng)當(dāng)只實(shí)現(xiàn)Java接口和抽象Java類(lèi)中而不應(yīng)當(dāng)給出多余的方法。
9只要一個(gè)被引用的對(duì)象存在抽象類(lèi)型,就應(yīng)當(dāng)在任何引用此對(duì)象的地方使用抽象類(lèi)型,包括參量的類(lèi)型聲明、方法返回類(lèi)型的聲明、屬性變量的類(lèi)型聲明等。
10優(yōu)先考慮將一個(gè)類(lèi)設(shè)置為不變類(lèi),即使一個(gè)類(lèi)必須是可變類(lèi),在給它的屬性設(shè)置賦值方法的時(shí)候,也要保持吝嗇的態(tài)度。
11盡量降低成員的訪問(wèn)權(quán)限。
12如果一個(gè)類(lèi)可以設(shè)置成package-private的,那么就不應(yīng)當(dāng)將它設(shè)置為public。
13在需要一個(gè)變量的時(shí)候才聲明它,可以有效地限制局部變量的有效范圍。
14一般而言,for循環(huán)比while循環(huán)稍好一點(diǎn)。
15要針對(duì)抽象編程,不要針對(duì)具體編程。