软件工程 设计的复杂性
| 复杂性代表事件或事物的状态,它们具有多个相互关联的链接和高度复杂的结构。在软件编程中,随着软件设计的实现,元素的数量以及它们之间的相互联系逐渐变得庞大,一下子变得难以理解。 | |
|---|---|
如果不使用复杂性指标和度量,软件设计复杂性很难评估。让我们看看三个重要的软件复杂性度量。
Halstead’s 的复杂性度量
1977年,Maurice Howard Halstead 先生引入了度量软件复杂性的指标。Halstead 的度量取决于程序的实际实现及其度量,这些度量是直接从源代码的运算符和操作数以静态方式计算的。它允许评估 C/C++/Java 源代码的测试时间、词汇、大小、难度、错误和工作量。
根据 Halstead 的说法,“计算机程序是一种算法的实现,该算法被认为是可以归类为运算符或操作数的令牌集合”。Halstead 度量将程序视为运算符及其相关操作数的序列。
他定义了各种指标来检查模块的复杂性。

当我们在指标查看器中选择源文件以查看其复杂性细节,以下结果是指标报告:

圈复杂度度量
每个程序包含要执行的语句,以执行某些任务和其他决定需要执行哪些语句的决策语句。这些决策结构改变了程序的流程。
如果比较两个相同大小的程序,由于程序的控制跳转频繁,决策语句较多的程序会更加复杂。
McCabe 在 1976 年提出了圈复杂度度量来量化给定软件的复杂度。它是基于程序决策结构的图驱动模型,例如 if-else、do-while、repeat-util、switch-case 和 goto 语句。
制作流程控制图的过程:
将程序分成较小的块,由决策结构分割。
创建代表每个节点的节点。
连接节点,如下所示:
如果可以控制从块 i 分支到块 J
画一条弧
从出口节点到入口节点
画一条弧.
为了计算程序模块的圈复杂度,我们使用公式:
V(G) = e – n + 2
Where
e is total number of edges
n is total number of nodes

上述模块的圈复杂度为:
e = 10
n = 8
Cyclomatic Complexity = 10 - 8 + 2= 4
根据 P. Jorgensen, 一个模块的圈复杂度不应超过10.
功能点
它被广泛用于衡量软件的大小。功能点专注于系统提供的功能。系统的特性和功能用于衡量软件的复杂性。
功能点依赖于五个参数,分别命名为外部输入、外部输出、逻辑内部等我呢间、外部接口文件和外部查询。为了考虑软件的复杂性,每个参数都被进一步分类为简单、平均或复杂。

外部输入
来自外部的系统的每个独特输入都被视为外部输入。测量输入的唯一性,因为没有两个输入应该具有相同的格式。这些输入可以是数据或控制参数。
简单 - 如果输入计数较低并且影响较少的内部文件
复杂 - 如果输入计数较高并且影响较多的内部文件
平均 - 介于简单和复杂之间
外部输出
系统提供的所有输出类型窦计入此类别。如果输出格式和处理是唯一的,则输出被认为是唯一的。
简单 - 如果输出计数低
复杂 - 如果输出计数高
平均 - 介于简单和复杂之间
逻辑内部文件
每个软件系统都维护内部文件,以维护其功能信息并正常运行。这些文件保存系统的逻辑数据。该逻辑数据可能包含功能数据和控制数据。
简单 - 如果记录类型的数量很少
复杂 - 如果记录类型的数量很多
平均 - 介于简单和复杂之间
外部接口文件
软件系统可能需要与某些外部软件共享其文件,或者可能需要将文件传递给处理或作为参数传递给某些函数。所有这些文件都算作外部接口文件。
简单 - 如果共享文件的记录类型数量很低
复杂 - 如果共享文件的记录类型数量很高
平均 - 介于简单和复杂之间
外部查询
查询是输入和输出的结合,用户发送一些要查询的数据作为输入,系统将查询的输出处理后响应用户。查询的复杂性不仅仅是外部输入和外部输出。如果查询的输入和输出在格式和数据方面是唯一的,则称该查询是唯一的。
简单 - 如果查询需要低处理并昌盛少量输出数据
复杂 - 如果查询需要高处理并产生大量输出数据
平均 - 介于简单和复杂之间
系统中的这些参数中的每一个都根据它们的类别和复杂性被赋予权重。
参数 简单 平均 复杂

