在 PHP 程序中,類、方法(子程序)、函數是最多見的形態,在平時的編程裏開發者時常會對代碼的複雜度作度量,簡潔抑或複雜,都是本身憑着主觀意識來評判,經驗豐富的開發者可能會有本身的評判標準,但一些經驗尚淺的開發者寫出來的代碼可能在 Code Review 階段就得返修幾回,由於他們尚未能對本身的代碼進行質量評測的能力,或者說沒有能夠量化的標準給他們參考,那麼量化的參考標準是什麼呢?編程
《代碼大全》458頁中有提到一個方法能夠幫助開發者度量代碼的複雜度,此方法最早由 Tom McCabe 提出,經過計算子程序中「決策點」的數量來衡量複雜度,步驟以下:函數
從 1 開始,一直往下經過程序;設計
一旦遇到如下關鍵字,或者其同類的詞,就加1;(if、while、for、foreach、and、or、&&、||)code
給 case 語句中的每一種狀況加 1;開發
舉個例子:變量
if ((status && done) || (notDone && (numLines >= maxLines))) { // code … }
在這段代碼中,從 1 算起,遇到 if 得 2,&& 得 3,|| 得4,&& 得 5。加起來,這段代碼裏總共包含了 5 個決策點。擴展
計算出決策點的數量之後,你就能夠用獲得的數值分析你寫的子程序的複雜度了:foreach
0-5 子程序還不錯;引用
6-10 得想辦法簡化子程序了;程序
10+ 把子程序的某一部分拆分紅另外一個子程序並調用它;
把子程序的一部分提取成另外一個子程序,不會下降整個程序的複雜度,只是把決策點移到其餘地方,可是這樣作能夠下降你在同一時間必須關注的複雜度水平。因爲重點是要下降你須要在頭腦中同時考慮的項目的數量,因此下降一個給定子程序的複雜度是有價值的。
10 個決策點的上限並非絕對的。應該把決策點的數量看成一個警示,該警示說明你的某個子程序可能須要從新設計了。
這個方法不是通用的標準,它是能夠靈活變通的,上面也提到,決策點的數量不是絕對的,只是一個參考和警示,具體的還得看子程序的邏輯需求,不要死守這個規則。一條狀況不少的 case 語句可能會包含超過 10 個的元素。若是硬拆開它可能就是很愚蠢的,這取決於該 case 語句的用途。
尚未總結出測量標準的開發者能夠借鑑下McCabe 的測量方法,相信它能很好的幫助你控制好你的代碼質量。
其餘的度量方法:
所用的數據量;
控制結構中的嵌套層數;
代碼行數;
對同一變量的前後引用之間的代碼行數(跨度);
變量生存的代碼行數(生存期);
以及輸入和輸出的量;