0

0

圈复杂度和代码质量优化(附带示例代码纠正代码质量)

絕刀狂花

絕刀狂花

发布时间:2025-07-24 08:08:51

|

691人浏览过

|

来源于php中文网

原创

圈复杂度(cyclomatic complexity)是一种衡量程序复杂程度的方法。它通过计算程序从开始到结束的线性独立路径数量来评估代码的复杂性。

圈复杂度越高,代码就越复杂,维护难度也随之增加。每遇到关键字如if、while、repeat、for、and、or时,圈复杂度会增加1。对于case语句中的每一种情况,圈复杂度也增加1。

例如,以下函数的圈复杂度为1,意味着代码只有一条路径:

def add(a, b):
    return a + b

而对于有一条分支的代码,其圈复杂度为2,如下面的递归计算阶乘的代码:

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

圈复杂度的计算公式为:V(G) = E - N + 2P,其中E是控制流图中边的数量,N是控制流图中节点的数量,P是图的连接组件数目。由于控制流图通常是连通的,所以P为1。

圈复杂度和代码质量优化(附带示例代码纠正代码质量)

圈复杂度 代码状况 可测性 维护成本
1-10 清晰、结构化
11-20 复杂
21-30 非常复杂
>30 不可读 不可测 非常高

要测量程序的圈复杂度,可以在Python中使用mccabe包。安装mccabe包的命令如下:

pip install mccabe

然后,使用以下命令检测test.py文件的圈复杂度:

python -m mccabe --min 5 test.py

其中,--min 5表示只输出圈复杂度大于5的函数。例如,输出结果可能会显示91行的roundRobin函数的复杂度为7。

圈复杂度和代码质量优化(附带示例代码纠正代码质量)

除了mccabe,还有许多其他工具可用于检测圈复杂度:

工具 类型 系统平台 扫描语言
PMD/Checkstyle 免费 Windows/Linux/Mac Java,JS
OClint 免费 Mac OC
Coverity 商业 Windows/Linux/Mac C/C++,Java,C#,OC/C++,JS,Python,Ruby,PHP
SourceMonitor 免费 Windows C/C++,C#,VB.NET,Java,Delphi,VB6,HTML
CCM 免费 Windows JS,C/C+,C#
HFCCA 免费 Windows/Linux/Mac C/C++,OC
Lizard 免费 Windows/Linux/Mac C/C++,Java,C#,JS,OC/C++,Swift,Python,Ruby,TTCN-3,PHP,Scala,GDScript

为了优化代码质量,可以采取以下措施:

  1. 提炼函数:将子程序的一部分提取成独立的函数。这样做虽然不会降低整个程序的复杂度,但可以降低你在同一时间需要关注的复杂度水平。

圈复杂度和代码质量优化(附带示例代码纠正代码质量)

Veed AI Voice Generator
Veed AI Voice Generator

Veed推出的AI语音生成器

下载

例如,将以下代码:

function test($number){
    if($number 

替换为:

function test($number){
    $number = getMin($number);
    for($i = 0; $i 
  1. 替换算法:将复杂算法替换为更清晰的算法。例如,将以下代码:
if($str == 'China'){
    $result = '中国人';
}else if($str == 'US'){
    $result = '美国人';
}else if($str == 'France'){
    $result = '法国人';
}

替换为:

$people = [
    'China' => '中国人',
    'US' => '美国人',
    'France' => '法国人'
];
$result = $people[$str];
  1. 逆向表达:通过调换条件表达顺序来简化复杂度。例如,将以下代码:
if((条件1 && 条件2) || !条件1){
    return true;
}else{
    return false;
}

替换为:

if(条件1 && !条件2){
    return false;
}
return true;
  1. 分解条件:对复杂条件表达式进行分解并提取成独立函数。例如,将以下代码:
if(do_some_1($number) || do_some_2($number)){
    $number = $number.$someStr1.$someStr2.'123456789';
}else{
    $number = $number.$someStr3.$someStr4.'123456789';
}

替换为:

if(do_some_fun($number)){
    $number = do_some_fun1($number);
}else{
    $number = do_some_fun2($number);
}
  1. 合并条件:将多个判断合并为一个条件式,并提取成独立函数。例如,将以下代码:
if($x  10) return 0;
if($z != 0) return 0;

替换为:

if(get_result($x,$y,$z)) return 0;
  1. 移除控制标记:使用break和return替代控制标记。例如,将以下代码:
$bool = false;
foreach($arrs as $arr){
    if(!$bool){
        if($arr == 1){
            someFunction();
            $bool = true;
        }
        if($arr == 2){
            someFunction();
            $bool = true;
        }
    }
}

替换为:

foreach($arrs as $arr){
    if($arr == 1 || $arr == 2){
        someFunction();
    }
    break;
}
  1. 以多态取代条件式:将条件式的每个分支放进子类的重载方法中。例如,将以下代码:
switch ($cat){
    case ‘fish’:
        eatFish();
    case ‘moss’:
        eatMoss();
}
function eatFish() {
    echo "Whale eats fish";
}
function eatMoss() {
    echo "Whale eat moss";
}

替换为:

interface Eat {
    function eatFish();
      function eatMoss();
}
class Whale implements Eat {
    public function eatFish() {
        echo "Whale eats fish";
    }
    public function eatMoss() {
        echo "Whale eat moss";
    }
}
  1. 参数化方法:建立单一函数,以参数表达不同的值。例如,将以下代码:
$result = min(lastUsage(), 100) * 0.03;
if(lastUsage() > 100){
    $result += (min(lastUsage(), 200) - 100) * 0.05;
}

替换为:

$result = getMin(0,100) * 0.03;
$result += getMin(100,200) * 0.03;
function getMin($start, $end){
    if(lastUsage() > $start){
        return (min(lastUsage(),$end) - $start);
    }
    return 0;
}
  1. 明确函数取代参数:针对参数的每一个可能值,建立独立函数。例如,将以下代码:
if($name == 'width'){
    $width = $value;
} else if ($name == 'height'){
    $height = $value;
}

替换为:

function setWidth($value){
    $width = $value;
}
function setHeight($value){
    $height = $value;
}

参考视频:谷歌:简洁代码之道

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

138

2026.03.03

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

105

2023.09.25

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

27

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

27

2025.11.27

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

120

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

261

2025.10.24

python如何计算数的阶乘
python如何计算数的阶乘

方法:1、使用循环;2、使用递归;3、使用math模块;4、使用reduce函数。更多详细python如何计算数的阶乘的内容,可以阅读下面的文章。

177

2023.11.13

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

46

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.3万人学习

Excel 教程
Excel 教程

共162课时 | 20.5万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 2.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号