軟件設(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)題。
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ù)用的目的。
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個(gè)人觀點(diǎn), 并不代表本站贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé),本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個(gè)個(gè)人學(xué)習(xí)交流的平臺(tái),網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對(duì)作者和來(lái)源進(jìn)行了通告,但是能力有限或疏忽,造成漏登,請(qǐng)及時(shí)聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對(duì)此聲明的最終解釋權(quán)。