成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何有效的解決代碼的圈復(fù)雜度

開(kāi)發(fā) 前端
不過(guò)最后我們也看到了,實(shí)際上,只是刻板的使用圈復(fù)雜度的算法,去度量一個(gè)段代碼的清晰度,有時(shí)候也是不可取的,所以我們?cè)谥貥?gòu)系統(tǒng)的時(shí)候,可以通過(guò)圈復(fù)雜度的工具,進(jìn)行復(fù)雜度的統(tǒng)計(jì),然后對(duì)復(fù)雜度高的代碼,具體場(chǎng)景,具體分析。而不能一味的教條。

作者:京東零售 張學(xué)剛

背景介紹

不管小型公司還是大型互聯(lián)網(wǎng)公司,很多項(xiàng)目債臺(tái)高筑,新功能開(kāi)發(fā)困難。其中一個(gè)很大的原因就是代碼復(fù)雜,可讀性差。Sonar開(kāi)發(fā)團(tuán)隊(duì)曾上綱上線的戲稱開(kāi)發(fā)人員的7宗罪,其中很關(guān)鍵的一條就是“復(fù)雜度”。那復(fù)雜度有沒(méi)有一個(gè)明確的衡量標(biāo)準(zhǔn),我們又如何去解決代碼的圈復(fù)雜度呢?今天我在這里和大家聊一下。

圈復(fù)雜度的計(jì)算方法

我們先來(lái)看一下圈復(fù)雜度與代碼質(zhì)量以及測(cè)試和維護(hù)成本之間的一個(gè)關(guān)系。

我們可以看到當(dāng)圈復(fù)雜度,在1-10之間的時(shí)候,代碼是清晰,結(jié)構(gòu)化的。可測(cè)試性比較高,維護(hù)成本也比較低。隨著圈復(fù)雜度的升高,代碼的狀況開(kāi)始惡化,當(dāng)大于30的時(shí)候,代碼已經(jīng)逐步變?yōu)椴豢勺x,維護(hù)成本非常高。

點(diǎn)邊計(jì)算法

那圈復(fù)雜度是如何計(jì)算的呢,常用的第一種方法叫做點(diǎn)邊計(jì)算法,它圈復(fù)雜度的計(jì)算方式 V(G) = E ? N + 2,我們用下邊圖來(lái)解釋一下這個(gè)公式:

其中公式之中的E指的是控制流圖中邊的數(shù)量,N指的是控制流圖中的節(jié)點(diǎn)數(shù)量。這兩個(gè)圖形指的就是控制流圖。那我們可以計(jì)算一下,第一個(gè)控制流圖的圈復(fù)雜度是:4-4+2=2.

節(jié)點(diǎn)判定法

除此之外圈復(fù)雜度還有一種更為直觀的計(jì)算方法,因?yàn)槿?fù)雜度實(shí)際上體現(xiàn)了“判定條件”的數(shù)量,所以圈復(fù)雜度實(shí)際上就是等于判定節(jié)點(diǎn)的數(shù)量再加上1。它的計(jì)算公式為:V (G) = P + 1 其中判定節(jié)點(diǎn)(P)指的是我們常用的分支語(yǔ)句。例如if語(yǔ)句、while語(yǔ)句、case語(yǔ)句等。

那如何來(lái)降低圈復(fù)雜度呢?

圈復(fù)雜度的常用解決方法

提煉函數(shù)

接下來(lái)我們重點(diǎn)介紹一些降低圈復(fù)雜的方法,我通過(guò)工作中常見(jiàn)的代碼,來(lái)表述一下,如何去降低復(fù)雜度,如果你有更好的方法,也歡迎留言跟我交流。在我們的工作中,做業(yè)務(wù)系統(tǒng)的時(shí)候,通過(guò)異步消息進(jìn)行數(shù)據(jù)傳遞,是比較常用的一種方式,在我們監(jiān)聽(tīng)到對(duì)端系統(tǒng)的消息的時(shí)候,一般會(huì)做這幾件事情。判斷消息是否為空-->轉(zhuǎn)換消息為數(shù)據(jù)傳輸對(duì)象DTO-->進(jìn)一步的判斷對(duì)象的數(shù)據(jù)是否合法-->進(jìn)行業(yè)務(wù)邏輯的處理。這幾個(gè)典型的步驟,很多童鞋可能用左邊圖的方式進(jìn)行處理。這個(gè)時(shí)候,如果每一個(gè)步驟的方法比較復(fù)雜的時(shí)候,這個(gè)總的方法會(huì)非常復(fù)雜,這個(gè)時(shí)候,我們可以通過(guò)提煉方法的方式,對(duì)高內(nèi)聚的操作,提煉到一個(gè)獨(dú)立的方法中,來(lái)分治復(fù)雜性。??

