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

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

軟件設(shè)計的基本原則:

2023-03-31 23:20 作者:bili_95355562225  | 我要投稿

在介紹設(shè)計模式之前,先了解一下軟件設(shè)計的基本原則,這些原則無數(shù)熱愛編程的前輩經(jīng)過多年的摸索總結(jié)出了的,也是設(shè)計模式的理論基礎(chǔ)

1. 單一職責(zé)原則(Single Responsibility Principle,SRP)

類的職責(zé)要單一。就一個類而言,應(yīng)該僅有一個引起它變化的原因,就是一個類應(yīng)該只負(fù)責(zé)一個職責(zé)

這個說起來簡單,實際項目中,沒那么簡單,要考慮模塊顆粒度大小的問題

太大耦合度會變高,太小類會變多變的繁瑣。

核心思想:類的職責(zé)要單一

2. 開閉原則(Open Close Principle,OCP)

一個軟件實體應(yīng)當(dāng)對擴展開放,對修改關(guān)閉。即軟件實體應(yīng)盡量在不修改原有代碼的情況下進(jìn)行擴展。

用抽象構(gòu)建框架,用實現(xiàn)擴展細(xì)節(jié)。因為抽象靈活性好,適應(yīng)性廣,只要抽象的合理,可以基本保持軟件架構(gòu)的穩(wěn)定。而軟件中易變的細(xì)節(jié),我們用從抽象派生的實現(xiàn)類來進(jìn)行擴展,當(dāng)軟件需要發(fā)生變化時,我們只需要根據(jù)需求重新派生一個實現(xiàn)類來擴展就可以了。當(dāng)然前提是我們的抽象要合理,要對需求的變更有前瞻性和預(yù)見性才行。

核心思想:對擴展開放,對修改關(guān)閉。

如新增業(yè)務(wù)需求時通過新增類來實現(xiàn),不修改之前的代碼或很少改動。

3. 依賴倒置原則(Dependence Inversion Principle,DIP)

1、高層模塊不應(yīng)該依賴底層模塊,二者都應(yīng)該依賴抽象。

  2、抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象。

  3、依賴倒置的中心思想是面向接口編程。

  4、依賴倒置原則是基于這樣的設(shè)計理念:相對于細(xì)節(jié)的多變性,抽象的東西要穩(wěn)定的多。以抽象為基礎(chǔ)搭建的架構(gòu)比以細(xì)節(jié)為基礎(chǔ)搭建的架構(gòu)要穩(wěn)定的多。

  5、使用接口或抽象類的目的是指定好規(guī)范,而不涉及任何具體的操作,把展現(xiàn)細(xì)節(jié)的任務(wù)交給他們的實現(xiàn)類來完成。

依賴倒置原則的本質(zhì)就是通過抽象(接口或抽象類)使各個類或模塊的實現(xiàn)彼此獨立,不互相影響,實現(xiàn)模塊間的松耦合。我們在項目中使用這個原則要遵循下面的規(guī)則:

  1、每個類盡量都有接口或者抽象類,或者抽象類和接口兩都具備

  2、變量的表面類型盡量是接口或者抽象類

  3、任何類都不應(yīng)該從具體類派生

  4、盡量不要覆寫基類的方法

  5、如果基類是一個抽象類,而這個方法已經(jīng)實現(xiàn)了,子類盡量不要覆寫。類間依賴的是抽象,覆寫了抽象方法,對依賴的穩(wěn)定性會有一定的影響

  6、結(jié)合里氏替換原則使用

高層模塊不應(yīng)該依賴底層模塊,兩個都應(yīng)該依賴抽象;抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象。后面這句話換個方式說就是針對接口編程,不要對實現(xiàn)編程。

核心思想:代碼應(yīng)該依賴于抽象,而不是具體實現(xiàn)。

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

