物件導向的設計原則

2021-10-25 05:41:51 字數 2678 閱讀 4230

我覺得能成為一名程式設計師,至少不會是乙個笨的人,要完成乙個功能,總能想辦法實現,但實現的方法思路卻有好有壞,不過我認為思路可以被引導,軟體開發不是才剛開始,它已經存在一段時間,我們可以吸收前人的一些經驗教訓來提高自己,幫我們總結了很多問題的解決思路。這是設計原則帶給我們的便利。

類的主要設計原則有七個,包括:開閉原則、黎克特制代換原則、迪公尺特原則(最少知道原則)、單一職責原則、介面分隔原則、依賴倒置原則、組合/聚合復用原則。

七大原則之間並不是相互孤立的,彼此間存在著一定關聯,乙個可以是另乙個原則的加強或是基礎。違反其中的某乙個,可能同時違反了其餘的原則。

乙個類有且僅有乙個職責,只有乙個引起它變化的原因。

簡單來說乙個類只做好一件事就行,不去管跟自己不相干的,狗拿耗子多管閒事,其核心就是解耦以及高內聚。這個原則看著很簡單,我們在寫**的時候即便不知道這個原則也會往這個方向靠攏,寫出功能相對單一的類,不過這個原則很容易違背,因為可能由於某種原因,原來功能單一的類需要被細化成顆粒更小的職責1跟職責2,所以在每次迭代過程中可能需要重新梳理重構之前編寫的**,將不同的職責封裝到不同的類或者模組中。

軟體實體(模組,類,方法等)應該對擴充套件開放,對修改關閉。

概念理解

開閉原則是指在進行物件導向設計中,設計類或其他程式單位時,應該遵循:

對擴充套件開放(open)

對修改關閉(closed) 的設計原則。

開閉原則是判斷物件導向設計是否正確的最基本的原理之一。

根據開閉原則,在設計乙個軟體系統模組(類,方法)的時候,應該可以在不修改原有的模組(修改關閉)的基礎上,能擴充套件其功能(擴充套件開放)。

擴充套件開放:某模組的功能是可擴充套件的,則該模組是擴充套件開放的。軟體系統的功能上的可擴充套件性要求模組是擴充套件開放的。

修改關閉:某模組被其他模組呼叫,如果該模組的源**不允許修改,則該模組修改關閉的。軟體系統的功能上的穩定性,持續性要求模組是修改關閉的。

該原則的定義:不能強迫使用者去依賴那些他們不使用的介面。簡單來說就是客戶端需要什麼介面,就提供給它什麼樣的介面,其它多餘的介面就不要提供,不要讓介面變得臃腫,否則當物件乙個沒有使用的方法被改變了,這個物件也將會受到影響。介面的設計應該遵循最小介面原則,其實這也是高內聚的一種表現,換句話說,使用多個功能單

一、高內聚的介面總比使用乙個龐大的介面要好。

所有引用基類的地方必須能透明地使用其派生類的物件。

概念理解

也就是說,只有滿足以下2個條件的oo設計才可被認為是滿足了lsp原則:

不應該在****現if/else之類對派生類型別進行判斷的條件。

派生類應當可以替換基類並出現在基類能夠出現的任何地方,或者說如果我們把**中使用基類的地方用它的派生類所代替,**還能正常工作。

「設計要依賴於抽象而不是具體化」。換句話說就是設計的時候我們要用抽象來思考,而不是一上來就開始劃分我需要哪些哪些類,因為這些是具體。

「high level modules should not depend upon low level modules, both

should depend upon abstractions. abstractions should not depend upon

details, details should depend upon abstractions.」

高層模組不應該依賴低層模組,它們都應該依賴抽象。抽象不應該依賴於細節,細節應該依賴於抽象。

另一種表述為: 要針對介面程式設計,不要針對實現程式設計。即「program to an inte***ce, not an implementation.」

優點:人的思維本身實際上就是很抽象的,我們分析問題的時候不是一下子就考慮到細節,而是很抽象的將整個問題都構思出來,所以面向抽象設計是符合人的思維的。另外這個原則會很好的支援(開閉原則)ocp,面向抽象的設計使我們能夠不必太多依賴於實現,這樣擴充套件就成為了可能。

迪公尺特原則(law of demeter)又叫最少知道原則(least knowledge principle),可以簡單說成:talk only to your immediate friends,只與你直接的朋友們通訊,不要跟「陌生人」說話。

概念理解

對於面向ood來說,又被解釋為下面兩種方式:

1)乙個軟體實體應當盡可能少地與其他實體發生相互作用。

2)每乙個軟體單位對其他的單位都只有最少的知識,而且侷限於那些與本單位密切相關的軟體單位。

當前物件本身(this)

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

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

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

當前物件所建立的物件

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

1) 定義

盡量採用組合(contains-a)、聚合(has-a)的方式而不是繼承(is-a)的關係來達到軟體的復用目的

2)基本概念

如果新物件的某些功能在別的已經建立好的物件裡面已經實現,那麼應當盡量使用別的物件提供的功能,使之成為新物件的一部分,而不要再重新建立

組合/聚合的優缺點:類之間的耦合比較低,乙個類的變化對其他類造成的影響比較少,缺點:類的數量增多實現起來比較麻煩

繼承的優點:由於很多方法父類已經實現,子類的實現會相對比較簡單,缺點:將父類暴露給了子類,一定程度上破壞了封裝性,父類的改變對子類影響比較大

3)優點

可以降低類與類之間的耦合程度

提高了系統的靈活性

物件導向設計原則

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

物件導向設計原則

物件設計原則 物件導向設計原則 物件導向設計的基石是 開 閉 原則。開一閉 原則講的是 乙個軟體實體應當對擴充套件開放,對修改關閉。這個規則說的是,在設計乙個模組的時候,應當使這個模組可以在不被修改的前提下被擴充套件。從另外乙個角度講,就是所謂的 對可變性封裝原則 對可變性封裝原則 意味著兩點 1 ...

物件導向設計原則

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