国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

青島網(wǎng)站制作企業(yè)站長(zhǎng)之家素材網(wǎng)

青島網(wǎng)站制作企業(yè),站長(zhǎng)之家素材網(wǎng),阿里接外包嗎網(wǎng)站開(kāi)發(fā),外貿(mào)soho做網(wǎng)站怎么做白皮書(shū)地址 摘要:圈復(fù)雜度最初是作為“可測(cè)試性和模塊控制流的“可維護(hù)性”。雖然它擅長(zhǎng)于衡量前者,但它的數(shù)學(xué)模型不能產(chǎn)生一個(gè)令人滿意的值來(lái)衡量后者。本文描述一種打破數(shù)學(xué)度量模型的新度量模型來(lái)評(píng)估代碼,以彌補(bǔ)圈復(fù)雜度的缺點(diǎn)&#xf…

白皮書(shū)地址

摘要:圈復(fù)雜度最初是作為“可測(cè)試性和模塊控制流的“可維護(hù)性”。雖然它擅長(zhǎng)于衡量前者,但它的數(shù)學(xué)模型不能產(chǎn)生一個(gè)令人滿意的值來(lái)衡量后者。本文描述一種打破數(shù)學(xué)度量模型的新度量模型來(lái)評(píng)估代碼,以彌補(bǔ)圈復(fù)雜度的缺點(diǎn),更準(zhǔn)確地反映理解難度的測(cè)量方法,對(duì)于方法、類和應(yīng)用程序都是有效的。

1、介紹

Thomas J. McCabe的圈復(fù)雜度長(zhǎng)期以來(lái),作為測(cè)量方法控制流的復(fù)雜性的標(biāo)準(zhǔn)。它最初的目的是“識(shí)別”軟件模塊將難以測(cè)試或維護(hù)”,同時(shí)它可以精確計(jì)算完全覆蓋一個(gè)方法所需的最小測(cè)試用例數(shù)量,但是,它對(duì)可理解性的度量滿足不了人們需要。這是因?yàn)榫哂邢嗤?fù)雜度的方法,不一定會(huì)給維護(hù)者帶來(lái)同樣的困難,導(dǎo)致一種感覺(jué)通過(guò)高估某些結(jié)構(gòu),而低估其他結(jié)構(gòu)。同時(shí),圈復(fù)雜度不再是全面的。用一種在1976年的Fortran環(huán)境中,它不包括現(xiàn)代語(yǔ)言結(jié)構(gòu),比如try/catch和λ表達(dá)式。最后,因?yàn)槊糠N方法的最小圈復(fù)雜度得分為1,所以它是不可能知道一個(gè)具有高的聚合圈復(fù)雜度的類到底是一個(gè)易于維護(hù)的大類,還是一個(gè)具有復(fù)雜控制流的小類。除了在類水平上,人們普遍認(rèn)為應(yīng)用程序的圈復(fù)雜度得分,是與其代碼總數(shù)相關(guān)聯(lián)。換句話說(shuō),圈復(fù)雜度是在方法級(jí)別以上很少使用。作為這些問(wèn)題的補(bǔ)救措施,認(rèn)知復(fù)雜性已經(jīng)制定了解決現(xiàn)代語(yǔ)言結(jié)構(gòu)的方案,并在類和應(yīng)用程序水平上產(chǎn)生有意義的價(jià)值。更重要的是,它偏離了基于評(píng)估代碼的數(shù)學(xué)模型,使它可以產(chǎn)生評(píng)估的控制流與程序員對(duì)理解這些代碼所需要的心理或認(rèn)知努力的認(rèn)知流對(duì)應(yīng)起來(lái)。

1.1 問(wèn)題討論

用一個(gè)例子來(lái)開(kāi)始引出復(fù)雜性的討論,以下兩種方法具有相同的圈復(fù)雜度,但是在可理解性方面有顯著不同。

int sumOfPrimes(int max) { // +1
int total = 0;
OUT: for (int i = 1; i <= max; ++i) { // +1
for (int j = 2; j < i; ++j) { // +1
if (i % j == 0) { // +1
continue OUT;
}
}
total += i;
}
return total;
} // 圈復(fù)雜度 4
String getWords(int number) { // +1
switch (number) {
case 1: // +1
return "one";
case 2: // +1
return "a couple";
case 3: // +1
return “a few”;
default:
return "lots";
}
} //  圈復(fù)雜度 4

