1. 程式人生 > >三、單一職責原則、開放-封閉原則、依賴倒轉原則

三、單一職責原則、開放-封閉原則、依賴倒轉原則

一、單一職責原則 1、定義:就一個 而言,應該 僅有一個引起它變化的原因2、為什麼要?:如果一個類承擔的職責過多,就等於把這些職責 耦合在一起,一個職責的變化可能會削弱或者抑制這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當變化發生時,設計會遭受到意想不到的破壞。 3、 軟體設計真正要做的許多內容, 就是發現職責並把職責相互分離。 如果你能想到多餘一個動機去改變一個類,那麼這個類就具有多於一個原則。 4、 示例:設計俄羅斯方塊的遊戲 可以分為遊戲邏輯和介面表示邏輯。 遊戲邏輯——陣列每一項的值改變。 介面表示邏輯——根據陣列的資料進行繪製和擦除,或根據鍵盤命令呼叫陣列的相應方法進行改變。   二、開放-封閉原則(The Open-Closeed Principle,OCP)
1、定義:軟體實體(類、模組、函式等等)應該是可以擴充套件,但是不可修改。 對擴充套件是開放的,對修改是封閉的2、作用:面對需求的改變卻可以保持相對穩定,從而使得系統可以在第一個版本後不斷推出新的版本。  貫穿面向物件程式設計始終:可維護、可擴充套件、可複用、靈活性好。 3、變化時必然的:無論模組是多麼封閉,都會存在一些無法對之封閉的變化。 4、什麼時候應對變化呢?設計人員必須對於他設計的模組應該讀哪種變化封閉做出選擇。他必須猜測出最有可能發生的變化種類,然後構造抽象來隔離那些變化。 5、怎麼應對變化呢?建立抽象來隔離以後發生的同類變化。 例如:重構程式,增加一個抽象的類。 6、 原則:
(1)對程式的改動是通過增加新程式碼進行,而不是更改現有的程式碼。 (2)發現變化越早越好:我們希望是在開發工作展開不久就知道可能發生的變化。查明可能發生變化所等待的時間越長,要建立正確地抽象就越困難。 7、 開放-封閉原則是,面向物件設計的核心所在。開發人員應該進度程式中呈現出頻繁變化的那些部分作出抽象。但是 切忌過度! 8、示例:彈性上班制度,工作時間不固定,商夠時間即可:對工作時間的修改關閉,對時間制度的擴充套件開放。     三、依賴倒轉原則 ——面向物件:強內聚、鬆耦合。 1、定義: A:高層模組不應該依賴底層模組,兩個都應該依賴抽象。
B. 抽象不應該細節,細節應該依賴抽象。
  • 說白了,就是要針對介面程式設計,不要對實現程式設計。
2、 理論支援:里氏替換原則
  • 定義:子類必須能夠替換掉他們父親的型別。
  • 說白了:一個軟體實體如果使用的是一個父類的話,那麼一定適用其子類,而且它察覺不出父類物件和子類物件的區別。也就是說,在軟體裡面,把服了都替換為它的子類,程式的行為沒有變化。
  • 極端的例子:如果程式中定義“鳥類”:可以飛。由於企鵝不會飛,所以——企鵝不能繼承鳥類
  • 作用:有了這個原則,使繼承複用成為了可能:只有當子類可以替換掉父類,軟體單位的功能不受到影響時,父類才能真正被複用,而子類也能夠在父類的基礎上增加新的行為。
  •  而卻正是由於子類的可替換性才能使用使用父類型別的模組在無需更改的情況下可以擴充套件。
3 、意義:依賴倒轉其實可以說是面向物件設計的標誌,用那種語言來編寫程式不重要,如果編寫時考慮的都是如何針對抽象程式設計而不是針對細節程式設計,即程式中所有的依賴關係都是終止於抽象類或者介面,那就是面向物件的設計,反之就是面向過程的設計。