最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

軟件開發(fā):面向?qū)ο笤O(shè)計(jì)的七大原則!程序員一定要了解

2022-06-01 16:33 作者:C語言編程__Plus  | 我要投稿

七大原則

開閉原則、里氏代換原則、迪米特原則(最少知道原則)、單一職責(zé)原則、接口分隔原則、依賴倒置原則、組合/聚合復(fù)用原則。


開閉原則(The Open-Closed Principle ,OCP)

開閉原則:軟件實(shí)體(模塊,類,方法等)應(yīng)該對擴(kuò)展開放,對修改關(guān)閉。

概念理解

開閉原則是指在進(jìn)行面向?qū)ο笤O(shè)計(jì)中,設(shè)計(jì)類或其他程序單位時,應(yīng)該遵循:

(1)對擴(kuò)展開放(open)

(2)對修改關(guān)閉(closed) 的設(shè)計(jì)原則。

開閉原則是判斷面向?qū)ο笤O(shè)計(jì)是否正確的最基本的原理之一。

根據(jù)開閉原則,在設(shè)計(jì)一個軟件系統(tǒng)模塊(類,方法)的時候,應(yīng)該可以在不修改原有的模塊(修改關(guān)閉)的基礎(chǔ)上,能擴(kuò)展其功能(擴(kuò)展開放)。

擴(kuò)展開放:某模塊的功能是可擴(kuò)展的,則該模塊是擴(kuò)展開放的。軟件系統(tǒng)的功能上的可擴(kuò)展性要求模塊是擴(kuò)展開放的。

修改關(guān)閉:某模塊被其他模塊調(diào)用,如果該模塊的源代碼不允許修改,則該模塊修改關(guān)閉的。軟件系統(tǒng)的功能上的穩(wěn)定性,持續(xù)性要求模塊是修改關(guān)閉的。

開閉原則的實(shí)現(xiàn)方法

為了滿足開閉原則的對修改關(guān)閉原則以及擴(kuò)展開放原則,應(yīng)該對軟件系統(tǒng)中的不變的部分加以抽象,在面向?qū)ο蟮脑O(shè)計(jì)中,

(1)可以把這些不變的部分加以抽象成不變的接口,這些不變的接口可以應(yīng)對未來的擴(kuò)展;

(2)接口的最小功能設(shè)計(jì)原則。根據(jù)這個原則,原有的接口要么可以應(yīng)對未來的擴(kuò)展;不足的部分可以通過定義新的接口來實(shí)現(xiàn);

(3)模塊之間的調(diào)用通過抽象接口進(jìn)行,這樣即使實(shí)現(xiàn)層發(fā)生變化,也無需修改調(diào)用方的代碼。

接口可以被復(fù)用,但接口的實(shí)現(xiàn)卻不一定能被復(fù)用。

接口是穩(wěn)定的,關(guān)閉的,但接口的實(shí)現(xiàn)是可變的,開放的。

可以通過對接口的不同實(shí)現(xiàn)以及類的繼承行為等為系統(tǒng)增加新的或改變系統(tǒng)原來的功能,實(shí)現(xiàn)軟件系統(tǒng)的柔性擴(kuò)展。

好處:提高系統(tǒng)的可復(fù)用性和可維護(hù)性。

簡單地說,軟件系統(tǒng)是否有良好的接口(抽象)設(shè)計(jì)是判斷軟件系統(tǒng)是否滿足開閉原則的一種重要的判斷基準(zhǔn)。現(xiàn)在多把開閉原則等同于面向接口的軟件設(shè)計(jì)。

開閉原則的相對性

軟件系統(tǒng)的構(gòu)建是一個需要不斷重構(gòu)的過程,在這個過程中,模塊的功能抽象,模塊與模塊間的關(guān)系,都不會從一開始就非常清晰明了,所以構(gòu)建100%滿足開閉原則的軟件系統(tǒng)是相當(dāng)困難的,這就是開閉原則的相對性。

但在設(shè)計(jì)過程中,通過對模塊功能的抽象(接口定義),模塊之間的關(guān)系的抽象(通過接口調(diào)用),抽象與實(shí)現(xiàn)的分離(面向接口的程序設(shè)計(jì))等,可以盡量接近滿足開閉原則。


里氏替換原則(Liskov Substitution Principle ,LSP)

只有滿足以下2個條件的OO設(shè)計(jì)才可被認(rèn)為是滿足了LSP原則:

(1)不應(yīng)該在代碼中出現(xiàn)if/else之類對派生類類型進(jìn)行判斷的條件。

(2)派生類應(yīng)當(dāng)可以替換基類并出現(xiàn)在基類能夠出現(xiàn)的任何地方,或者說如果我們把代碼中使用基類的地方用它的派生類所代替,代碼還能正常工作。

