軟件設(shè)計(jì)七大原則

軟件設(shè)計(jì)中,怎樣提高系統(tǒng)的可維護(hù)性和可復(fù)用性是面向?qū)ο笤O(shè)計(jì)需要解決的核心問(wèn)題之一。面向?qū)ο笤O(shè)計(jì)原則是實(shí)現(xiàn)可維護(hù)性和可復(fù)用性的基礎(chǔ),每一個(gè)原則都蘊(yùn)含了面向?qū)ο笤O(shè)計(jì)的思想,可從不同的視角提升一個(gè)軟件結(jié)構(gòu)的設(shè)計(jì)水平。這些原則蘊(yùn)含著很多設(shè)計(jì)模式中,也是我們用于評(píng)價(jià)一個(gè)設(shè)計(jì)模式使用效果的重要指標(biāo)之一。

1, 開(kāi)放封閉原則

就是對(duì)擴(kuò)展開(kāi)放,而對(duì)修改封閉。其是所有面向?qū)ο笤瓌t的核心。軟件設(shè)計(jì)追求的是易于擴(kuò)展復(fù)用、封裝實(shí)現(xiàn)細(xì)節(jié)、降低耦合度,開(kāi)放封閉原則是實(shí)現(xiàn)這一目標(biāo)的最直接的體現(xiàn)。(1)開(kāi)放,對(duì)功能或需求的擴(kuò)展開(kāi)放,當(dāng)有新需求或變化時(shí),可依據(jù)現(xiàn)有的程序代碼進(jìn)行擴(kuò)展,以便適應(yīng)新要求;(2)封閉,意味著一旦設(shè)計(jì)完成,便可以獨(dú)立工作,不能對(duì)其進(jìn)行任何的修改。

2, 單一職責(zé)原則

很好理解,一個(gè)類(lèi)只負(fù)責(zé)一項(xiàng)職責(zé)。針對(duì)一個(gè)類(lèi),其承擔(dān)的職責(zé)越多,被復(fù)用的可能性就越小。如果類(lèi)承擔(dān)的職責(zé)很多,就意味著這些職責(zé)耦合在了一起,若其中一項(xiàng)職責(zé)發(fā)生變化,就可能會(huì)影響其他職責(zé)的處理。

3, 里式替換原則

里氏代換原則是由2008年圖靈獎(jiǎng)得主、美國(guó)第一位計(jì)算機(jī)科學(xué)女博士Barbara Liskov教授和卡內(nèi)基·梅隆大學(xué)JeannetteWing教授提出,其嚴(yán)格的表述為:如果對(duì)每一個(gè)類(lèi)型為S的對(duì)象o1,都有類(lèi)型為T(mén)的對(duì)象o2,使得以T定義的所有程序P在所有的對(duì)象o1代換o2時(shí),程序P的行為沒(méi)有變化,那么類(lèi)型S是類(lèi)型T的子類(lèi)型。這種描述讓人非常難以理解,換一句更通俗易懂的解釋就是:所有基類(lèi)出現(xiàn)的地方,都可以使用子類(lèi)進(jìn)行替換,子類(lèi)可以擴(kuò)展父類(lèi)的功能,但不能改變父類(lèi)原有的功能。也就是說(shuō)基類(lèi)對(duì)象出現(xiàn)的地方,子類(lèi)對(duì)象一定可以出現(xiàn),但反過(guò)來(lái)則不行。比如我喜歡車(chē)子,那么意味著我喜歡自行車(chē),但反過(guò)來(lái)就不一定,因?yàn)槲蚁矚g自行車(chē)并不代表就喜歡所有的車(chē)子。

4, 接口隔離原則

有兩項(xiàng)含義:(1)客戶需要什么樣的接口,就提供什么樣的接口,不需要的就刪除掉;(2)類(lèi)之間的依賴(lài)關(guān)系應(yīng)建立在最小的接口上。也就是說(shuō),接口中的方法要盡量的少,接口功能要盡量的細(xì)分。

5, 依賴(lài)倒置原則