子類型必須能夠替換掉它們的父類型。

  里氏替換至少包含一下兩個含義:

    1、里氏替換原則是針對繼承而言的,如果繼承是為了實現(xiàn)代碼重用,也就是為了共享方法,那么共享的父類方法就應(yīng)該保持不變,不能被子類重新定義。子類只能通過新添加方法來擴展功能,父類和子類都可以實例化,而子類繼承的方法和父類是一樣的,父類調(diào)用方法的地方,子類也可以調(diào)用同一個繼承得來的,邏輯和父類一致的方法,這時用子類對象將父類對象替換掉時,當(dāng)然邏輯一致,相安無事。

    2、如果繼承的目的是為了多態(tài),而多態(tài)的前提就是子類覆蓋并重新定義父類的方法,為了符合LSP,我們應(yīng)該將父類定義為抽象類,并定義抽象方法,讓子類重新定義這些方法,當(dāng)父類是抽象類時,父類就是不能實例化,所以也不存在可實例化的父類對象在程序里。也就不存在子類替換父類實例(根本不存在父類實例了)時邏輯不一致的可能。

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

  2、子類可以增加自己特有的方法

  3、當(dāng)子類的方法重載父類的方法時,方法的形參要比父類方法的輸入?yún)?shù)更寬松

  4、當(dāng)子類的方法實現(xiàn)父類的抽象方法時,方法的返回值應(yīng)比父類更嚴(yán)格

優(yōu)點:

  可以大大減少程序的bug以及增強代碼的可讀性

核心思想:子類可以替換父類。子類不要重寫父類的非抽象方法。

5. 接口隔離原則(Interface Segregation Principle,ISP)

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

1、客戶端不應(yīng)依賴它不需要的接口

2、類間的依賴關(guān)系應(yīng)該建立在最小的接口上

  其實通俗來理解就是,不要在一個接口里面放很多的方法,這樣會顯得這個類很臃腫。接口應(yīng)該盡量細(xì)化,一個接口對應(yīng)一個功能模塊,同時接口里面的方法應(yīng)該盡可能的少,使接口更加靈活輕便?;蛟S有的人認(rèn)為接口隔離原則和單一職責(zé)原則很像,但兩個原則還是存在著明顯的區(qū)別。單一職責(zé)原則是在業(yè)務(wù)邏輯上的劃分,注重的是職責(zé)。接口隔離原則是基于接口設(shè)計考慮。例如一個接口的職責(zé)包含10個方法,這10個方法都放在同一接口中,并且提供給多個模塊調(diào)用,但不同模塊需要依賴的方法是不一樣的,這時模塊為了實現(xiàn)自己的功能就不得不實現(xiàn)一些對其沒有意義的方法,這樣的設(shè)計是不符合接口隔離原則的。接口隔離原則要求"盡量使用多個專門的接口"專門提供給不同的模塊。

核心思想:盡量細(xì)化接口,接口中的方法盡量少,同時要注意適度原則,過大的話會增加耦合性,而過小的話會增加復(fù)雜性和開發(fā)成本。

6. 迪米特法則(Law of Demeter,LoD)/最少知識原則(Least Knowledge Principle,LKP)

一個類對自己依賴的類知道的越少越好;一個對象應(yīng)該對其他對象有最少的了解。

每個類都應(yīng)該盡量降低成員的訪問權(quán)限,強調(diào)了類之間的松耦合。

也叫最少知識原則。迪米特法則的定義是只與你的直接朋友交談,不與"陌生人"說話。如果兩個軟件實體無須直接通信,那么就不應(yīng)當(dāng)發(fā)生直接的相互調(diào)用,可以通過第三方轉(zhuǎn)發(fā)該應(yīng)用。其目的是降低類之間的耦合度,提高模塊的相對獨立性。

  迪米特法則中的朋友是指:當(dāng)前對象本身、當(dāng)前對象的成員對象、當(dāng)前對象所創(chuàng)建的對象、當(dāng)前對象的方法參數(shù)等,這些對象存在關(guān)聯(lián)、聚合或組合關(guān)系,可以直接訪問這些對象的方法。

