php 函数圈复杂度,圈复杂度和McCabe
【書名】:軟件架構(gòu)——Python語言實現(xiàn)
【主題】:圈復(fù)雜度
【摘要】:圈復(fù)雜度(Cyclomatic Complexity)是衡量計算機程序復(fù)雜程度的一種措施。它根據(jù)程序從開始到結(jié)束的線性獨立路徑的數(shù)量計算得來的。在 Python 中可以使用 mccabe 包測量程序的圈復(fù)雜度。
1 圈復(fù)雜度
對于沒有任何分支的代碼,它的圈復(fù)雜度為 1 ,意味著代碼只有一條路徑。例如下面的函數(shù):
對于有一條分支的代碼,它的圈復(fù)雜度為 2 ,比如下面遞歸計算階乘的代碼:
在 1976 年, Thomas J. McCabe 開發(fā)了使用有向圖計算復(fù)雜的算法。為了得到這個指標,程序控制流程圖可以畫成一個有向圖,其中:節(jié)點表示一個程序塊
邊表示從一個程序塊到另一個程序塊的控制流
根據(jù)程序的控制圖,McCabe 復(fù)雜度可以表示為
其中:E:邊的數(shù)量
N:節(jié)點的數(shù)量
P:連接組件的數(shù)量
2 McCabe的使用
在 Python 中可以使用 McCabe 包測量程序的圈復(fù)雜度。它可以當作一個獨立的模塊,也可以當作程序的一個插件。可以使用 pip 安裝模塊
2.1 作為命令行使用
和 unittest 、flake8 等工具一樣。
2.2 作為 flake8 插件
當 flake8 版本在 2.0 以上和 McCabe 已經(jīng)安裝的情況下,該插件可用。
在命令中使用 --max-complexity 選項即可。
根據(jù) McCabe 圈復(fù)雜度大于 10 ,就認為是 too complex ,需要進行重構(gòu)以降低復(fù)雜度。
3 程序控制圖
3.1 生成程序控制圖
以上述 factorial 函數(shù)代碼為例子,將其保存為一個 factorial.py 文件中,如下:
第一步 使用 python -m mccabe factorial.py -d
輸出 dot 文本圖形描述語言的有向圖。
第二步,Graphviz渲染圖片
Graphviz 是 AT&T Labs Research開發(fā)的圖形繪制工具軟件.它使用一個特定的DSL(領(lǐng)域特定語言): dot作為腳本語言,然后使用布局引擎來解析此腳本,并完成自動布局。graphviz提供豐富的導(dǎo)出格式,如常用的圖片格式,SVG,PDF格式等。
打開 Graphviz 編輯器,將上述文檔保存為 factorial.gv 文檔,生成程序控制圖。
第三步,計算 McCabe 復(fù)雜度
根據(jù)公式,復(fù)雜度: M = 5 - 4 + 2 x 1 = 2
4 降低復(fù)雜度
使用字典替代復(fù)雜的 if-else 分支代碼是 Python 中降低復(fù)雜度一個有效的方法。
比如可以將下面的分支代碼:
改為下面的字典映射代碼
復(fù)雜度也從 3 降低到 1 。
5 參考資料
總結(jié)
以上是生活随笔為你收集整理的php 函数圈复杂度,圈复杂度和McCabe的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软考高级考试中有五大证书,其中哪个更值得
- 下一篇: 动态规划算法php,php算法学习之动态