1. 程式人生 > 實用技巧 >Java開發設計六大基本原則

Java開發設計六大基本原則

一、單一職責

1、定義
  • 不要存在多於一個導致類變更的原因
2、理解
  • 一個類只負責一個職責
3、舉例
  • 手機:對於手機來說,其根本職責其實就是打電話,即有電話進來時會發出聲響。但是,目前的智慧手機綜合了各種功能,簡訊、微信、甚至鬧鐘都會導致手機發生提示聲響

二、開閉原則

1、定義
* Software entities like classes,modules and functions should be open for extension but closed formodifications.
	解釋:一個軟體實體如類、模組和函式應該對擴充套件開放,對修改關閉。

2、理解
  • 對擴充套件開發,對修改關閉
    • 當軟體需要變化時,儘量通過擴充套件軟體實體的行為來實現變化,而不是通過修改已有的程式碼來實現變化。
3、如何使用
* 抽象約束
    1.通過介面或抽象類約束擴充套件,對擴充套件進行邊界限定,不允許出現在介面或抽象類中不存在的public方法;
    2.引數型別、引用物件儘量使用介面或者抽象類,而不是實現類;
    3.抽象層儘量保持穩定,一旦確定即不允許修改。
    
* 元資料(metadata)控制模組行為
	何謂元資料?就是用來描述環境和資料的資料,通俗地說就是配置引數,引數可以從檔案中獲得,也可以從資料庫中獲得。
	
* 制定專案章程(團隊約定)

* 封裝變化
	1.將相同的變化封裝到一個介面或抽象類中;
	2.將不同的變化封裝到不同的介面或抽象類中,不應該有兩個不同的變化出現在同一個介面或抽象類中。
	3.封裝變化,也就是受保護的變化(protected variations),找出預計有變化或不穩定的點,我們為這些變化點建立穩定的介面,準確地講是封裝可能發生的變化,一旦預測到或“第六感”發覺有變化,就可以進行封裝,23個設計模式都是從各個不同的角度對變化進行封裝的

三、里氏替換

1、定義
* If for each object o1 of type S there is an object o2 oftype T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 issubstituted for o2 then S is a subtype of T.
	解釋:如果對每一個型別為S的物件o1,都有型別為T的物件o2,使得以T定義的所有程式P在所有的物件o1都代換成o2時,程式P的行為沒有發生變化,那麼型別S是型別T的子型別。
2、理解
  • 只要父類能出現的地方子類就可以出現,而且替換為子類也不會產生任何錯誤或異常
3、好處
* 程式碼共享,減少建立類的工作量,每個子類都擁有父類的方法和屬性;
* 提高程式碼的重用性;
* 子類可以形似父類,但又異於父類;
* 提高程式碼的可擴充套件性,實現父類的方法就可以“為所欲為”了;
* 提高產品或專案的開放性。

四、依賴倒置

1、定義
* High level modules should not depend upon low level modules.Both should depend uponabstractions.Abstractions should not depend upon details.Details should depend upon abstractions.

1. 高層模組不應該依賴低層模組,兩者都應該依賴其抽象;
2. 抽象不應該依賴細節;
3. 細節應該依賴抽象。

2、Java中的體現
  • 模組間的依賴通過抽象發生,實現類之間不發生直接的依賴關係,其依賴關係是通過介面或抽象類產生的;
  • 介面或抽象類不依賴於實現類;
  • 實現類依賴介面或抽象類。
3、最佳寫法
  • 建構函式傳遞依賴物件(建構函式注入),在類中通過建構函式宣告依賴物件
  • Setter方法傳遞依賴物件(Setter依賴注入),在抽象中設定Setter方法宣告依賴關係
  • 在介面的方法中宣告依賴物件(介面注入)

五、介面隔離

1、定義
* Clients should not be forced to depend upon interfaces that they don't use.
	解釋:客戶端需要什麼介面就提供什麼介面,把不需要的介面剔除掉,那就需要對介面進行細化,保證其純潔性;
2、理解
  • 介面中不存在對子類中無用的且必須實現的方法,如果有,需要對介面進行拆分
3、概括
  • 建立單一介面,不要建立臃腫龐大的介面。再通俗一點講:介面儘量細化,同時介面中的方法儘量少

六、迪米特法則

1、定義
  • 一個物件應該對其他物件有最少的瞭解
2、理解
  • 降低類與類之間的耦合度
3、概括
  • 通俗地講,一個類應該對自己需要耦合或呼叫的類知道得最少,你(被耦合或呼叫的類)的內部是如何複雜都和我沒關係,那是你的事情,我就知道你提供的這麼多public方法,我就呼叫這麼多,其他的我一概不關心。