里氏替換原則(LSP)是使代碼符合開閉原則的一個重要保證。

LSP體現(xiàn)

類的繼承原則:如果一個派生類的對象可能會在基類出現(xiàn)的地方出現(xiàn)運(yùn)行錯誤,則該派生類不應(yīng)該從該基類繼承,或者說,應(yīng)該重新設(shè)計(jì)它們之間的關(guān)系。

動作正確性保證:從另一個側(cè)面上保證了符合LSP設(shè)計(jì)原則的類的擴(kuò)展不會給已有的系統(tǒng)引入新的錯誤。

里式替換原則的引申意義

子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能。

子類可以實(shí)現(xiàn)父類的抽象方法,但不能覆蓋父類的非抽象方法。

子類中可以增加自己特有的方法。

當(dāng)子類的方法重載父類的方法時,方法的前置條件(即方法的輸入/入?yún)ⅲ┮雀割惙椒ǖ妮斎雲(yún)?shù)更寬松。

當(dāng)子類的方法實(shí)現(xiàn)父類的方法時(重載/重寫或?qū)崿F(xiàn)抽象方法)的后置條件(即方法的輸出/返回值)要比父類更嚴(yán)格或相等。

里式替換原則的優(yōu)點(diǎn)

約束繼承泛濫,是開閉原則的一種體現(xiàn)。

加強(qiáng)程序的健壯性,同時變更時也可以做到非常好地提高程序的維護(hù)性、擴(kuò)展性。降低需求變更時引入的風(fēng)險。


迪米特原則(最少知道原則)(Law of Demeter ,LoD)

概念理解

對于面向OOD來說,又被解釋為下面兩種方式:

1)一個軟件實(shí)體應(yīng)當(dāng)盡可能少地與其他實(shí)體發(fā)生相互作用。

2)每一個軟件單位對其他的單位都只有最少的知識,而且局限于那些與本單位密切相關(guān)的軟件單位。

朋友圈的確定

“朋友”條件:

1.當(dāng)前對象本身(this)

2.以參量形式傳入到當(dāng)前對象方法中的對象

3.當(dāng)前對象的實(shí)例變量直接引用的對象

4.當(dāng)前對象的實(shí)例變量如果是一個聚集,那么聚集中的元素也都是朋友

5.當(dāng)前對象所創(chuàng)建的對象

任何一個對象,如果滿足上面的條件之一,就是當(dāng)前對象的“朋友”,否則就是“陌生人”。

迪米特原則的優(yōu)缺點(diǎn)

迪米特原則的初衷在于降低類之間的耦合。由于每個類盡量減少對其他類的依賴,因此,很容易使得系統(tǒng)的功能模塊功能獨(dú)立,相互之間不存在(或很少有)依賴關(guān)系。

迪米特原則不希望類直接建立直接的接觸。如果真的有需要建立聯(lián)系,也希望能通過它的友元類來轉(zhuǎn)達(dá)。因此,應(yīng)用迪米特原則有可能造成的一個后果就是:系統(tǒng)中存在大量的中介類,這些類之所以存在完全是為了傳遞類之間的相互調(diào)用關(guān)系,這在一定程度上增加了系統(tǒng)的復(fù)雜度。


單一職責(zé)原則

永遠(yuǎn)不要讓一個類存在多個改變的理由。

換句話說,如果一個類需要改變,改變它的理由永遠(yuǎn)只有一個。如果存在多個改變它的理由,就需要重新設(shè)計(jì)該類。

單一職責(zé)原則原則的核心含意是:只能讓一個類/接口/方法有且僅有一個職責(zé)。

為什么一個類不能有多于一個以上的職責(zé)?

如果一個類具有一個以上的職責(zé),那么就會有多個不同的原因引起該類變化,而這種變化將影響到該類不同職責(zé)的使用者(不同用戶):

一方面,如果一個職責(zé)使用了外部類庫,則使用另外一個職責(zé)的用戶卻也不得不包含這個未被使用的外部類庫。

另一方面,某個用戶由于某個原因需要修改其中一個職責(zé),另外一個職責(zé)的用戶也將受到影響,他將不得不重新編譯和配置。

這違反了設(shè)計(jì)的開閉原則,也不是我們所期望的。


接口分隔原則(Interface Segregation Principle ,ISP)

不能強(qiáng)迫用戶去依賴那些他們不使用的接口。

概念理解

換句話說,使用多個專門的接口比使用單一的總接口總要好。

它包含了2層意思:

接口的設(shè)計(jì)原則:接口的設(shè)計(jì)應(yīng)該遵循最小接口原則,不要把用戶不使用的方法塞進(jìn)同一個接口里。如果一個接口的方法沒有被使用到,則說明該接口過胖,應(yīng)該將其分割成幾個功能專一的接口。

