《编码 - 代码分析》代码结构分析

news2024/11/28 4:52:23

1 代码结构分析概述

在编写代码时,要求要结构清晰、接口简单。如果代码结构过于复杂,会带来很多问题:代码很难被理解,不方便编写测试用例,容易隐藏错误,出现问题难以定位,修改代码容易产生新的Bug等等。因此,需要有一些指标来评估代码的复杂度,以方便对过于复杂的代码进行重构。

代码的复杂度通常可通过以下几个指标来评估:

 总行数:包括注释以及空行在内的代码行数;
 语句数目:有效的语句行数,包括#include、#define、#undef 这三个预处理命令在内,括号不包含在内;
 分支语句比例:分支语句占总语句数目的比例;
 注释比例:注释占总行数的比例;
 函数数目:函数的数量;
 平均每个函数的语句数;
 函数圈复杂度;
 函数最大嵌套层数;
 类的数量;
 平均每个类的函数数量。

2 基于的SourceMonitor代码结构检查

当前能够进行代码结构检查的工具有不少,本文中选择 SourceMonitor 作为代码结构检查工具。

2.1 SourceMonitor简介

官网地址

SourceMonitor 是 Campwood Software LLC 拥有版权的自由软件,非商业用途可免费使用。
SourceMonitor的主要功能是对代码的一个分析和度量。即使用SourceMonitor软件我们可以清晰的看到代码的总行数,注释比例,语句数以及类的个数和函数的个数。

SourceMonitor 有以下特点:

 支持对 C、 C++、 C#、 VB.NET、 java、 Delphi、 Visual Basic 以及 HTML 在内的多种语言的源代码的分析;
 效率高,每秒钟能够分析 10000 行以上的代码;
 可以修改各个度量指标的阈值。

2.2 C语言度量值(C Metrics)

下面以C语言度量值为例,看看SourceMonitor都给我们反馈了哪些信息。

总行数(Lines):包括空行在内的代码行数;

语句数目(Statements):在C语言中,语句是以分号结尾的。分支语句if,循环语句for、while,跳转语句goto都被计算在内,预处理语句#include、#define和#undef也被计算在内,对其他的预处理语句则不作计算,在#else和#endif、#elif和#endif之间的语句将被忽略;

分支语句比例(Percent Branch Statements):该值表示分支语句占语句数目的比例,这里的“分支语句”指的是使程序不顺序执行的语句,包括if、else、for、while和switch;