基于數(shù)學(xué)模型的圈復(fù)雜度,這兩個(gè)方法的圈復(fù)雜度是相等的。然而,直觀上很明顯,sumofprime的控制流程比getWords更難理解。這就是為什么認(rèn)知復(fù)雜度(Cognitive Complexity)放棄這種基于評(píng)估控制流的數(shù)學(xué)模型,而去使用一套簡(jiǎn)單、面向程序員直覺(jué)的規(guī)則。

1.2 基本準(zhǔn)則及方法

認(rèn)知復(fù)雜性評(píng)分是根據(jù)以下三個(gè)基本規(guī)則:

  • 忽略簡(jiǎn)寫(xiě):把多句代碼縮寫(xiě)為一句可讀的代碼,不改變理解難度;
    Ignore structures that allow multiple statements to be readably shorthanded into one

  • 對(duì)線性的代碼邏輯中,出現(xiàn)一個(gè)打斷邏輯的東西,難度+1;
    Increment (add one) for each break in the linear flow of the code

  • 當(dāng)打斷邏輯的是一個(gè)嵌套時(shí),難度+1;
    Increment when flow-breaking structures are nested

以下四種不同類型,均會(huì)使認(rèn)知復(fù)雜度得分加一:

  • Nesting:把一段代碼邏輯嵌套在另一段邏輯中;
  • Structural:被嵌套的控制流結(jié)構(gòu);
  • Fundamental:不受嵌套影響的語(yǔ)句;
  • Hybrid:一些控制流結(jié)構(gòu),但不包含在嵌套中;

然而不同類型在數(shù)學(xué)上沒(méi)有區(qū)別,都只是對(duì)復(fù)雜度加一。在要計(jì)算的不同類別之間進(jìn)行區(qū)分,可以更輕松地了解某一處是否適用嵌套的邏輯。以下各節(jié)將進(jìn)一步詳細(xì)說(shuō)明這些規(guī)則及其背后的原理。

1.2.1 忽略簡(jiǎn)寫(xiě)

認(rèn)知復(fù)雜性的一個(gè)指導(dǎo)原則是,鼓勵(lì)良好的編碼實(shí)踐。也就是說(shuō),需要無(wú)視或低估讓代碼更可讀的feature(不進(jìn)行復(fù)雜度計(jì)算)?!胺椒ā北旧砭褪且粋€(gè)樸素的例子,把一段代碼拆的把幾句抽離成一個(gè)方法,用一句方法調(diào)用代替掉,“簡(jiǎn)寫(xiě)”它,認(rèn)知復(fù)雜度不會(huì)因?yàn)檫@這一次方法調(diào)用增加。同樣的,認(rèn)知復(fù)雜度也會(huì)忽略掉null-coalescing操作符,x?.myObject這樣的操作符不增加復(fù)雜度,因?yàn)檫@些操作同樣是把多段代碼縮寫(xiě)為一項(xiàng)了。例如下面的兩段代碼:

MyObj myObj = null;
if (a != null) {
myObj = a.myObj;
}
MyObj myObj = a?.myObj

第一個(gè)的版本的意思需要一些時(shí)間來(lái)處理,而下邊的版本一旦理解了空合并語(yǔ)法,下邊就一目了然了。因此,認(rèn)知復(fù)雜性忽略了null-coalescing操作符。

1.2.2(Increment for breaks in the linear flow) 打斷線性代碼流程導(dǎo)致的復(fù)雜

在認(rèn)知復(fù)雜度的制定想法中,另一項(xiàng)指導(dǎo)原則是:結(jié)構(gòu)控制會(huì)打斷一條線性的流從頭到尾走完,使代碼的維護(hù)者需要花更大功夫來(lái)理解代碼。在認(rèn)定了這會(huì)導(dǎo)致額外負(fù)擔(dān)的前提下,認(rèn)知復(fù)雜度評(píng)估了以下幾種會(huì)增加Structural類復(fù)雜度:

  • 循環(huán): for, while, do while, ...
  • 條件: 三元運(yùn)算符, if, #if, #ifdef...
    另外,以下這種會(huì)計(jì)處Hybrid類復(fù)雜度: else if, elif, else, ...

