天天看點

通俗易懂-六大設計原則

title: 通俗易懂-六大設計原則

tags:

  • 設計模式

    categories:

  • 設計模式

有需求,就會有滿足需求的技術誕生,設計模式官方點講,就是為了代碼可重複性.讓代碼更容易被他人了解,保證代碼的可靠性,通俗點講,為了少寫代碼而多寫代碼,為了更好的"偷懶",呢到底是怎麼"偷懶"的呢?它有沒有什麼依據或者原則呢?有,呢就是設計模式的六大設計原則

單一職責原則

單一職責原則是最簡單的面向對象設計原則

定義: 一個類隻負責一個功能領域中的相應職責,或者可以定義為,就一個類而言,應該隻有一個引起它變化的原因

怎麼了解呢?就是說一個類不能太"累"了!為啥?因為,一個類它的職責越多,它被複用的可能性就越小,一個類承擔的職責多了,就會讓這些職責耦合在一起,當其中一個職責變化時,可能會影響到其他的職責.是以要把這些職責進行分離,将不同的職責封裝在不同的類中.

換句話說,我們玩遊戲,一個q鍵,既可以放技能,還可以普通攻擊,不好吧,一個q鍵承擔了過多的職責,而且,如果q鍵普通攻擊的職責變了,變成了強制自殺,你玩起來是不是很難受.為什麼被複用性的可能性就越少呢?就像你設定滑鼠宏,想放下技能然後接個普通攻擊.你q鍵的職責隻是單一的話,就可以設定q+普通攻擊;然而,你q的職責多了,就不可以這樣複用了,類就和q鍵一樣.

單一職責原則是實作高内聚、低耦合,它是最簡單但又最難運用的原則,需要設計人員發現類的不同職責并将其分離,而發現類的多重職責需要設計人員具有較強的分析設計能力和相關實踐經驗。

開放封閉原則

開閉原則是面向對象的可複用設計最重要的面向對象設計原則

定義: 一個軟體實體應當對擴充開放,對修改關閉。即軟體實體應盡量在不修改原有代碼的情況下進行擴充。

什麼是軟體實體呢? 在開放封閉原則的定義中,軟體實體可以指一個軟體子產品、一個由多個類組成的局部結構或一個獨立的類。

為什麼要遵循開放封閉原則,或者開放封閉原則有什麼好處呢?任何的項目,随着時間的推移和需求的變化,都會增加代碼,我們應該盡量的保證項目設計是穩定的,如果項目是遵循開放封閉原則的話,就可以很友善的修改代碼,在擴充時不用修改現有的代碼.随着項目越來越大,維護的成本就會越來越高,是以滿足開封封閉原則也就會變的越來越重要.

換句話說,項目就像我們堆積木一樣,随着時間需求,我們的積木越來越高,我們如果按照開放封閉原則,對積木橫向縱向擴充是開放的,是可以增加的,對已經完成的積木是封閉不能修改的.呢麼我們的積木就可以越來越高,不容易崩潰,如果不遵循開放封閉原則,你在積木裡面修修改改,是不是很容易崩潰?

裡氏替換原則

定義: 所有引用基類(父類)的地方必須能透明地使用其子類的對象

它是說在代碼中将一個基類對象替換成它的子類對象,程式将不會産生任何錯誤和異常,反過來則不成立,如果一個代碼使用的是一個子類對象的話,那麼它不一定能夠使用基類對象。

很常見的例子:我喜歡動物,那我一定喜歡貓,因為貓是動物的子類;但是我喜歡貓,不能據此斷定我喜歡動物,因為我并不喜歡老鼠,雖然它也是動物。

呢為什麼要這樣呢?為了實作開閉原則,裡氏代換原則是實作開閉原則的重要方式之一,由于使用子類對象的地方,都可以使用父類對象,是以在代碼中盡量使用父類來對對象進行定義,而在運作時在确定它子類類型,用子類對象來替換父類對象,也就是我們學習的多态.

換句話說:你兩個好朋友在打架,你是二話不說去幫A朋友呢(直接使用"子類貓"來定義),還是直接去幫B朋友(直接使用"子類鼠:來定義),或者先勸架(定義"父類")然後根據具體情況來決定幫誰(具體替換哪個對象)呢?

依賴倒置原則

如果說開閉原則是面向對象設計的目标的話,那麼依賴倒轉原則就是面向對象設計的主要實作機制之一,它是系統抽象化的具體實作

定義: 抽象不應該依賴于細節,細節應當依賴于抽象。換言之,要針對接口程式設計,而不是針對實作程式設計。

就是說在代碼中傳遞參數時或在關聯關系中,盡量引用層次高的抽象層類,即使用接口和抽象類進行變量類型聲明、參數類型聲明、方法傳回類型聲明,以及資料類型的轉換等,而不要用具體類來做這些事情。

為什麼要這樣做呢?

在引入抽象層後,系統将具有很好的靈活性,在程式中盡量使用抽象層進行程式設計,需要使用的具體類寫在配置檔案中,這樣一來,如果系統行為發生變化,隻需要對抽象層進行擴充,然後修改配置檔案中的指向的具體類,而無須修改原有系統的源代碼,在不修改的情況下來擴充系統的功能,滿足開閉原則的要求。

合成/聚合複用原則

定義: 盡量使用合成/聚合,盡量不使用類繼承.

類的繼承越多,耦合性越強,是以能不使用繼承就不使用繼承.

迪米特法則

定義: 如果兩個類不必彼此直接通信,那麼這兩個類就不應當發生直接的互相作用.如果其中一個類需要調用另一個類的某一個方法的話,可以通過第三者轉發者個類.

迪米特法則可降低系統的耦合度,使類與類之間保持松散的耦合關系。

也就是,你和你朋友開黑,你朋友喊了另一個朋友,你們三個人一起開黑,你不必知道他是誰,就可以完成三人開黑,原本說好決戰到天明,可是你突然有事了,當你有事要走的時候,你隻需要給你認識的朋友說聲,道個歉就行,而不用給你朋友的朋友道歉,這就降低了你和你朋友的朋友的耦合.

結語

這些原則,和設計模式還有項目結合起來了解效果更佳,慢慢體會其中的好處,就能越來越熟練的運用.

繼續閱讀