上表产生原始功能点。这些功能点根据环境复杂度进行调整,系统使用十四种不同的特征来描述:
数据通信
分布式处理
绩效目标
操作配置负载
成交率
在线数据录入
终端用户效率
在线更新
复杂处理逻辑
可重用性
安装方便
操作简便
多个网站
渴望促进变化
然后将这些特征因素评级为 0 到 5,如下所述:
无影响
非主要的
缓和的
平均数
重要的
必要的
然后将所有评级相加为 N。N 的值范围从 0 到 70(14钟特性 x 5 种评级)。它用于计算复杂性调整因子(CAF),使用以下公式:
CAF = 0.65 + 0.01N
然后,
交付功能点 (FP)= CAF x Raw FP
然后可以将此 FP 用于各种指标,例如:
相关文章:
软件工程 设计的复杂性
复杂性代表事件或事物的状态,它们具有多个相互关联的链接和高度复杂的结构。在软件编程中,随着软件设计的实现,元素的数量以及它们之间的相互联系逐渐变得庞大,一下子变得难以理解。 如果不使用复杂性指标和度量,软件…...
Nginx 限制只能白名单 uri 请求的配置
实际生产项目中,大多数时候我们会将后端的 http 接口通过前置 nginx 进行反向代理,对互联网用户提供服务。往往我们后端服务所能提供的接口服务是大于互联网用户侧的实际请求的接口地址数量的(例如后端服务一共有100个api接口,经过…...
QT c++ 同时使用sqlite 和mysql数据库的问题
在项目开发中,同时使用了sqlite 和mysql数据库,分开这两部分运行功能都正常,但是一起运行,就异常,sqlite部分不能使用。 现象:出现如下提示 QSqlDatabasePrivate::addDatabase: duplicate connection nam…...
redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip
redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip 1、安装redis三主三从集群2、正常状态的redis集群3、更改redis集群服务器的ip 重启服务器 集群会down4、更改redis集群服务器的ip 重启服务器 集群down的原因5、更改redis集群服务器的ip后…...
【C++习题】19.数组中第K个大的元素
题目:数组中第K个大的元素 链接🔗:数组中第K个大的元素 题目: 代码: class Solution { public:int findKthLargest(vector<int>& nums, int k) {// 将数组中的元素先放入优先级队列中priority_queue<i…...
JIS-CTF: VulnUpload靶场渗透
JIS-CTF: VulnUpload来自 <https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 靶机IP地址192.168.23.162,攻击机IP地址192.168.23.140…...
BGP-面试
简单介绍一下BGP BGP,边界网关协议,属于路径矢量路由协议。属于触发式更新或者增量更新。具有丰富的路由策略,能够灵活的进行路由选择。重心不是在路由学习,而是路由优选、更高效的传递路由和维护大量的路由信息。基于TCP…...
Git-安装与常用命令
目录 1.Git环境配置 1.1下载 1.2配置 1.2.1基本配置 1.2.2常用指令配置别名 1.2.3获取本地仓库 git命令在git bash中演示,会用到一些Linux命令。 1.Git环境配置 1.1下载 Git下载地址:https://git-scm.com/download 傻瓜式安装就可以了。 安装…...
回归预测 | Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习回归预测
目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 回归预测 | Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习回归预测 模型设计 基于BiLSTM-Adaboost的回归预测模型结合了双向长短期记忆神经网络(BiLSTM)和Adaboost集成学习的…...
微信小程序跳转其他小程序以及跳转网站
一、跳转其他小程序 1.1 知道appid和页面路径 wx.navigateToMiniProgram({appId: appid, // 替换为目标小程序 AppIDpath: pathWithParams, // 小程序路径envVersion: release, // 开发版、体验版或正式版success(res) {console.log("跳转到其他小程序成功!&q…...
Not using native diff for overlay2, this may cause degraded performance……
问题现象 案例:Anolis 8.9(4.19.91-26.an8.x86_64) Overlay2存储驱动程序) 当我们安装好Docker之后,通过systemctl status docker -l 会发现有一个告警信息:levelwarning msg"Not using native dif…...
【自用】管材流转项目 数据库恢复之 PIPE 表 二维码相关 各个表恢复 SQL
总览 1.后端前端和数据库 PIPE 页面的关系 2.后端批量生成二维码 jpg 图片 3.为了保证 PIPE 正常使用的调整 4.TRANSFORM(流转表) 一、后端前端和数据库 PIPE 页面的关系 1.前端 关于PIPE页面,首先,在前端,我们已经…...
【渗透测试】信息收集二
其他信息收集 在渗透测试中,历史漏洞信息收集是一项重要的工作,以下是相关介绍: 历史漏洞信息收集的重要性 提高效率:通过收集目标系统或应用程序的历史漏洞信息,可以快速定位可能存在的安全问题,避免重复…...
测试工程师八股文04|计算机网络 和 其他
一、计算机网络 1、http和https的区别 HTTP和HTTPS是用于在互联网上传输数据的协议。它们都是应用层协议,建立在TCP/IP协议栈之上,用于客户端(如浏览器)和服务器之间的通信。 ①http和https的主要区别在于安全性。http是一种明…...
定时/延时任务-Kafka时间轮源码分析
文章目录 1. 概要2. TimingWheel2.1 核心参数2.2 添加任务2.3 推进时间 3. TimerTaskList3.1 添加节点3.2 删除节点3.3 刷新链表3.4 队列相关 4. 时间轮链表节点-TimerTaskEntry5. TimerTask6. Timer 和 SystemTimer - 设计降级逻辑7. 上层调用8. 小结 1. 概要 时间轮的文章&a…...
如何用状态图进行设计05
到目前为止,我们已经讨论了状态图的原理。这些原理对状态图和扩展状态图都适用。第二章后面的部分主要讲述了扩展状态图的扩展功能。我们将围绕这些增强的功能,使你对BetterState Pro的设计能力有很好的了解。 关于这些内容和其他有关扩展状态图特性的完…...
【计算机视觉】边缘检测
图像的边缘简单来说就是图像中灰度不连续的地方。 1.图像梯度 图像梯度是指图像像素灰度值在某个方向上的变化;图像梯度是图像的一阶导数,实际计算时可以使用差分来近似。 1.1 什么是图像梯度? 图像梯度是一种数学工具,用于描…...
林曦词典|无聊
“林曦词典”是在水墨画家林曦的课堂与访谈里,频频邂逅的话语,总能生发出无尽的思考。那些悠然轻快的、微妙纷繁的,亦或耳熟能详的词,经由林曦老师的独到解析,意蕴无穷,让人受益。于是,我们将诸…...
LabVIEW光栅衍射虚拟仿真系统
随着现代教育技术的快速发展,虚拟仿真实验平台逐渐成为物理实验教学的重要辅助工具。基于LabVIEW的平面透射光栅虚拟仿真系统帮助学生更好地理解和分析光栅衍射现象,提高教学质量和学生的学习兴趣。 项目背景 在波动光学的教学中,光栅衍射实…...
【NumPy进阶】:内存视图、性能优化与高级线性代数
目录 1. 深入理解 NumPy 的内存视图与拷贝1.1 内存视图(View)1.1.1 创建视图1.1.2 视图的特点 1.2 数组拷贝(Copy)1.2.1 创建拷贝1.2.2 拷贝的特点 1.3 视图与拷贝的选择 2. NumPy 的优化与性能提升技巧2.1 向量化操作示例&#x…...
如何使用WiFiManager打造智能零售网络:从自助结账到智能货架的无缝配置方案
如何使用WiFiManager打造智能零售网络:从自助结账到智能货架的无缝配置方案 【免费下载链接】WiFiManager ESP8266 WiFi Connection manager with web captive portal 项目地址: https://gitcode.com/gh_mirrors/wi/WiFiManager 在现代零售环境中,…...
Windows Server 2012系统FileZilla搭建FTP服务器
一、FTP介绍 1.FTP服务器简介 FTP 服务器是基于文件传输协议(File Transfer Protocol)搭建的文件共享服务,主要用于在网络中实现客户端与服务器之间的文件上传、下载及管理。它支持多用户访问、权限控制、目录隔离等功能,广泛应用…...
Python MCP服务器开发模板实战手册(含完整CI/CD流水线与OpenTelemetry集成)
第一章:Python MCP服务器开发模板概览与核心设计理念Python MCP(Model-Controller-Protocol)服务器开发模板是一套面向协议驱动、可插拔架构的轻量级服务框架,专为构建高内聚、低耦合的远程过程调用(RPC)与…...
释放CPU隐藏性能:CPUDoc的4大核心优化策略
释放CPU隐藏性能:CPUDoc的4大核心优化策略 【免费下载链接】CPUDoc 项目地址: https://gitcode.com/gh_mirrors/cp/CPUDoc 你的电脑是否经常在高负载任务下卡顿?游戏帧率忽高忽低?多任务处理时响应迟缓?CPUDoc作为一款开源…...
别再死记硬背公式了!用Matlab/Simulink手把手教你调PMSM的电流环PI参数(附模型)
永磁同步电机电流环PI参数整定实战:从理论推导到Simulink验证 在电机控制领域,永磁同步电机(PMSM)因其高效率、高功率密度等优势,已成为工业驱动和电动汽车的主流选择。而磁场定向控制(FOC)作为PMSM的核心控制策略,其性能很大程度…...
智能调压突破性能极限:AMD Ryzen处理器调试工具让多核效率提升150%
智能调压突破性能极限:AMD Ryzen处理器调试工具让多核效率提升150% 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…...
[Python3高阶编程] - 再论 WSGI、Web服务器和Python Web应用的关系
一、核心关系:WSGI 是“接口标准”,Web 服务器是“实现者”简单定义组件类型职责代表实现WSGI协议标准(PEP 3333)定义 Web 服务器与 Python 应用之间的通信接口规范:• 函数签名• 参数格式• 数据流向• 错误处理不是…...
手把手教你用S32K SDK和TCANLINPRO调试LIN总线主从通信(附Tomoss白盒实战)
手把手构建S32KTCANLINPRO的LIN总线开发实战:从硬件对接到协议栈调优 LIN总线作为汽车电子领域经典的辅助网络协议,在车门控制、座椅调节等场景中依然占据重要地位。对于刚接触汽车电子的开发者而言,如何快速搭建LIN通信调试环境往往是个令人…...
VSCode插件Console Ninja详解:把DevTools搬进编辑器,调试效率翻倍
作为前端/Node.js开发者,我们每天都会和console.log打交道——调试时写日志、看输出、找错误,却总被“切换窗口”困扰:一边是VSCode编辑器,一边是浏览器DevTools或终端,来回切换不仅打断思路,还浪费大量时间…...
别再用Keil MDK-ARM了?手把手教你用VSCode+GCC搭建STM32F103C8T6开发环境(附标准库模板)
逃离Keil:用VSCodeGCC打造高效STM32开发环境 在嵌入式开发领域,Keil MDK-ARM长期以来都是STM32开发的主流选择。但近年来,越来越多的开发者开始寻求更轻量、更现代化的替代方案。如果你也对Keil的笨重界面、高昂授权费用和有限的定制能力感到…...