注释比例(Percent Lines with Comments):该值指示注释行(包括/……/和//……形式的注释)占总行数的比例;

函数数目(Functions):指示函数的数量;

平均每个函数包含的语句数目(Average Statements per Function):总的函数语句数目除以函数数目得到该值;

函数圈复杂度(Function Complexity):圈复杂度指示一个函数可执行路径的数目,以下语句为圈复杂度的值贡献1:if/else/for/while语句,三元运算符语句,if/for/while判断条件中的"&&"或“||”,switch语句,后接break/goto/ return/throw/continue语句的case语句,catch/except语句;

函数深度(Block Depth):函数深度指示函数中分支嵌套的层数。

对其他语言,SourceMonitor输出不同的度量值,例如在C++度量值中包括类的数目(Classes),在HTML中包括各个标签的数目(HTML Tags)、超链接数目(Hyperlinks)等。

2.2.1 SourceMonitor使用指南

首先在SourceMonitor官网下载SourceMonitor安装包后,双击安装包,按向导进行安装即可,这里就不再赘述了。

打开 SourceMonitor,选择菜单“File→New Project”新建项目。

在这里插入图片描述

弹出如图所示的语言选择对话框,选择源文件的语言以及需要扫描的文件类型,SourceMonitor 对自动扫描对应的源文件进行分析。 闰年判断函数是使用 C 语言编写的, 所以选择 C 语言,扫描的文件类型指定.c 和.h,然后点击下一步继续。

在这里插入图片描述

在接下来弹出的如下图所示的对话框中,设置项目的名称和保存路径,并点击下一步继续。

在这里插入图片描述

在接下来弹出的如下图所示的对话框中,填入源文件所在的目录,并点击下一步继续。

在这里插入图片描述

设置源代码目录后,后面所有设置都采用默认设置即可,一直点击下一步直到完成。

在这里插入图片描述

在新建项目完成后,系统会自动创建一个检查点,可以手动修改检查点的名称和需要检查的文件列表。修改完毕后,点击OK 按钮检查点的创建,详见下图。

在这里插入图片描述

2.2.2 分析代码结构

新建项目并创建检查点后,接下来就可以进行代码结构分析了。在检查列表中列出了当前已经创建的所有的检查点,详见下图。

在这里插入图片描述

针对每个检查点,SourceMonitor 给出了每个度量指标的具体的值,可以通过左右划动滚动条进行查看。

如果需要查看某个检查点是否有指标超标,可右击对应的检查点,然后在右键菜单中选择“Display CheckPoint Metrics Kiviat Graph”,详见下图。

在这里插入图片描述

打开的指标度量图标详见下图。

在这里插入图片描述

从指标度量图表中可以看出,每个指标都有下限和上限值。 在实际应用中,要求注释比例和平均每个函数的代码数必须在下限和上限指示的范围内,而其他的指标则要求不能超出上限,否则代码就需要重构。

若从指标度量图中发现某项指标不合格,则可双击对应的检查点打开文件列表。在打开的文件列表中,可以通过点击表头改变排序方式以快速找到指标不合格的文件。如下图所示为按文件名升序进行排序。

在这里插入图片描述

找到指标不合格的文件,单击鼠标右键,然后在右键菜单中选择“Display Function Metrics”打开函数列表,详见下图。

在这里插入图片描述

同样在打开的函数列表中,可以通过点击表头改变排序方式以快速找到指标不合格的函数,然后就可以对对应的函数进行重构。如下图所示为按照函数名称升进行排序。

在这里插入图片描述

2.2.3 修改指标阈值

在有些时候,开发者可能并不希望使用系统默认的指标阈值,而是希望能够自定义指标阈值。 SourceMonitor 支持对各个指标的阈值进行自定义,这样使用时就会更加灵活。选择菜单“File→Option”,打开选项设置对话框。

在这里插入图片描述

如果需要修改对应语言的阈值,可以选中对应的选项卡进行修改即可。详见图Figure 2 14。

在这里插入图片描述



欢迎访问我的网站

BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书
BruceOu的知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/142921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java+SpringBoot+vue+elementui的校园文具商城系统详细设计和实现

基于JavaSpringBootvueelementui的校园文具商城系统详细设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录基…

前端学习框架

一,学习路线图 https://roadmap.sh/ 二,学习资源整理 https://developer.mozilla.org/zh-CN/docs/Learn // 学习web 的各种资源网站 三,知识整理 将前端分为三步走 JavaScript 语言(模块一)CSS 和 HTML&#x…

【Latex】1.Latex环境的安装与配置

文章目录前言1 安装环境2. 下载texstudio前言 LaTeX(LATEX,音译“拉泰赫”)是一种基于ΤΕΧ的排版系统,由美国计算机学家莱斯利兰伯特(Leslie Lamport)在20世纪80年代初期开发,利用这种格式&a…

sqlmap之绕过云锁waf

sql注入不会绕过WAF?关注我,让我带你由简入难实战各个WAF,前天我们实战了安全狗的WAF,今天先来看看比它难度更高的云锁WAF,你会绕吗?看我带你将它拿下 目录 一:环境配置 1.云锁WAF 2.sqli-l…

本地数仓项目(二)——搭建系统业务数仓详细流程

1 说明 本文基于《本地数据仓库项目(一)——本地数仓搭建详细流程》业务数据,在本地搭建系统业务数仓。 根据模拟sql脚本生成业务数据,依次执行生成业务数据即可。 sql脚本提供如下 链接:https://pan.baidu.com/s/1WX3xVMQvAApSUZMobWLiLQ…

Vue-cli创建项目的目录结构与子父组件之间的通信

一、Vue脚手架的使用1、通过命令行使用vue-cli的指令创建:vue init webpack 项目名称build文件夹: 用于webpack打包配置文件夹config文件夹:与webpack相关的配置文件夹|——- index.js:可以改变项目默认的端口号node_moudles&…

Vue3/ Vite 的使用介绍 、Vite 方式工作流程 与 传统方式工作流程区别

一. Vite 的使用介绍 优势: 💡极速的服务启动 使用了原生的 ESM文件 无需打包 ⚡️ 轻量快速的热重在 始终极快的模块热重载 🛠️丰富的功能 对于 typescript jsx css 等支持开箱即用 📦 等等 二.Vite 方式工作流程 与 传统方式工作流程…

千万不要把Request传递到异步线程里面!有坑!

前几天在网上冲浪的时候看到一篇技术文章,讲的是他把一个 request 请求传递到了线程池里面,然后遇到了一个匪夷所思的情况。 他写了这篇文章,把自己针对这个问题的探索过程分享了出来: 《springboot 中如何正确的在异步线程中使用…

ACL命名实验

目录 一.ACL命名实验 1.实验要求: 2.配置全网通 配置主机地址 3.根据实验要求配置ACL 4.测试完成后再根据下一次要求继续配置 一.ACL命名实验 实验图片 1.实验要求: 要求 全网通 服务器上配置 web 服务和 ftp 服务 配置 命名的acl 列表 …

_Linux 进程信号-信号保存篇

文章目录前言阻塞信号1. 信号常见概念2. 在内核中的表示信号处理过程3. sigset_t4. 信号集操作函数sigprocmasksigpending5. 测试与验证实验一实验二实验三前言 上篇文章(链接: _Linux 进程信号-基础篇)我们了解了信号的基础概念以及信号如何发送的。 …

强化学习_06_pytorch-PPO实践(Pendulum-v1)

一、PPO简介 TRPO(Trust Range Policy Optimate)算法每一步更新都需要大量的运算,于是便有其改进版本PPO在2017年被提出。PPO 基于 TRPO 的思想,但是其算法实现更加简单。TRPO 使用泰勒展开近似、共轭梯度、线性搜索等方法直接求解。PPO 的优化目标与 T…

可观测性--数据源

文章目录监控数据来源端上访问应用程序业务监控基础设施可观测性核心概念日志(Logging)统计指标(Metrics)链路追踪(Tracing)三者之间关系监控数据来源 我们一般讲的数据观测,其实观测的就是从发…

【Linux】计算机软硬件体系结构

文章目录冯诺依曼体系结构操作系统(Operator System)什么是操作系统为什么要有操作系统操作系统是怎么实现管理的系统调用接口和库函数总结冯诺依曼体系结构 谈到计算机的硬件结构,第一个想到的必然是经典的冯诺依曼体系结构: 我们常见的计算机&#xf…

在购买低代码产品时,源码是必需的吗?

编者按:企业在采购软件或者平台时,到底需不需要源码?本文分析了源码交付的对于不同规模和情况企业的意义,并介绍了源码交付的低代码平台。关键词:源码交付,可视化设计,私有化部署,多…

数据上线:首届6G智能无线通信系统大赛OPPO赛道评测正式开启

12月26日,首届6G智能无线通信系统大赛——面向小样本条件场景自适应及在线更新需求的无线AI设计赛题已经正式上线,数据集也已经在1月3日正式上线啦,评测同步开启,快来打擂冲榜! 文末还将揭晓本赛题专属活动&#xff0…

图像锐化处理之一阶微分算子

图像锐化是通过增强图像的边缘和细节来提高图像的清晰度的操作。这种操作通常用于将模糊或不清晰的图像改进为更清晰的图像。由于微分是对函数局部变化率的一种描述,因此图像锐化算法的实现可基于空间微分。 一阶微分算子 对任意一阶微分的定义必须满足两点&#xf…

采用热电偶温度传感器实现超高精度温度跟踪控制的解决方案

摘要:针对温度跟踪控制中存在热电堆信号小致使控制器温度跟踪控制精度差,以及热电阻形式的温度跟踪控制中需要额外配置惠斯特电桥进行转换的问题,本文提出相应的解决方案。解决方案的核心是采用一个多功能的超高精度PID控制器,具有…

ubuntu18.04安装mysql5.7.32

目录一、下载mysql安装包二、下载依赖三、安装mysql四、导入sql一、下载mysql安装包 下载地址:https://downloads.mysql.com/archives/community/ 下载包 mysql-server_5.7.32-1ubuntu18.04_amd64.deb-bundle.tar 下载后解压,里面包含要安装的deb包 二、…

计算机编码

字符的表示原理 计算机内所有信息都是使用0和1进行表示的。 对于一个短路来说,0代表关,1代表开。那把这些电路组合起来就可以有长串0和1组成的二进制数字,我们对这些数字进行编码和解码,我们就能用它来表示我们想要表示的东西了…

蓝牙模块芯片串口透传的AT指令模式和波特率是什么意思

一、什么是蓝牙串口透传模块的模式 蓝牙串口模块,一般都会有两个模式,即AT指令模式,以及透传模式 1、有的模块,会通过一个GPIO口来选择当前是什么模式,比如将一个IO口拉低则进入透传模式,也就是不再识别A…