依賴(lài)倒轉(zhuǎn)原則就是要依賴(lài)于抽象,不要依賴(lài)于實(shí)現(xiàn)。高層模塊不依賴(lài)于底層模塊,二者都依賴(lài)其抽象;抽象不依賴(lài)于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴(lài)抽象。(Abstractions should not depend upon details. Details should depend uponabstractions.)要針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程。(Program to an interface, not an implementation.)也就是說(shuō)應(yīng)當(dāng)使用接口和抽象類(lèi)進(jìn)行變量類(lèi)型聲明、參數(shù)類(lèi)型聲明、方法返還類(lèi)型說(shuō)明,以及數(shù)據(jù)類(lèi)型的轉(zhuǎn)換等。而不要用具體類(lèi)進(jìn)行變量的類(lèi)型聲明、參數(shù)類(lèi)型聲明、方法返還類(lèi)型說(shuō)明,以及數(shù)據(jù)類(lèi)型的轉(zhuǎn)換等。要保證做到這一點(diǎn),一個(gè)具體類(lèi)應(yīng)當(dāng)只實(shí)現(xiàn)接口和抽象類(lèi)中聲明過(guò)的方法,而不要給出多余的方法。

傳統(tǒng)的過(guò)程性系統(tǒng)的設(shè)計(jì)辦法傾向于使高層次的模塊依賴(lài)于低層次的模塊,抽象層次依賴(lài)于具體層次。倒轉(zhuǎn)原則就是把這個(gè)錯(cuò)誤的依賴(lài)關(guān)系倒轉(zhuǎn)過(guò)來(lái)。

面向?qū)ο笤O(shè)計(jì)的重要原則是創(chuàng)建抽象化,并且從抽象化導(dǎo)出具體化,具體化給出不同的實(shí)現(xiàn)。繼承關(guān)系就是一種從抽象化到具體化的導(dǎo)出。

抽象層包含的應(yīng)該是應(yīng)用系統(tǒng)的商務(wù)邏輯和宏觀的、對(duì)整個(gè)系統(tǒng)來(lái)說(shuō)重要的戰(zhàn)略性決定,是必然性的體現(xiàn)。具體層次含有的是一些次要的與實(shí)現(xiàn)有關(guān)的算法和邏輯,以及戰(zhàn)術(shù)性的決定,帶有相當(dāng)大的偶然性選擇。具體層次的代碼是經(jīng)常變動(dòng)的,不能避免出現(xiàn)錯(cuò)誤。

從復(fù)用的角度來(lái)說(shuō),高層次的模塊是應(yīng)當(dāng)復(fù)用的,而且是復(fù)用的重點(diǎn),因?yàn)樗幸粋€(gè)應(yīng)用系統(tǒng)最重要的宏觀商務(wù)邏輯,是較為穩(wěn)定的。而在傳統(tǒng)的過(guò)程性設(shè)計(jì)中,復(fù)用則側(cè)重于具體層次模塊的復(fù)用。

依賴(lài)倒轉(zhuǎn)原則則是對(duì)傳統(tǒng)的過(guò)程性設(shè)計(jì)方法的“倒轉(zhuǎn)”,是高層次模塊復(fù)用及其可維護(hù)性的有效規(guī)范。

特例:對(duì)象的創(chuàng)建過(guò)程是違背“開(kāi)—閉”原則以及依賴(lài)倒轉(zhuǎn)原則的,但通過(guò)工廠模式,能很好地解決對(duì)象創(chuàng)建過(guò)程中的依賴(lài)倒轉(zhuǎn)問(wèn)題。

   此文引用自:http://www.cnblogs.com/temptation/archive/2008/03/10/1098351.html

6, 迪米特法則

迪米特法則,也可稱(chēng)為最少知識(shí)原則。一個(gè)類(lèi)對(duì)自己所依賴(lài)的類(lèi)知道的越少越好,對(duì)于被依賴(lài)的類(lèi),不論其實(shí)現(xiàn)邏輯如何,都將這些邏輯封裝在自己的范圍內(nèi),對(duì)外通過(guò)public(protected可以通過(guò)子類(lèi)訪問(wèn))方法進(jìn)行提供服務(wù),否則不對(duì)外泄露任何信息,這也體現(xiàn)了數(shù)據(jù)保密性。

7, 組合/聚合復(fù)用原則

簡(jiǎn)單的說(shuō)是,盡量使用對(duì)象的組合/聚合,而不是繼承來(lái)達(dá)到復(fù)用的目的。