但不計(jì)入Nesting類復(fù)雜度,因?yàn)檫@個(gè)量在計(jì)算之前的if語(yǔ)句時(shí)已經(jīng)計(jì)過(guò)了。
這些增加復(fù)雜度,其實(shí)和圈復(fù)雜度的計(jì)算方式非常像,但是額外的,認(rèn)知復(fù)雜度還會(huì)計(jì)算:

1.2.2.1 Catches

一個(gè)catch表達(dá)了控制流的一個(gè)分支,就像if一樣。因此每個(gè)catch語(yǔ)句都會(huì)增加Structural類的認(rèn)知復(fù)雜度,僅加1分,無(wú)論它c(diǎn)atch住多少種異常。(在我們的計(jì)算中try\finally被直接忽略掉)

1.2.2.2 Switches

一個(gè)switch語(yǔ)句,和它附帶的全部case綁在一起記為一個(gè)Structural類,來(lái)增加復(fù)雜度。
在圈復(fù)雜度下,一個(gè)switch語(yǔ)句被視為一系列的if-else鏈,因此每個(gè)case都會(huì)增加復(fù)雜度,因?yàn)闀?huì)使得控制流分支增多。
但以代碼維護(hù)的視角來(lái)看,一個(gè)switch:將單個(gè)變量與一組顯式的值比較,要比if-else鏈易于理解,因?yàn)閕f-else鏈可以用任意條件做比較。就是說(shuō)if-else if鏈必須仔細(xì)的逐個(gè)閱讀條件,而switch通常是可以一目了然的。

1.2.2.3 Sequences of logical operators (一系列的邏輯操作)

出于類似的原因,認(rèn)知復(fù)雜度不對(duì)每一個(gè)邏輯運(yùn)算符計(jì)分,而是考慮對(duì)連續(xù)的一組邏輯操作加分。例如下面幾個(gè)操作:

a && b
a && b && c && d
a || b
a || b || c || d

理解后一行的操作,不會(huì)比理解前一行的操作更難。但是對(duì)于下面兩行,理解難度有質(zhì)的區(qū)別:

a && b && c && d
a || b && c || d

因?yàn)閎oolean操作表達(dá)式混合使用時(shí)會(huì)更難理解,因此對(duì)這類操作每出現(xiàn)一個(gè),認(rèn)知復(fù)雜度都會(huì)不斷遞增。例如:

if (a            // +1 for `if`
&& b && c        // +1
|| d || e        // +1
&& f)            // +1
if (a            // +1 for `if`
&&               // +1
!(b && c))       // +1

盡管認(rèn)知復(fù)雜度相對(duì)于循環(huán)復(fù)雜度,為類似的運(yùn)算符提供了“折扣”,但它可以為所有的布爾運(yùn)算符都有所增加。(例如那些變量賦值,方法調(diào)用和返回語(yǔ)句)

1.2.2.4 Recursion(遞歸)

與圈復(fù)雜度不同,認(rèn)知復(fù)雜度對(duì)每一個(gè)遞歸調(diào)用,都增加一點(diǎn)Fundamental類復(fù)雜計(jì)分,不論是直接還是間接的。有兩個(gè)這樣做的動(dòng)機(jī):
1、遞歸表達(dá)了一種“元循環(huán)”,并且循環(huán)會(huì)增加認(rèn)知復(fù)雜度;
2、認(rèn)知復(fù)雜度希望能用于估計(jì)一個(gè)方法,其控制流難以理解的程度,而即使是一些有經(jīng)驗(yàn)的程序員,都覺(jué)得遞歸難以理解;

1.2.2.5 Jumps to labels

goto, break與continue到某處label,會(huì)增加Fundamental類復(fù)雜程度。但是在代碼過(guò)程中提前return,可以使代碼更清晰,所以其它類型的continue\break\return都不會(huì)導(dǎo)致復(fù)雜程度增加。

1.2.3 Increment for nested flow-break structures(嵌套打斷思路造成的復(fù)雜)