接口的依賴(繼承)原則:如果一個接口a繼承另一個接口b,則接口a相當(dāng)于繼承了接口b的方法,那么繼承了接口b后的接口a也應(yīng)該遵循上述原則:不應(yīng)該包含用戶不使用的方法。 反之,則說明接口a被b給污染了,應(yīng)該重新設(shè)計(jì)它們的關(guān)系。

如果用戶被迫依賴他們不使用的接口,當(dāng)接口發(fā)生改變時,他們也不得不跟著改變。換而言之,一個用戶依賴了未使用但被其他用戶使用的接口,當(dāng)其他用戶修改該接口時,依賴該接口的所有用戶都將受到影響。這顯然違反了開閉原則,也不是我們所期望的。

指導(dǎo)意義

一個類對一個類的依賴應(yīng)該建立在最小的接口上

建立單一接口,不要建立龐大臃腫的接口

盡量細(xì)化接口,接口中的方法盡量少


依賴倒置原則(Dependency Inversion Principle ,DIP)

高層模塊不應(yīng)該依賴于低層模塊,二者都應(yīng)該依賴于抽象

抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象 C.針對接口編程,不要針對實(shí)現(xiàn)編程。

概念理解

依賴:在程序設(shè)計(jì)中,如果一個模塊a使用/調(diào)用了另一個模塊b,我們稱模塊a依賴模塊b。

高層模塊與低層模塊:往往在一個應(yīng)用程序中,我們有一些低層次的類,這些類實(shí)現(xiàn)了一些基本的或初級的操作,我們稱之為低層模塊;另外有一些高層次的類,這些類封裝了某些復(fù)雜的邏輯,并且依賴于低層次的類,這些類我們稱之為高層模塊。

依賴倒置(Dependency Inversion)

面向?qū)ο蟪绦蛟O(shè)計(jì)相對于面向過程(結(jié)構(gòu)化)程序設(shè)計(jì)而言,依賴關(guān)系被倒置了。因?yàn)閭鹘y(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)中,高層模塊總是依賴于低層模塊。

抽象接口是對低層模塊的抽象,低層模塊繼承或?qū)崿F(xiàn)該抽象接口。

這樣,高層模塊不直接依賴低層模塊,而是依賴抽象接口層。抽象接口也不依賴低層模塊的實(shí)現(xiàn)細(xì)節(jié),而是低層模塊依賴(繼承或?qū)崿F(xiàn))抽象接口。

類與類之間都通過抽象接口層來建立關(guān)系。


組合/聚合復(fù)用原則(Composite/Aggregate Reuse Principle ,CARP)

盡量使用組合/聚合,不要使用類繼承。

概念理解

即在一個新的對象里面使用一些已有的對象,使之成為新對象的一部分,新對象通過向這些對象的委派達(dá)到復(fù)用已有功能的目的。就是說要盡量的使用合成和聚合,而不是繼承關(guān)系達(dá)到復(fù)用的目的。

組合和聚合都是關(guān)聯(lián)的特殊種類。

聚合表示整體和部分的關(guān)系,表示“擁有”。組合則是一種更強(qiáng)的“擁有”,部分和整體的生命周期一樣。

組合的新的對象完全支配其組成部分,包括它們的創(chuàng)建和湮滅等。一個組合關(guān)系的成分對象是不能與另一個組合關(guān)系共享的。

組合是值的聚合(Aggregation by Value),而一般說的聚合是引用的聚合(Aggregation by Reference)。

在面向?qū)ο笤O(shè)計(jì)中,有兩種基本的辦法可以實(shí)現(xiàn)復(fù)用:第一種是通過組合/聚合,第二種就是通過繼承。

————————

對于熱愛編程的朋友來說,路再難走也要堅(jiān)持走下去!如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!

微信公眾號:C語言編程學(xué)習(xí)基地

C語言零基礎(chǔ)入門教程(83集全)

整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!

編程學(xué)習(xí)書籍分享:

粉絲編程交流:


軟件開發(fā):面向?qū)ο笤O(shè)計(jì)的七大原則!程序員一定要了解的評論 (共 條)

分享到微博請遵守國家法律
隆安县| 郑州市| 商洛市| 绥江县| 抚远县| 巍山| 尼玛县| 汉中市| 施甸县| 西峡县| 济源市| 菏泽市| 呼玛县| 即墨市| 雷波县| 清新县| 尉氏县| 沭阳县| 阳朔县| 济源市| 乌兰县| 湖南省| 嘉义市| 五华县| 安远县| 宁德市| 胶南市| 梅州市| 集贤县| 固安县| 繁昌县| 辉南县| 山阳县| 泾源县| 襄城县| 邯郸县| 义马市| 榆林市| 密山市| 盖州市| 蓬溪县|