優(yōu)點:

  1、降低類之間的耦合度,提高模塊的相對獨立性。

  2、由于親和度降低,從而提高了類的可復(fù)用率和系統(tǒng)的擴展性。

缺點:

  過度使用迪米特法則會使系統(tǒng)產(chǎn)生大量的中介類,從而增加系統(tǒng)的復(fù)雜性,使模塊之間的通信效率降低。所以,在釆用迪米特法則時需要反復(fù)權(quán)衡,確保高內(nèi)聚和低耦合的同時,保證系統(tǒng)的結(jié)構(gòu)清晰。

使用迪米特法則需要注意:

  1、在類的劃分上,應(yīng)該創(chuàng)建弱耦合的類。類與類之間的耦合越弱,就越有利于實現(xiàn)可復(fù)用的目標(biāo)。

  2、在類的結(jié)構(gòu)設(shè)計上,盡量降低類成員的訪問權(quán)限。

  3、在類的設(shè)計上,優(yōu)先考慮將一個類設(shè)置成不變類。

  4、在對其他類的引用上,將引用其他對象的次數(shù)降到最低。

  5、不暴露類的屬性成員,而應(yīng)該提供相應(yīng)的訪問器(set 和 get 方法)。

  6、謹(jǐn)慎使用序列化(Serializable)功能。

核心思想:一個軟件實體應(yīng)當(dāng)盡可能少的與其他實體發(fā)生相互作用。

只暴露該暴露的方法

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

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

合成(組合)表示一種強的“擁有”關(guān)系,體現(xiàn)了嚴(yán)格的部分與整體的關(guān)系,他們的生命周期相同;

而聚合表示一種弱的“擁有”關(guān)系,體現(xiàn)的是A對象可以包含B對象,但B對象不是A對象的一部分。

繼承帶來的問題:

  1. 子類繼承了父類所有的行為,會讓子類無意的暴露的不必要的接口,破壞封裝性。

  2. 如果繼承層級比較多,那么代碼的復(fù)雜度、可閱讀型就可想而知的難了。

  3. 另外一個點,就是非常不好做單元測試。

如果類之間的繼承結(jié)構(gòu)穩(wěn)定(不會輕易改變),繼承層次比較淺(比如,最多有兩層繼承關(guān)系),繼承關(guān)系不復(fù)雜,我們就可以大膽地使用繼承。反之,系統(tǒng)越不穩(wěn)定,繼承層次很深,繼承關(guān)系復(fù)雜,我們就盡量使用組合來替代繼承。

核心思想:盡量使用合成/聚合,盡量不要使用類繼承。

總結(jié):

單一職責(zé)原則告訴我們實現(xiàn)類要職責(zé)單一;

依賴倒置原則告訴我們要面向接口編程;

里氏替換原則告訴我們不要破壞繼承體系;

接口隔離原則告訴我們在設(shè)計接口的時候要精簡單一;

迪米特法則告訴我們要降低耦合。

而開閉原則是總綱,他告訴我們要對擴展開放,對修改關(guān)閉。


軟件設(shè)計的基本原則:的評論 (共 條)

分享到微博請遵守國家法律
富锦市| 庐江县| 汝城县| 左贡县| 清远市| 凤山市| 家居| 朝阳市| 东乌| 论坛| 稻城县| 鲁甸县| 泗洪县| 巴东县| 托克逊县| 乌兰县| 许昌县| 中方县| 马公市| 兖州市| 凤庆县| 阳原县| 嘉定区| 宁陕县| 墨脱县| 岗巴县| 海兴县| 富宁县| 苗栗县| 凤阳县| 通辽市| 金沙县| 章丘市| 厦门市| 孝义市| 镇坪县| 东台市| 志丹县| 郴州市| 高安市| 沅江市|