使用衛(wèi)語(yǔ)句

我們知道圈復(fù)雜度的一個(gè)因素就是分支語(yǔ)句多,我們?cè)趯?xiě)業(yè)務(wù)代碼的時(shí)候,常見(jiàn)到這樣的一種代碼,if-then-else的層層嵌套。衛(wèi)語(yǔ)句的原則是,如果某個(gè)條件極其罕見(jiàn),就應(yīng)該單獨(dú)檢查該條件,并在該條件為真時(shí),立刻返回。下面是一個(gè)生產(chǎn)中的場(chǎng)景,如果記賬請(qǐng)求落庫(kù)成功后就進(jìn)行余額的操作,如果不成功就返回失敗結(jié)果。因?yàn)槁鋷?kù)失敗是不常見(jiàn)的,所以我們采用衛(wèi)語(yǔ)句的方式,來(lái)減少分支語(yǔ)句。讓代碼更清晰。

合并條件

經(jīng)常遇到一種情況,我們對(duì)錯(cuò)誤的處理,需要返回給調(diào)用方,內(nèi)部的錯(cuò)誤碼,為了方便快讀的定位錯(cuò)誤會(huì)非常詳細(xì),但是對(duì)外可能會(huì)泛化這種錯(cuò)誤碼,這個(gè)時(shí)候我們可以通過(guò)合并條件的方式,簡(jiǎn)化條件分支,來(lái)降低圈復(fù)雜度。下面是一個(gè)生產(chǎn)中的場(chǎng)景,如果記賬失敗,則對(duì)錯(cuò)誤結(jié)果進(jìn)行包裝處理,并返回給調(diào)用方。這個(gè)時(shí)候我們可以將錯(cuò)誤碼合并,這里它是合并到map中,然后針對(duì)這組錯(cuò)誤碼統(tǒng)一進(jìn)行了處理。??

通過(guò)多態(tài)方式替代條件式

在我們開(kāi)發(fā)中,如果是一個(gè)平臺(tái)化的系統(tǒng),很多時(shí)候,有這樣的需求。例如:不同的租戶、不同的業(yè)務(wù)甚至不同的訂單類型都會(huì)有不同的處理流程。 這個(gè)時(shí)候最簡(jiǎn)單的方式,就是通過(guò)條件分支來(lái)進(jìn)行不同的處理。但是當(dāng)業(yè)務(wù)繁多的時(shí)候,處理分支會(huì)顯得混亂,從而導(dǎo)致圈復(fù)雜度的升高,這個(gè)時(shí)候我們通過(guò)利用多態(tài)的方式,可以有效的降低復(fù)雜度。我們看一下下邊這段代碼,不同的訂單類型,使用不同的處理流程,這里他使用了在枚舉中實(shí)現(xiàn)多態(tài)的方式。我們發(fā)現(xiàn),其實(shí)他是實(shí)現(xiàn)了工廠模式。

替換算法

復(fù)雜算法會(huì)導(dǎo)致bug可能性的增加及可理解性/可維護(hù)性的降低,如果函數(shù)對(duì)性能要求不高,提倡使用簡(jiǎn)單明了的算法。這里我引用了重構(gòu)中的一個(gè)例子,我們可以一起看一下。這里傳入一個(gè)人名的數(shù)組,如果數(shù)組中包含指定的名稱,就立即返回名稱。??

分解條件式

在面對(duì)大塊頭的代碼時(shí),你可以通過(guò)提煉方法的方式,將它分解為多個(gè)方法。根據(jù)每個(gè)小塊代碼的用途,命名新的方法名。對(duì)于條件邏輯,將每個(gè)分支條件分解成新方法可以突出條件邏輯,并更清楚的表達(dá)每個(gè)分支的作用。比如下面的例子中,夏季的時(shí)候商品的折扣和非夏天的商品折扣,是不同的計(jì)算方法。 這個(gè)時(shí)候,我們可以把兩種算法,提煉到兩個(gè)不同的方法中.??

移除控制標(biāo)記

有時(shí)候我們會(huì)通過(guò)控制標(biāo)記來(lái)對(duì)循環(huán)進(jìn)行處理,我們看一下這樣的一段經(jīng)常使用的代碼,同一個(gè)數(shù)組列表中查找罪惡的人,匹配到任意一個(gè)罪惡的人后返回。這里found是控制標(biāo)記,我們可通過(guò)下邊的方式去掉控制標(biāo)記,來(lái)減少一層循環(huán),達(dá)到削減復(fù)雜度的效果。

圈復(fù)雜度的思辨

