物件導向設計原則

2021-04-21 00:42:31 字數 2222 閱讀 2023

物件設計原則

物件導向設計原則

物件導向設計的基石是「開—閉」原則。

「開一閉」原則講的是:乙個軟體實體應當對擴充套件開放,對修改關閉。

這個規則說的是,在設計乙個模組的時候,應當使這個模組可以在不被修改的前提下被擴充套件。

從另外乙個角度講,就是所謂的「對可變性封裝原則」。「對可變性封裝原則」意味著兩點:

1 .一種可變性不應當散落在**的很多角落裡,而應當被封裝到乙個物件裡面。同一種可變性的不同表象意味著同乙個繼承等級結構中的具體子類。

2.一種可變性不應當與另一種可變性混合在一起。即類圖的繼承結構一般不應超過兩層。

做到「開—閉」原則不是一件容易的事,但是也有很多規律可循,這些規律同樣也是設計原則,它們是實現開—閉原則的工具。

黎克特制代換原則

黎克特制代換原則:如果對每乙個型別為t1的物件o1,都有型別為t2的物件o2,使得以t1定義的所有程式p在所有物件o1都換成o2時,程式p的行為沒有變化,那麼型別t2是t1的子型別。

即如果乙個軟體實體使用的是基類的話那麼也一定適用於子類。但反過來的代換不成立。

如果有兩個具體類a和b之間的關係違反了黎克特制代換原則,可以在以下兩種重構方案中選擇一種:

1 .建立乙個新的抽象類c,作為兩個具體類的超類,將a和b共同的行為移動到c中,從而解決a和b行為不完全一致的問題。

2 .從b到a的繼承關係改寫為委派關係。

依賴倒轉原則

依賴倒轉原則講的是:要依賴於抽象,不要依賴於具體。即針對介面程式設計,不要針對實現程式設計。針對介面程式設計的意思是,應當使用介面和抽象類進行變數的型別宣告、參量的型別宣告,方法的返還型別宣告,以及資料型別的轉換等。不要針對實現程式設計的意思就是說,不應當使用具體類進行變數的型別宣告、參量的型別宣告,方法的返還型別宣告,以及資料型別的轉換等。

依賴倒轉原則雖然強大,但卻不易實現,因為依賴倒轉的緣故,物件的建立很可能要使用物件工廠,以避免對具體類的直接引用,此原則的使用還會導致大量的類。維護這樣的系統需要較好的物件導向的設計知識。

此外,依賴倒轉原則假定所有的具體類都是變化的,這也不總是正確的。有一些具體類可能是相當穩定、不會發生變化的,消費這個具體類例項的客戶端完全可以依賴於這個具體類。

介面隔離原則

介面隔離原則講的是:使用多個專門的介面比使用單一的介面要好。從客戶的角度來說:乙個類對另外乙個類的依賴性應當是建立在最小的介面上的。如果客戶端只需要某一些方法的話,那麼就應當向客戶端提供這些需要的方法,而不要提供不需要的方法。提供介面意味著向客戶端作出承諾,過多的承諾會給系統的維護造成不必要的負擔。

合成、聚合復用原則

合成、聚合復用原則就是在乙個新的物件裡面使用一些已有的物件,使之成為新物件的一部份,新的物件通過向這些物件的委派達到復用已有功能的目的。這個原則有乙個簡短的描述:要盡量使用合成、聚合,盡量不要使用繼承。

合成、聚合有如下好處:

新物件訪問成分物件的唯一方法是通過成分物件的介面。

這種復用是黑箱復用,因為成分物件的內部細節是新物件所看不到的。

這種復用可以在執行時間內動態進行,新物件可以動態的引用與成分物件型別相同的物件。

合成、聚合可以應用到任何環境中去,而繼承只能應用到一些有限環境中去。

導致錯誤的使用合成、聚合與繼承的乙個常見原因是錯誤的把「has-a」關係當作「is-a」關係。如果兩個類是「has-a」關係那麼應使用合成、聚合,如果是「is-a」關係那麼可使用繼承。

迪公尺特法則

迪公尺特法則說的是乙個物件應該對其它物件有盡可能少的了解。即只與你直接的朋友通訊,不要跟陌生人說話。如果需要和陌生人通話,而你的朋友與陌生人是朋友,那麼可以將你對陌生人的呼叫由你的朋友**,使得某人只知道朋友,不知道陌生人。換言之,某人會認為他所呼叫的是朋友的方法。

以下條件稱為朋友的條件:

當前物件本身。

以參量的形式傳入到當前物件方法中的物件。

當前物件的例項變數直接引用的物件。

當前物件的例項變數如果是乙個聚集,那麼聚集中的元素也都是朋友。

當前物件所建立的物件。

任何乙個物件,如果滿足上面的條件之一,就是當前物件的朋友,否則就是陌生人。

迪公尺特法則的主要用意是控制資訊的過載,在將其運用到系統設計中應注意以下幾點:

在類的劃分上,應當建立有弱耦合的類。類之間的耦合越弱,就越有利於復用。

在類的結構設計上,每乙個類都應當盡量降低成員的訪問許可權。乙個類不應當public自己的屬性,而應當提供取值和賦值的方法讓外界間接訪問自己的屬性。

在類的設計上,只要有可能,乙個類應當設計成不變類。

在對其它物件的引用上,乙個類對其它物件的引用應該降到最低。

物件導向設計原則

oo原則 封裝變化 多用組合,少用繼承 針對介面程式設計,不針對實現程式設計 為互動物件之間的松耦合而努力 類應該對擴充套件開放,對修改關閉 依賴抽象,不要依賴具體類 只和朋友交談 別找我,我會找你 類應該只有乙個改變的理由 從設計原則到設計模式 針對介面程式設計,而不是針對實現程式設計 客戶無需知...

物件導向設計原則

oo原則 封裝變化 多用組合,少用繼承 針對介面程式設計,不針對實現程式設計 為互動物件之間的松耦合而努力 類應該對擴充套件開放,對修改關閉 依賴抽象,不要依賴具體類 只和朋友交談 別找我,我會找你 類應該只有乙個改變的理由 從設計原則到設計模式 針對介面程式設計,而不是針對實現程式設計 客戶無需知...

物件導向設計原則

原文 單一職責原則 srp 乙個物件應該值包含單一的職責,並且該職責被完整地封裝在乙個類中。另一種表述 就乙個類而言,應該僅有乙個引起它變化的原因。開放封閉原則 ocp 軟體實體 類 模組 函式等 應該可以擴充套件,但是不可修改。也就是說在設計乙個軟體實體 類,模組等 的時候,應該使這個軟體實體在不...