軟件設計原則

軟件設計模式原則

 

(1)開閉原則

 開閉原則(OCP)是面向對象設計中“可複用設計”的基石,是面向對象設計中最重要的原則之一,其它很多的設計原則都是實現開閉原則的一種手段。

1988年,勃蘭特·梅耶(BertrandMeyer)在他的著作《面向對象軟件構造(Object Oriented Software Construction)》中提出了開閉原則,它的原文是這樣:“Softwareentities should be open for extension,but closed for modification”。翻譯過來就是:“軟件實體應當對擴展開放,對修改關閉”。這句話說得略微有點專業,我們把它講得更通俗一點,也就是:軟件系統中包含的各種組件,例如模塊(Modules)、類(Classes)以及功能(Functions)等等,應該在不修改現有代碼的基礎上,引入新功能。開閉原則中“開”,是指對於組件功能的擴展是開放的,是允許對其進行功能擴展的;開閉原則中“閉”,是指對於原有代碼的修改是封閉的,即不應該修改原有的代碼。

 開閉原則具有理想主義的色彩,它是面向對象設計的終極目標。因此,針對開閉原則的實現方法,一直都有面向對象設計的大師費盡心機,研究開閉原則的實現方式。後面要提到的里氏代換原則(LSP)、依賴倒轉原則(DIP)、接口隔離原則(ISP)以及抽象類(Abstract Class)、接口(Interface)等等,都可以看作是開閉原則的實現方法。     

 

(2)里氏代換原則   

 里氏代換原則(Liskov Substitution Principle LSP)面向對象設計的基本原則之一。 里氏代換原則中說,任何基類可以出現的地方,子類一定可以出現。 LSP是繼承複用的基石,只有當衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正被複用,而衍生類也能夠在基類的基礎上增加新的行爲。里氏代換原則是對“開-閉”原則的補充。實現“開-閉”原則的關鍵步驟就是抽象化。而基類與子類的繼承關係就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規範。

 LSP講的是基類和子類的關係。只有當這種關係存在時,里氏代換關係才存在。如果兩個具體的類A,B之間的關係違反了LSP的設計,(假設是從B到A的繼承關係)那麼根據具體的情況可以在下面的兩種重構方案中選擇一種。

-----創建一個新的抽象類C,作爲兩個具體類的超類,將A,B的共同行爲移動到C中來解決問題。

-----從B到A的繼承關係改爲委派關係。

 

(3)依賴倒轉原則   

 所謂依賴倒置原則(Dependence Inversion Principle)就是要依賴於抽象,不要依賴於具體。簡單的說就是要求對抽象進行編程,不要對實現進行編程,這樣就降低了客戶與實現模塊間的耦合。

意圖

 面向過程的開發,上層調用下層,上層依賴於下層,當下層劇烈變動時上層也要跟着變動,這就會導致模塊的複用性降低而且大大提高了開發的成本。

面向對象的開發很好的解決了這個問題,一般情況下抽象的變化概率很小,讓用戶程序依賴於抽象,實現的細節也依賴於抽象。即使實現細節不斷變動,只要抽象不變,客戶程序就不需要變化。這大大降低了客戶程序與實現細節的耦合度。

 一個應用中的重要策略決定及業務模型正是在這些高層的模塊中。也正是這些模型包含着應用的特性。但是,當這些模塊依賴於低層模塊時,低層模塊的修改將會直接影響到它們,迫使它們也去改變。這種境況是荒謬的。應該是處於高

層的模塊去迫使那些低層的模塊發生改變。應該是處於高層的模塊優先於低層的模塊。無論如何高層的模塊也不應依賴於低層的模塊。而且,我們想能夠複用的是高層的模塊。通過子程序庫的形式,我們已經可以很好地複用低層的模塊了。當高層的模塊依賴於低層的模塊時,這些高層模塊就很難在不同的環境中複用。但是,當那些高層模塊獨立於低層模塊時,它們就能很簡單地被複用了。這正是位於框架設計的最核心之處的原則。

總結:依賴倒置原則

A.高層次的模塊不應該依賴於低層次的模塊,他們都應該依賴於抽象。

B.抽象不應該依賴於具體,具體應該依賴於抽象。

 

(4)接口隔離原則   

 一、ISP簡介(ISP--Interface Segregation Principle):

使用多個專門的接口比使用單一的總接口要好。

一個類對另外一個類的依賴性應當是建立在最小的接口上的。

一個接口代表一個角色,不應當將不同的角色都交給一個接口。沒有關係的接口合併在一起,形成一個臃腫的大接口,這是對角色和接口的污染。

“不應該強迫客戶依賴於它們不用的方法。接口屬於客戶,不屬於它所在的類層次結構。”這個說得很明白了,再通俗點說,不要強迫客戶使用它們不用的方法,如果強迫用戶使用它們不使用的方法,那麼這些客戶就會面臨由於這些不使用的方法的改變所帶來的改變。

 

(5)抽象類

 抽象類往往用來表徵對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。

通常在編程語句中用 abstract 修飾的類是抽象類。在C++中,含有純虛擬函數的類稱爲抽象類,它不能生成對象;在java中,含有抽象方法的類稱爲抽象類,同樣不能生成對象。

抽象類是不完整的,它只能用作基類。在面向對象方法中,抽象類主要用來進行類型隱藏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章