組合和聚合都是對(duì)象建模中關(guān)聯(lián)關(guān)系的一種。聚合表示整體與部分的關(guān)系,表示“含有”,整體由部分組合而成,部分可以脫離整體作為一個(gè)獨(dú)立的個(gè)體存在。組合則是一種更強(qiáng)的聚合,部分組成整體,而且不可分割,部分不能脫離整體而單獨(dú)存在。在合成關(guān)系中,部分和整體的生命周期一樣,組合的新的對(duì)象完全支配其組成部分,包括他們的創(chuàng)建和銷(xiāo)毀。一個(gè)合成關(guān)系中成分對(duì)象是不能與另外一個(gè)合成關(guān)系共享。

   組合/聚合和繼承是實(shí)現(xiàn)代碼復(fù)用的兩種基本途徑,在設(shè)計(jì)過(guò)程中盡量使用組合/聚合,而不是繼承。因?yàn)槔^承使得基類(lèi)與子類(lèi)有較強(qiáng)的耦合性,通常情況下基類(lèi)的內(nèi)部細(xì)節(jié)對(duì)子類(lèi)來(lái)說(shuō)是可見(jiàn)的,這樣基類(lèi)的實(shí)現(xiàn)細(xì)節(jié)會(huì)暴露給子類(lèi),破壞了系統(tǒng)的封裝性。



   開(kāi)閉原則是所有面向?qū)ο笤瓌t的核心;里式替換原則是實(shí)現(xiàn)開(kāi)閉原則的重要方式之一;依賴(lài)倒置原則是系統(tǒng)抽象化的具體實(shí)現(xiàn),其是面向?qū)ο笤O(shè)計(jì)的主要實(shí)現(xiàn)機(jī)制之一;接口隔離原則要求接口的方法盡量少,接口盡量細(xì)化;迪米特法則降低系統(tǒng)的耦合度,其使得一個(gè)模塊的修改盡量少的影響其他模塊,擴(kuò)展會(huì)相對(duì)容易;在軟件設(shè)計(jì)中,盡量使用組合/聚合而不是繼承達(dá)到代碼復(fù)用的目的。

關(guān)于設(shè)計(jì)原則的介紹有很多,在此推薦以下鏈接:

開(kāi)閉原則:http://blog.csdn.net/lovelion/article/details/7537584

單一職責(zé)原則:http://blog.csdn.net/lovelion/article/details/7536542

里式替換原則:http://blog.csdn.net/lovelion/article/details/7540445

接口隔離原則:http://blog.csdn.net/lovelion/article/details/7562842

依賴(lài)倒置原則:http://blog.csdn.net/lovelion/article/details/7562783

迪米特法則:http://blog.csdn.net/lovelion/article/details/7563445

組合/聚合原則:http://blog.csdn.net/lovelion/article/details/7563441

設(shè)計(jì)模式六大原則:http://www.uml.org.cn/sjms/201211023.asp

作者:lixg88888888
來(lái)源:CSDN
原文:https://blog.csdn.net/lixg88888888/article/details/78932142
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.開(kāi)閉原則 一個(gè)軟件實(shí)體如類(lèi)、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。用抽象構(gòu)建框架,用實(shí)現(xiàn)擴(kuò)展細(xì)節(jié)解釋?zhuān)寒?dāng)我們有...
    ddxuzengbin閱讀 1,748評(píng)論 1 1
  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚、低耦合和單一職能的“沖突”實(shí)際上,這兩者...
    彥幀閱讀 3,878評(píng)論 0 14
  • 看《多桑》的時(shí)候并沒(méi)有那么大的耐心,特別是模糊的畫(huà)質(zhì)和并不清閑冷靜的心情,以及印象中像楊德昌、侯孝賢那類(lèi)臺(tái)灣電影里...
    弓谷所長(zhǎng)閱讀 768評(píng)論 0 2
  • 這兩天在Cornerstone代碼合并中出了些錯(cuò)誤,所以集中學(xué)習(xí)了一下。 項(xiàng)目導(dǎo)入 基本使用 有關(guān)分支和tag暫時(shí)...
    wpf_register閱讀 276評(píng)論 1 1
  • 要想實(shí)現(xiàn)財(cái)富自由,就是再也不要出售自己的時(shí)間了。 這句話是真的能背下來(lái)了??墒窃诘竭_(dá)財(cái)富自由之前,我們唯一能做的還...
    一億小目標(biāo)閱讀 324評(píng)論 0 2

友情鏈接更多精彩內(nèi)容