c语言圈复杂度switch,C语言switch/case圈复杂度优化重构

article/2025/10/23 4:45:12

软件重构是改善代码可读性、可扩展性、可维护性等目的的常见技术手段。圈复杂度作为一项软件质量度量指标,能从一定程度上反映这些内部质量需求(当然并不是全部),所以圈复杂度往往被很多项目采用作为软件质量的度量指标之一。

C语言开发的项目中,switch/case代码块是一个很容易造成圈复杂度超标的语言特性,所以本文主要介绍下降低switch/case圈复杂度的重构方法(如下图)。switch圈复杂度优化重构可分为两部分:程序块的重构和case的重构。程序块重构是对代码的局部优化,而case重构是对代码的整体设计,所涉及的重构手段也各不相同。

832b771a43d1c970e18af0c7af48ff9a.png

程序块重构

程序块重构指的是每个case内的代码段重构。Martin Fowler 的《重构——改善既有代码的设计》(电子版)书中总结了80多种重构方法。书中针对每种技术都给出了示例说明,另外这里、这里还提供了其他语言的示例和进一步介绍。因为存在大量示例,所以本文针对这些方法不再给出示例,有兴趣的同学可以通过上面几种途径了解学习。不过这些技术中有些是改善代码的可读性,有些是改善代码的可扩展性,并不是每项技术都能有效减低圈复杂度。其中可以降低圈复杂度的方法有如下几种:

提炼函数(Extract Method)。你有一段代码可以被组织在一起并独立出来。将这段代码放进一个独立函数中,并将函数名称解释该函数的用途。

分解条件表达式(Decompose Conditional)。你有一个复杂的条件(if-then-else)语句。从if、then、else三分段落中分别提炼出独立函数。

合并条件表达式(Consolidate Conditional Expression)。你有一系列条件测试,都得到相同结果。将这些测试合并为一个条件表达式,并将这个条件表达式提炼成为一个独立函数。

合并重复的条件片段(Consolidate Duplicate Conditional Fragments)。在条件表达式的每个分支上有着相同的一段代码。将这段重复的代码搬移到条件表达式之外。

移除控制标记(Remove Control Flag)。在一系列布尔表达式中,某个变量带有“控制标记”的作用。以break语句或return语句取代控制标记。

这些重构方法除了降低圈复杂度外,还有如下好处:

满足单一职责设计原则,提高代码可读性。

去除重复冗余代码。你可以删除大量相同的条件语句。

满足“Tell, Dont Ask”原则,告诉对象需要做什么,而不是怎么做。

case重构

对于一个switch有几十个case的情况,其圈复杂度往往上百,程序块重构显然已不能解决其本质复杂度。如果要降低其圈复杂度,必然需要对代码进


http://chatgpt.dhexx.cn/article/CnY6cPWe.shtml

相关文章

Excel2016打开文件后显示空白

打开文件时显示 打开后空白 解决办法:

Excel双击文件打开后是空白,再次双击才能打开

Excel双击打开文件只弹出空白页面,再双击才打开所需页面。 解决方案(仅供参考):WINR -->regedit-->修改HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open\command项->默认值 数值数据原值后面加上 “%1” 点击确定即可 如&…

【Windows】Excel2019打开文档显示空白且工具栏灰色无法点击

如标题,要想打开Excel文档,只能通过菜单栏操作:文件->打开,然后选择要打开的文档才能正常显示。遇到这个问题很久了,今天着实忍不住了,特记录一下解决方法。 1、查看是否隐藏 点击“视图”菜单&#x…

Excel 2016打开后显示灰色空白页解决方法

重新装了系统,安装上Excel2016,发现打开xls文件只显示一个灰色的开始页面 再次打开excel文件才显示内容,一直这样岂不是太繁琐? 找到了一个教程,在Excel启动选项设置一下。文件-选项-常规-启动选项,将应用…

解决Excel打开后灰色没有内容的问题

问题现象 双击打开的Excel文件,扩展名包括xls、xlsx、csv,如下图: 解决方案 1、打开注册表 快捷键Win R,输入regedit: 2、修改注册表 计算机\HKEY_CLASSES_ROOT\Excel.csv\shell\Open\command计算机\HKEY_CLA…

excel打开空白不显示内容

打开excel文档不显示文件内容,一片灰色 找到此文件:HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open\command 修改 “默认” 值 修改前:“C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE” /dde 修改后:“C:\Program F…