直覺(jué)看起來(lái)很明顯,由連續(xù)嵌套的五個(gè)結(jié)構(gòu)比,線性連續(xù)的五個(gè)if\for結(jié)構(gòu)要好理解得多(不考慮執(zhí)行路徑上的第一個(gè)部分有幾句代碼)。因?yàn)檫@樣的嵌套會(huì)增加理解代碼的成本,所以認(rèn)知復(fù)雜度在計(jì)算時(shí)會(huì)將其視為一個(gè)Nesting類復(fù)雜度增加。特別地,每一次有一個(gè)導(dǎo)致了Structural類或Hybrid類復(fù)雜的結(jié)構(gòu)體,嵌套了另一個(gè)結(jié)構(gòu)時(shí),每一層嵌套都要再加一次Nesting類復(fù)雜度。例如下面的例子,這個(gè)方法本身和try這兩項(xiàng)就不會(huì)計(jì)入Nesting類的復(fù)雜,因?yàn)樗鼈兗床皇荢tructure類也不是Hybrid類的復(fù)雜結(jié)構(gòu):

void myMethod () {
try {
if (condition1) { // +1
for (int i = 0; i < 10; i++) { // +2 (nesting=1)
while (condition2) {} // +3 (nesting=2)
}
}
} catch (ExcepType1 | ExcepType2 e) { // +1
if (condition2) {} // +2 (nesting=1)
}
} // Cognitive Complexity 9

然而,對(duì)于if\for\while\catch這些結(jié)構(gòu),全部被視為Structural類和Nesting類的復(fù)雜。此外,雖然最外層的方法被忽略了,并且lambda、#ifdef等類似功能也都不會(huì)視為Structral類的增量,但是它們會(huì)計(jì)入嵌套的層級(jí)數(shù):

void myMethod2 () {
Runnable r = () -> { // +0 (but nesting level is now 1)
if (condition1) {} // +2 (nesting=1)
};
} // Cognitive Complexity 2
#if DEBUG // +1 for if
void myMethod2 () { // +0 (nesting level is still 0)
Runnable r = () -> { // +0 (but nesting level is now 1)
if (condition1) {} // +3 (nesting=2)
};
} // Cognitive Complexity 4

1.2.4 The implications 含義

認(rèn)知復(fù)雜度制定的主要目標(biāo),是為方法計(jì)算出一個(gè)得分,準(zhǔn)確地反應(yīng)出此方法的相對(duì)理解難度。它的次要目標(biāo),是解決現(xiàn)代語(yǔ)言結(jié)構(gòu)的問(wèn)題,并產(chǎn)生在方法級(jí)別以上也有價(jià)值的指標(biāo)。 可以證明,解決現(xiàn)代語(yǔ)言結(jié)構(gòu)的目標(biāo)已經(jīng)實(shí)現(xiàn)。 其他兩個(gè)目標(biāo)在下面進(jìn)行了檢查。

1.2.4.1 Intuitively ‘right’ complexity scores( 直覺(jué)上對(duì)的復(fù)雜分)

在本篇開(kāi)頭的時(shí)候討論了兩個(gè)圈復(fù)雜度相同的方法(但它們有著完全不同的理解難度),現(xiàn)在回過(guò)頭來(lái)檢查一下這兩個(gè)方法的認(rèn)知復(fù)雜度:
在這里插入圖片描述
認(rèn)知復(fù)雜度算法,給這兩個(gè)方法完全不同的得分,這個(gè)得分結(jié)果更接近它們的相對(duì)理解成本。

1.2.4.2 Metrics that are valuable above the method level (方法級(jí)別之上也有用的指標(biāo))

更進(jìn)一步的,因?yàn)檎J(rèn)知復(fù)雜度不會(huì)因?yàn)榉椒ㄟ@個(gè)結(jié)構(gòu)增加,復(fù)雜度的總和開(kāi)始有用了起來(lái)。現(xiàn)在你可以看出兩個(gè)類:一個(gè)有大量的getter()\setter()方法,另一個(gè)類僅有一個(gè)極其復(fù)雜的控制流,可以簡(jiǎn)單的通過(guò)比較二者的認(rèn)知復(fù)雜度就行了。認(rèn)知復(fù)雜度可以成為衡量一個(gè)類或應(yīng)用的相對(duì)復(fù)雜度的工具。

2、Conclusion (結(jié)論)

