物件導向設計基本原則(舉例說明)

2021-08-02 08:36:55 字數 2157 閱讀 5323

單一職責原則(srp),就乙個類而言,應該僅有乙個引起它變化的原因。

如果乙個類承擔的職責過多,就等於把這些職責耦合在一起,乙個職責的變化可能會削弱或者抑制這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當變化發生時,設計會遭受到意想不到的破壞。

舉例說明:設計俄羅斯方塊遊戲,把遊戲介面和邏輯進行分離。當有一天需要改變介面的時候,不過是窗體類的變化,和遊戲邏輯無關,以此來達到復用的目的。

開放-封閉原則,是說軟體實體(類、模組、函式等等)應該可以擴充套件,但是不可以修改。這個原則有兩個特徵,一是「對於擴充套件是開放的 (open for extension)」,另乙個是說「對於更改是封閉的(closed for modification)」。

開放-封閉原則的意思就是說,你設計的時候,時刻要考慮,盡量讓這個類是足夠好,寫好了就不要去修改了,如果新需求來,我們增加一些類就完事了,原來的**能不動則不動。

無論模組是多麼的「封閉」,都會存在一些無法對之封閉的變化。既然不可能完全封閉,設計人員必須對於他設計的模組應該對哪種變化封閉做出選擇。他必須先猜測最有可能發生的變化種類,然後構造抽象來隔離那些變化。但有時候很難預先猜測。在我們最初編寫**時,假設變化不會發生。當變化發生時,我們就建立抽象來隔離以後發生的同類變化。

面對變化,對程式的改動是通過增加新**實現的,而不是更改現有的**。這就是「開放-封閉原則」的精神所在。

開放-封閉原則是物件導向設計的核心所在。遵循這個原則可以帶來物件導向技術所聲稱的巨大好處,也就是可維護、可擴充套件、可復用、靈活性好。開發人員應該僅對程式中呈現出頻繁變化的那些部分做出抽象,然而,對於應用程式中的每個部分都時刻地進行抽象同樣不是乙個好主意。拒絕不成熟的抽象和抽象本身一樣重要。

舉例說明:當設計乙個具有加、減、乘、除功能的計算器的時候,通過一些物件導向的手段,如繼承,多型等來隔離具體加法、減法等與客戶端的耦合。當後續需要增加其他功能,比如開根號等,就不需要再去更改客戶端以及加法、減法等類了,而只是增加開根號類就可以了。

依賴倒轉原則(或依賴倒置原則):

a. 高層模組不應該依賴底層模組。兩個都應該依賴抽象。

b. 抽象不應該依賴細節。細節應該依賴抽象。(可以理解為要針對介面程式設計,不要對實現程式設計)

舉例說明:比如當我們做新專案時,發現業務邏輯的高層模組都是一樣的,但是客戶卻希望使用不同的資料庫或儲存資訊方式。我們希望能再次利用這些高層模組,但是如果高層模組都是與低層的訪問資料庫繫結在一起,就沒有辦法復用這些高層模組。而如果不管高層模組還是低層模組,它們都依賴於抽象,具體一點就是介面或抽象類,只要介面是穩定的,那麼任何乙個的更改都不用擔心其他受到影響。

依賴倒轉其實可以說是物件導向設計的標誌,用哪種語言來編寫程式不重要,如果編寫時考慮的都是如何針對抽象程式設計而不是對細節程式設計,即程式中所有的依賴關係都是終止於抽象類或者介面,那就是物件導向的設計,反之那就是過程化的設計了。

黎克特制代換原則子型別必須能夠替換掉它們的父型別。

黎克特制代換原則的數學定義比較複雜,它的白話翻譯就是,乙個軟體實體如果使用的是乙個父類的話,那麼一定適用於其子類,而且它察覺不出父類物件和子類物件的區別。也就是說,在軟體裡面,把父類都替換成它的子類,程式的行為沒有變化。

也正因為有了這個原則,使得繼承復用成為了可能,只有當子類可以替換掉父類,軟體單位的功能不受到影響時,父類才能真正被復用,而子類也能夠在父類的基礎上增加新的行為。

舉例說明:在物件導向設計時,乙個是鳥類,乙個是企鵝類,如果鳥類是可以飛的,企鵝不會飛,那麼企鵝可以繼承鳥類嗎?答案是顯然不行,因為繼承意味著子類擁有父類所有非private的行為和屬性,而在這裡,企鵝不能以父類——鳥的身份出現(不滿足依賴倒轉原則),所以,企鵝不能繼承鳥類。

迪公尺特法則,也叫最少知識原則

迪公尺特法則:如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用。如果其中乙個類需要呼叫另乙個類的某乙個方法的話,可以通過第三者**這個呼叫。

「迪公尺特法則首先強調的前提是在類的結構設計上,每乙個類都應當盡量降低成員的訪問許可權,也就是說,乙個類包裝好自己的private狀態,不需要讓別的類知道的字段或行為就不要公開。」

迪公尺特法則其根本思想,是強調了類之間的松耦合。類之間的耦合越弱,越有利於復用,乙個處在弱耦合的類被修改,不會對有關係的類造成波及。也就是說,資訊的隱藏促進了軟體的復用。

物件導向設計基本原則

物件導向設計不外乎遵循五大原則 第一 單一職責原則 即 乙個類應該只負責單一的職責,而將其餘的職責讓其他類來承擔,這樣每個類之間相互協調來完成一件任務。第二 開閉原則 即對擴充套件是開放的,對修改是封閉的,因此需要注重抽象的運用 第三 替換原則 子類應該可以替換在父類出現的任何地方 第四 依賴倒置原...

物件導向設計基本原則

物件導向設計不外乎遵循五大原則 第一 單一職責原則 即 乙個類應該只負責單一的職責,而將其餘的職責讓其他類來承擔,這樣每個類之間相互協調來完成一件任務。第二 開閉原則 即對擴充套件是開放的,對修改是封閉的,因此需要注重抽象的運用 第三 替換原則 子類應該可以替換在父類出現的任何地方 第四 依賴倒置原...

物件導向的基本原則

單一職責原則 srp 就乙個類而言,應該僅有乙個引起它變化的原因。如果乙個類承擔的責任過多,就等於把這些職責耦合在一起,乙個職責的變化可能會削弱或者抑制這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當變化發生時,設計會遭受意想不到的破壞。軟體設計真正要做的許多內容,就是發現職責並把那些職責相互...