摘要:由于重點(diǎn)是要降低你需要在頭腦中同時(shí)考慮的項(xiàng)目的數(shù)量,所以降低一個(gè)給定子程序的復(fù)雜度是有價(jià)值的。應(yīng)該把決策點(diǎn)的數(shù)量當(dāng)作一個(gè)警示,該警示說明你的某個(gè)子程序可能需要重新設(shè)計(jì)了。
在 PHP 程序中,類、方法(子程序)、函數(shù)是最常見的形態(tài),在平時(shí)的編程里開發(fā)者時(shí)常會(huì)對(duì)代碼的復(fù)雜度做度量,簡(jiǎn)潔抑或復(fù)雜,都是自己憑著主觀意識(shí)來評(píng)判,經(jīng)驗(yàn)豐富的開發(fā)者可能會(huì)有自己的評(píng)判標(biāo)準(zhǔn),但一些經(jīng)驗(yàn)尚淺的開發(fā)者寫出來的代碼可能在 Code Review 階段就得返修幾次,因?yàn)樗麄冞€沒有能對(duì)自己的代碼進(jìn)行質(zhì)量評(píng)測(cè)的能力,或者說沒有可以量化的標(biāo)準(zhǔn)給他們參考,那么量化的參考標(biāo)準(zhǔn)是什么呢?
《代碼大全》458頁(yè)中有提到一個(gè)方法可以幫助開發(fā)者度量代碼的復(fù)雜度,此方法最先由 Tom McCabe 提出,通過計(jì)算子程序中“決策點(diǎn)”的數(shù)量來衡量復(fù)雜度,步驟如下:
從 1 開始,一直往下通過程序;
一旦遇到以下關(guān)鍵字,或者其同類的詞,就加1;(if、while、for、foreach、and、or、&&、||)
給 case 語句中的每一種情況加 1;
舉個(gè)例子:
if ((status && done) || (notDone && (numLines >= maxLines))) { // code … }
在這段代碼中,從 1 算起,遇到 if 得 2,&& 得 3,|| 得4,&& 得 5。加起來,這段代碼里總共包含了 5 個(gè)決策點(diǎn)。
如何處理復(fù)雜度的度量結(jié)果計(jì)算出決策點(diǎn)的數(shù)量以后,你就可以用得到的數(shù)值分析你寫的子程序的復(fù)雜度了:
0-5 子程序還不錯(cuò);
6-10 得想辦法簡(jiǎn)化子程序了;
10+ 把子程序的某一部分拆分成另一個(gè)子程序并調(diào)用它;
把子程序的一部分提取成另一個(gè)子程序,不會(huì)降低整個(gè)程序的復(fù)雜度,只是把決策點(diǎn)移到其他地方,但是這樣做可以降低你在同一時(shí)間必須關(guān)注的復(fù)雜度水平。由于重點(diǎn)是要降低你需要在頭腦中同時(shí)考慮的項(xiàng)目的數(shù)量,所以降低一個(gè)給定子程序的復(fù)雜度是有價(jià)值的。
10 個(gè)決策點(diǎn)的上限并不是絕對(duì)的。應(yīng)該把決策點(diǎn)的數(shù)量當(dāng)作一個(gè)警示,該警示說明你的某個(gè)子程序可能需要重新設(shè)計(jì)了。
這個(gè)方法不是通用的標(biāo)準(zhǔn),它是可以靈活變通的,上面也提到,決策點(diǎn)的數(shù)量不是絕對(duì)的,只是一個(gè)參考和警示,具體的還得看子程序的邏輯需求,不要死守這個(gè)規(guī)則。一條情況很多的 case 語句可能會(huì)包含超過 10 個(gè)的元素。如果硬拆開它可能就是很愚蠢的,這取決于該 case 語句的用途。
還沒有總結(jié)出測(cè)量標(biāo)準(zhǔn)的開發(fā)者可以借鑒下McCabe 的測(cè)量方法,相信它能很好的幫助你控制好你的代碼質(zhì)量。
擴(kuò)展其他的度量方法:
所用的數(shù)據(jù)量;
控制結(jié)構(gòu)中的嵌套層數(shù);
代碼行數(shù);
對(duì)同一變量的先后引用之間的代碼行數(shù)(跨度);
變量生存的代碼行數(shù)(生存期);
以及輸入和輸出的量;
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21840.html
摘要:設(shè)計(jì)方案的容易改變這就是所謂的軟件構(gòu)建的可維護(hù)性,可擴(kuò)展性和靈活性。這也可能表明類型或方法可能難以維護(hù)?;谠创a中不同運(yùn)算符和操作數(shù)的數(shù)量的合成度量。對(duì)修改的封閉這種模塊的源代碼是不可侵犯的。 大綱 軟件維護(hù)和演變可維護(hù)性度量模塊化設(shè)計(jì)和模塊化原則OO設(shè)計(jì)原則:SOLIDOO設(shè)計(jì)原則:GRASP總結(jié) 軟件維護(hù)和演變 什么是軟件維護(hù)? 軟件工程中的軟件維護(hù)是交付后修改軟件產(chǎn)品以糾正故障...
摘要:大綱什么是軟件復(fù)用如何衡量可復(fù)用性可復(fù)用組件的級(jí)別和形態(tài)源代碼級(jí)別復(fù)用模塊級(jí)別的復(fù)用類抽象類接口庫(kù)級(jí)別的復(fù)用包系統(tǒng)級(jí)別的復(fù)用框架對(duì)可復(fù)用性的外部觀察類型變化例行分組實(shí)施變更代表獨(dú)立分解常見行為總結(jié)什么是軟件復(fù)用軟件復(fù)用軟件復(fù)用是使用現(xiàn)有軟件 大綱 什么是軟件復(fù)用?如何衡量可復(fù)用性?可復(fù)用組件的級(jí)別和形態(tài) 源代碼級(jí)別復(fù)用 模塊級(jí)別的復(fù)用:類/抽象類/接口 庫(kù)級(jí)別的復(fù)用:API /包 系...
閱讀 1173·2023-04-26 01:35
閱讀 2567·2021-11-02 14:44
閱讀 7711·2021-09-22 15:38
閱讀 2250·2021-09-06 15:11
閱讀 3741·2019-08-30 15:53
閱讀 843·2019-08-29 16:54
閱讀 670·2019-08-26 13:48
閱讀 1787·2019-08-26 13:47