編寫(xiě)和維護(hù)代碼是一個(gè)人為過(guò)程,它們的輸出必須遵守?cái)?shù)學(xué)模型,但它們本身不適合數(shù)學(xué)模型。 這就是為什么數(shù)學(xué)模型不足以評(píng)估其所需的工作量的原因。認(rèn)知復(fù)雜性不同于使用數(shù)學(xué)模型評(píng)估軟件可維護(hù)性的實(shí)踐。 它從圈復(fù)雜度設(shè)定的先例開(kāi)始,但是使用人工判斷來(lái)評(píng)估應(yīng)如何對(duì)結(jié)構(gòu)進(jìn)行計(jì)數(shù),并決定應(yīng)向模型整體添加哪些內(nèi)容。 結(jié)果,它得出的方法復(fù)雜性得分比以前的模型更能吸引程序員,因?yàn)樗鼈兪菍?duì)可理解性的更公平的相對(duì)評(píng)估。 此外,由于認(rèn)知復(fù)雜性不收取任何方法的“入門(mén)成本”,因此它不僅在方法級(jí)別,而且在類和服務(wù)級(jí)別,都產(chǎn)生了更加準(zhǔn)確的評(píng)估結(jié)果。

http://aloenet.com.cn/news/39657.html

相關(guān)文章:

  • 做網(wǎng)站插背景圖片如何變大整站seo排名要多少錢(qián)
  • 像芥末堆做內(nèi)容的網(wǎng)站網(wǎng)紅營(yíng)銷
  • 做網(wǎng)站需要多少錢(qián) 做企業(yè)網(wǎng)站建設(shè)方案策劃書(shū)
  • 餐飲類網(wǎng)站模板域名查詢系統(tǒng)
  • 利用帝國(guó)軟件如何做網(wǎng)站怎么開(kāi)一個(gè)網(wǎng)站平臺(tái)
  • 新媒體與網(wǎng)站建設(shè)北京seo營(yíng)銷培訓(xùn)
  • 鄭州微網(wǎng)站制作東莞seo網(wǎng)站管理
  • 做網(wǎng)站和seo流程網(wǎng)絡(luò)營(yíng)銷主要干什么
  • 沈陽(yáng)看男科哪家醫(yī)院好廣州seo排名收費(fèi)
  • 東營(yíng)網(wǎng)新聞精準(zhǔn)網(wǎng)站seo診斷報(bào)告
  • 網(wǎng)上免費(fèi)做網(wǎng)站seo 頁(yè)面鏈接優(yōu)化
  • 鎮(zhèn)江網(wǎng)站建設(shè) 的公司熱點(diǎn)新聞事件
  • 彩票推廣網(wǎng)站如何做杭州網(wǎng)站建設(shè)
  • 內(nèi)蒙古城鄉(xiāng)建設(shè)網(wǎng)站換名字了網(wǎng)絡(luò)推廣渠道都有哪些
  • 網(wǎng)站開(kāi)發(fā)工程師的要求站長(zhǎng)工具站長(zhǎng)之家官網(wǎng)
  • 成都網(wǎng)站開(kāi)發(fā)排名廈門(mén)關(guān)鍵詞排名優(yōu)化
  • 北京網(wǎng)站設(shè)計(jì)首選 新鴻儒360免費(fèi)建站教程
  • wordpress標(biāo)簽生成圖片基礎(chǔ)建站如何提升和優(yōu)化
  • wordpress 連接后臺(tái)關(guān)鍵詞優(yōu)化公司費(fèi)用多少
  • 網(wǎng)站內(nèi)移動(dòng)的圖片怎么做的深圳網(wǎng)絡(luò)優(yōu)化公司
  • 公司備案網(wǎng)站負(fù)責(zé)人是誰(shuí)網(wǎng)站推廣軟件哪個(gè)好
  • 淄博張店做網(wǎng)站的公司百度網(wǎng)站客服電話
  • 網(wǎng)站建設(shè)新聞發(fā)布注意事項(xiàng)互聯(lián)網(wǎng)怎么賺錢(qián)
  • 建設(shè)網(wǎng)站的英語(yǔ)怎么說(shuō)做網(wǎng)站的網(wǎng)絡(luò)公司
  • 微信小程序頁(yè)面模板seo文章是什么
  • 廣水市建設(shè)局網(wǎng)站線上培訓(xùn)
  • 建設(shè)網(wǎng)站的方案什么叫做優(yōu)化
  • rust做網(wǎng)站微商引流被加方法精準(zhǔn)客源
  • 如何建設(shè)成為營(yíng)銷網(wǎng)站百度客服電話24小時(shí)人工服務(wù)熱線
  • 向日葵域名怎么做網(wǎng)站成都網(wǎng)站搭建優(yōu)化推廣