那是不是當(dāng)我們檢測(cè)到圈復(fù)雜度高的時(shí)候他就一定復(fù)雜呢,下面的代碼是一個(gè)生產(chǎn)上的例子,他通過(guò)傳入的MQ的名字,對(duì)MQ進(jìn)行手動(dòng)的暫停。這個(gè)地方實(shí)際上是可以通過(guò)mq的名稱,從spring的容器中,獲取bean的。這里的例子主要是讓大家看到,雖然,這個(gè)分支比較多,但是這種扁平化的結(jié)構(gòu)可讀性還是可以的。不過(guò)如果它做的不僅僅是一個(gè)暫停的操作,而是一個(gè)很復(fù)雜的操作,這個(gè)時(shí)候,可能就需要通過(guò)提煉方法的方式進(jìn)行重構(gòu)。如果提煉方法重構(gòu)后,這個(gè)類還是過(guò)長(zhǎng),那就需要我們通過(guò)使用多態(tài)的特性,利用工廠模式等方式進(jìn)行進(jìn)一步的重構(gòu)。如果一開(kāi)始我們就通過(guò)應(yīng)用一些復(fù)雜的設(shè)計(jì)模式進(jìn)行重構(gòu),就會(huì)存在過(guò)度設(shè)計(jì)的弊端,使代碼更不易于理解.??

總結(jié)

首先介紹了什么是圈復(fù)雜度,然后介紹了解決圈復(fù)雜度的幾種方法。

通過(guò)圈復(fù)雜度計(jì)算的兩種方式我們可以看到,圈復(fù)雜度的核心是分支語(yǔ)句。那解決問(wèn)題的核心就集中在如何去減少分支語(yǔ)句。

不過(guò)最后我們也看到了,實(shí)際上,只是刻板的使用圈復(fù)雜度的算法,去度量一個(gè)段代碼的清晰度,有時(shí)候也是不可取的,所以我們?cè)谥貥?gòu)系統(tǒng)的時(shí)候,可以通過(guò)圈復(fù)雜度的工具,進(jìn)行復(fù)雜度的統(tǒng)計(jì),然后對(duì)復(fù)雜度高的代碼,具體場(chǎng)景,具體分析。而不能一味的教條。

最后我們通過(guò)思維導(dǎo)圖來(lái)梳理一下:??

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2020-12-30 09:20:27

代碼

2022-08-16 09:04:23

代碼圈圈復(fù)雜度節(jié)點(diǎn)

2019-10-14 17:00:14

前端代碼圈復(fù)雜度

2024-06-05 09:35:00

2023-10-05 11:08:53

2024-04-25 08:33:25

算法時(shí)間復(fù)雜度空間復(fù)雜度

2013-08-01 13:18:41

代碼

2015-10-13 09:43:43

復(fù)雜度核心

2019-12-24 09:46:00

Linux設(shè)置密碼

2024-07-30 10:55:25

2021-09-17 10:44:50

算法復(fù)雜度空間

2019-11-18 12:41:35

算法Python計(jì)算復(fù)雜性理論

2021-10-15 09:43:12

希爾排序復(fù)雜度

2021-01-05 10:41:42

算法時(shí)間空間

2022-08-25 11:00:19

編程系統(tǒng)

2009-07-09 10:45:16

C#基本概念復(fù)雜度遞歸與接口

2018-12-18 10:11:37

軟件復(fù)雜度軟件系統(tǒng)軟件開(kāi)發(fā)

2020-02-06 13:59:48

javascript算法復(fù)雜度

2019-01-02 05:55:30

領(lǐng)域驅(qū)動(dòng)軟件復(fù)雜度

2024-08-22 14:39:34

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 激情网站在线 | 欧美xxxx色视频在线观看免费 | 在线观看国产www | 91色网站 | 米奇7777狠狠狠狠视频 | 精品福利一区 | 天天影视综合 | 四虎永久免费在线 | 日韩中出 | 午夜免费观看体验区 | 五月婷婷 六月丁香 | 国产精品国产三级国产aⅴ中文 | 午夜视频精品 | 色一阁| 国产一区二区三区精品久久久 | 草草视频在线免费观看 | 欧美v在线观看 | 欧美黄色一区 | 伊人免费观看视频 | 欧美黑人一区 | 日韩在线 | 亚洲第一区久久 | 久久爱综合 | 久久视频一区 | 91精品国产乱码久久蜜臀 | 精品免费国产视频 | 欧美色综合一区二区三区 | 国产精品一区二区在线 | 色天堂影院 | 国产精品高潮呻吟 | 在线观看免费av网 | 国产精品美女在线观看 | 欧美激情亚洲 | 日韩欧美亚洲 | 正在播放国产精品 | 国产精品日产欧美久久久久 | 在线观看亚洲 | 中文字幕精品一区二区三区精品 | 成人久久视频 | 一级片片 | 免费激情|