solid 設計原則
其他設計原則
物件導向的 solid 原則
隱藏物件的屬性和實現細節,通過對外暴露的介面控制程式中屬性的讀寫。
封裝需要把所有屬性私有化,對每個屬性提供 getter 和 setter 方法。如果有乙個帶參的建構函式的話,還需要寫乙個不帶參的建構函式。
通過繼承可以實現**的復用。
缺點是提高了類之間的耦合性。
基於物件所屬類的不同,外部對同乙個方法的呼叫,實際執行的邏輯不同。
要想實現多型,需要在繼承+覆蓋或過載。
物件導向的 solid 設計原則:
乙個類只做一件事。
比如訂單和賬單,都包括訂單號、建立時間等資訊,但是如果只用乙個類來表達,會導致:
實體應該對擴充套件是開放的,對修改是封閉的。即可擴充套件而不可修改。**可能變化,就在**抽象。
例如,對於支付場景,如果將多種支付方式整合到乙個類中,每次新增一種新的支付方式都需要變更這個類,並可能導致已有的支付方式受到影響而無法使用。可以將其抽象為抽象類或介面,每種支付方式繼承抽象類或實現介面。
inte***ce payprocessor
public
class
alipayprocessor
implements
payprocessor
public
class
wechatpayprocessor
implements
payprocessor
在物件出現的任何地方,都可以用其子類例項進行替換,而不會導致程式錯誤,且軟體功能不受影響。
對於繼承關係,只有滿足裡式替換原則才算合理。黎克特制替換原則的關鍵在於不能覆蓋父類的非抽象方法。父類實現好的方法設定了一系列規範和契約,雖然它不強制要求所有的子類必須遵從這些規範,但是如果子類對這些非抽象方法任意修改,就會對整個繼承體系造成破壞。
例如,b 在繼承 a 時,修改了其非抽象方法:
class
a }
class
bextends
a public
int func2(int a, int b)
}public
class
client
}
客戶不應被強迫依賴它不使用的方法。乙個類實現的介面中,包含了它不需要的方法。將介面拆分成更小和更具體的介面,有助於解耦,從而更容易重構、更改。
inte***ce
paychannel
class
alipaychannel
implements
paychannel
public
void refund()
}class
wechatchannel
implements
paychannel
public
void refund()
}
可以用於將業務和底層模組解耦(例如底層邏輯經常變化,或預計會在一段時間後替換底層模組)。
button 物件用於感知外部環境。lamp 物件用於影響外部環境。
下圖直接使用繼承。此時 lamp 物件的任何修改都會影響到 button 物件。這個模型可以通過反轉 lamp 物件的依賴性來改進。
下圖使用了依賴倒置原則。button 物件現在擁有乙個與 buttonserver 相關的關聯,它提供了 button 可以用來開啟或關閉某些東西的介面。lamp 實現 buttonserver 介面。此時,button 物件可以控制所有實現了 buttonserver 介面的物件,更靈活,同時還可以控制目前尚未建立的物件。
假設目前使用 mysql,但是後面可能換成其它資料庫。針對 mysql 的實現類 mysqldbutil 程式設計的話,後續假設又建立了 oracledbutil,則替換的工作量相當大。而如果加乙個抽象層介面 dbutil,所有的資料庫類(mysqldbutil、oracledbutil)都實現 mysqldbutil 介面,就可以輕鬆替換。
原設計,直接繼承資料庫操作類:
新設計,增加抽象層介面。注意,這裡用關聯關係代替了繼承關係,具體參考下面的合成復用原則:
合成復用原則(composite reuse principle, crp):盡量使用物件組合和聚合關係,而不是繼承。組合和聚合關係可以降低類之間的耦合度。如果使用繼承,需要嚴格遵循黎克特制替換原則。
資料庫工具類:
class
dbutil
繼承關係:
class
userdao
extends
dbutil
聚合關係:
class userdao
迪公尺特法則又叫最少知道原則:乙個物件應該對其他物件保持最少的了解。
迪公尺特法則特點:
舉個例子:連長、班長、士兵之間布置任務,連長只需要傳達給其直接下屬班長,班長再傳達給其負責的士兵(下圖左側示例)。如果違反了迪公尺特法則,將導致混亂及高耦合度(下圖右側示例)。
物件導向三大特性,五大原則
三大特性是 封裝,繼承,多型 所謂封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。封裝是物件導向的特徵之一,是物件和類概念的主要特性。簡單的說,乙個類就是乙個封裝了資料以及操作這些資料的 的邏輯實體。在乙個物件內部,某些 或某些資料...
物件導向三大特性,五大原則
透切理解物件導向三大基本特性是理解物件導向五大基本原則的基礎 三大基本特性 封裝,繼承,多型 封裝,就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。乙個類就是乙個封裝了資料以及操作這些資料的 的邏輯實體。在乙個物件內部,某些 或某些資料可以...
物件導向三大特性五大原則
封裝,就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。乙個類就是乙個封裝了資料以及操作這些資料的 的邏輯實體。在乙個物件內部,某些 或某些資料可以是私有的,不能被外界訪問。通過這種方式,物件對內部資料提供了不同級別的保護,以防止程式中無關的...