excel2007打开灰色空白

选项-高级 把dde项勾选掉即可,重启excel 转载于:https://www.cnblogs.com/gsl371-blog/p/7006957.html

excel白屏未响应_「excel打开空白」Excel 2016 打开后空白的解决方法 - seo实验室

excel打开空白 最近使用excel 2016时遇到一个这样的状况,就是双击打开一个有内容的xlsx表格后显示空白,用管理员身份打开也是一样,这里总结一下解决方法: 说明:Office 2016在安装时会默认安装在系统盘,都不给修改安装位置的机会,我的安装位置是做了修改的(修改Office 20…

Excel - 插入空白行

简单的插入一个空白行,只需选中一行,右键,选择插入一行即可。 如果要一次插入多个空行,可以按住Ctrl键,然后逐个选中想要插入的行,然后执行插入操作,如下所示: 选中张三、王五、田七…

html文件桌面图标空白,excel桌面图标空白但是能打开

本文的教程为大家分享了两种excel文件不显示图标的情况,以及他们对应的不显示图标的解决方法和设置. Excel文件不显示图标的第一种方式:图标未知 如下面的截图,一个Excel文档,在桌面上预览,可以看到excel文件不显示图标…

如何解决每次打开Excel2016文件都是灰色空白页,要把文件拖进去才能显示

1、打开注册表:开始->运行,输入“regedit”后,回车。 2、"HKEY_CLASSES_ROOT"。 3、展开root后进入找到如图所示的 sheet8->open-command;找到默认值。 4、鼠标 右键 默认值 选择更改 会出现如图所示的对话框。 5、修改这个值…

解决Excel打开后空白的问题 (页面为灰色)——实战分享

今天听到一同事说电脑意外断电后,重启电脑返回桌面后打开所有的Excel文档都变成空白的了,如下图: 只能通过“打开”命令来打开Excel文档。但可以正常打开word文档。。。后来经过网上搜索问题目答案,终于很快搜到了方法解决了以上的…

Excel 2016 打开后空白的解决方法

最近使用Excel 2016时遇到一个这样的状况,就是双击打开一个有内容的xlsx表格后显示空白,用管理员身份打开也是一样,这里总结一下解决方法: 说明:Office 2016在安装时会默认安装在系统盘,都不给修改安装位置…

解决Office Excel文档打开显示空白

打开文档如图情况 第一步检查视图是否开启隐藏,如图无,按下图操作 点击菜单》》Excel选项》》 点击高级,拉下页面,把忽略使用动态数据交换(DDE)的其他应用程序勾选去掉》点确定即可

Excel打开xlsx、csv后空白解决方法

问题描述 我的Excel2016打开之后一片空白,什么数据、操作都不能用,都是灰色的。 解决方法 1、打开注册表,"win键""R" 然后输入 regedit 2、 修改注册表信息 在最上面的搜索框搜索对应的目录信息,这三个目…

excel打开csv后空白解决方法

excel打开csv后空白解决方法 觉得有用的话,欢迎一起讨论相互学习~ 转载自 https://blog.csdn.net/qq_16775293/article/details/100990018 文章目录 问题描述 解决方法 打开注册表修改注册表信息 问题描述 我的Excel2013打开后没有任何报错,直接显示一片空白&a…

Excel打开一片空白,需再次双击进入解决办法

1、快捷键“winR”打开运行,输入--> regedit,打开“注册表编辑器”。 2、对HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open\command项默认值进行修改(点击“默认”,右键,选择 修改) 原值: &…

Angular jasmine TestBed.configureTestingModule的工作原理

TestBed.compileComponents 一次性异步编译所有组件。返回一个promise,可以等其完成时,执行更多的额外任务。 调试入口: 单元测试代码里定义的imports和providers数据,类型为TestModuleMetadata,已经注入到变量modul…

Testbed

一旦征服了HelloWorld示例,就应该开始查看Box2D的测试平台。 测试平台是一个测试框架和演示环境。 以下是一些功能: 带有平移和缩放功能的相机。鼠标拾取附着到动态物体上的形状。可扩展的测试集。用于选择测试,参数调整和调试图形选项的GUI。…

Angular jasmine单元测试框架TestBed.inject的执行原理

单步调试这段代码: TestBed用于单元测试代码里创建Component和service实例。 injectionToken即传入TestBed.inject的function: 还是delegate给TestModuleRef的injector进行常规的injection操作: Records里早就被注入好了: 因为val…