在软件开发中,代码的复杂性是一个重要的考量因素。圈复杂度是一种用于衡量代码复杂性的指标,它可以帮助开发者评估代码的可读性、可维护性和可测试性。本文将详细介绍圈复杂度的概念,并提供几种降低圈复杂度的方法。同时,我们还将探讨如何在前端开发中使用ESLint和VS Code工具来设置和检测圈复杂度。
圈复杂度就是可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立线性路径条数。举一个最简单的例子,一个函数有 if else 语句,这个时候,执行这个函数就需要两条路径来执行,一个是 if 另一个是 else,那么,这个函数的圈复杂度就为 2 。
可能你之前没有听说过这个词,也会好奇这是个什么东西是用来干嘛的,在维基百科上有这样的解释。
圈复杂度(Cyclomatic complexity,简写CC)也称为条件复杂度,是一种代码复杂度的衡量标准。由托马斯·J·麦凯布(Thomas J. McCabe, Sr.)于1976年提出,用来表示程序的复杂度,其符号为VG或是M。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和 维护。程序的可能错误和高的圈复杂度有着很大关系。
圈复杂度(Cyclomatic Complexity)是衡量计算机程序复杂程度的一种措施。它根据程序从开始到结束的线性独立路径的数量计算得来的。
程序由红色的节点开始运行,然后进入循环(红色节点下由三个节点组成),离开循环后有条件分支,最后运行蓝色节点后结束;
针对上面的问题,本文的主角 圈复杂度 重磅登场,本文将从圈复杂度原理出发,介绍圈复杂度的计算方法、如何降低代码的圈复杂度,如何获取圈复杂度,以及圈复杂度在公司项目的实践应用。
工作中,难免会遇到老项目老代码,不仅仅需要我们维护,可能还需要我们在原来的垃圾代码上进行新增功能或者是进行优化调整
Tech 导读 随着业务需求不断迭代,项目代码不断更新,开发人员会考虑代码的可测试性,倾向于编写简单的代码。所以代码圈复杂度是衡量工程代码是否适时重构的重要指标之一。本文意在分享基于python三方库提供一种自动监控工程代码圈复杂度的落地方案。 01
最小化目标函数时,可以看做在控制损失函数不变的情况时令正则项最小化,几何意义如下所示:蓝色圈表示没有限制的损失函数随着 w 迭代寻找着最小化的过程的 E(w) 函数等高线(同个圆上的损失函数值相同),蓝色圈和橙色圈之和就是目标函数值,目标函数最小化的点往往出现在蓝圈和橙圈相交的点即目标函数最小化的参数值 w∗ 。
在数学上我们可以证明岭估计的参数模要严格小于最小二乘估计的参数模,换句话说,我们可以认为加入$L2$正则项后,估计参数长度变短了,这在数学上被称为特征缩减shrinkage。
本文属于 dotnet 代码优化系列博客。相信大家都对圈复杂度这个概念很是熟悉,本文来和大家聊聊逻辑的圈复杂度。代码优化里面,一个关注的重点在于代码的逻辑复杂度。一段代码的逻辑复杂度越高,那么维护起来的难度也就越大。衡量代码的逻辑复杂度的一个维度是通过逻辑圈复杂度进行衡量。本文将告诉大家如何判断代码的逻辑圈复杂度以及一些降低圈复杂度的套路,让大家了解如何写出更好维护的代码
最近, 一直在思考如何写好代码, 写人能懂的代码, 写能维护的代码, 总结下来,实时更新, 有感同深受者或不同意见可一起分享下。 1. 理解业务模型 业务模型, 是整个业务的核心, 业务搞明白再写, 要让代码在大脑里跑一遍, 再去用环境去测。 2. 理解数据模型 数据模型和业务模型息息相关的 3.先写异常情况,出现异常返回,再写正常情况 也是为了降低圈复杂度 4.解偶和可扩展 5.数据一致性 内存存储运行态的信息 持久化要DB或文件来存储 6避免用全局变量 服务进程crash,数据如何恢复 7. 符合编程
控制结构?没错!你最爱的 if、for都是一类坏味道,没想到吧?自己竟然每天都沉浸在写坏味道的体验中。
软件质量是软件与明确地叙述的功能和性能需求、文档中明确描述的开发标准以及任何专业开发的软件产品都应该具有的隐含特性相一致的程度。
复杂或复杂性与简单相对立,那么复杂是什么?它是我们大脑中的一个概念,但是我在网上找不到一个给复杂恰当的定义描述,它会有不同的解释。 其中洛克在《人类理解论》中说道:『一些思想是由简单的思想组合而成,我称此为复杂;比如美、感激、人、军队、宇宙等。』 作为研究复杂系统的专家 Melanie Mitchell,也没有给出一个明确的公认的定义。她在《复杂》一书中给出了复杂系统加以定义:『复杂系统是由大量组分组成的网络,不存在中央控制,通过简单运作规则产生出复杂的集体行为和复杂的信息处理,并通过学习和进化产生适应性。』 上述复杂系统中的组分对应软件系统中的组成部分,基于不同粒度可以是对象、函数、类、包、模块、组件和服务等。每一部分都应该是相对单一的职责,细粒度部分之间耦合提供更粗粒度功能,不同组分之间相互协作来提供系统功能,继而组合成我们复杂的软件系统。
将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转换。
班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。
这篇文章又是关于代码质量的,有些同学可能觉得我比较啰嗦。不过我就是想用这种方式让大家重视起来。其实说来说去就那么几种方法,但是实际执行起来真是难于登天。
写在前面 现在的软件系统开发难度主要在于其复杂度和规模,客户需求也不再像Winston Royce瀑布模型期望那样在系统编码前完成所有的设计满足用户软件需求。在这个信息爆炸技术日新月异的时代,需求总是在不断的变化,随之在2001年业界17位大牛聚集在美国犹他州的滑雪胜地雪鸟(Snowbird)雪场,提出了“Agile”(敏捷)软件开发价值观,并在他们的努力推动下,开始在业界流行起来。在《代码整洁之道》一书中提出:一种软件质量,可持续开发不仅在于项目架构设计,还与代码质量密切相关,代码的整洁度和质量成正比,
为了解决因为代码圈复杂度产生的代码质量问题,C++11提供了type_tratis类型萃取功能,在一定程度上可以消除冗长的代码分支语句,降低圈复杂度进而提升代码的可维护性。
现在21世纪,有人称之为大数据时代,谁有数据量大的数据,谁能够从海量数据中提取到有用信息,并能够将其转换为资本,谁就取得了互联网的地位。
• 松耦合Loosely Coupled: 松耦合的代码让实体之间的副作 用更少,更容易测试、复用、扩展
降低认知复杂度是帮助您编写安全、可维护和可靠代码的关键,这将使开发人员(包括您自己)更快乐。
单元通俗的说就是指一个实现简单功能的函数。单元测试就是只用一组特定的输入( 测试用例)测试函数是否功能正常,并且返回了正确的输出。
相信大多数人都已经接触过数据可视化——Excel 随便画一张表就是了。众所周知,二维数据可视化很容易,条形图、饼状图等等,我们在初中就已经学过了。那么三维数据呢?可能有些接触到音频产品的朋友会说瀑布图,很好。而 N 维数据呢?物理学告诉我们:低维空间只能观察到高维空间在本维度的投影。既然我们本身的维度无法增加,那么就只能想办法把数据的维度降低了。
在某种意义上,你可以把机器学习算法看作有很多刀剑的军械库。里边有各种各样的工具,你要做的,就是得学会在对的时间使用对的工具。举个例子,如果把“回归”看作是一把剑,它可以轻松地将一部分数据大卸八块,但面对高度复杂的数据时却无能为力。相反,支持向量机就像一把锋利的小刀--它适用于规模更小的数据集,这并不代表这把刀威力不够,相反的,它在构建模型时表现的非常强大。
我们都知道,在进行数据挖掘或者机器学习模型建立的时候,因为在统计学习中,假设数据满足独立同分布(i.i.d,independently and identically distributed),即当前已产生的数据可以对未来的数据进行推测与模拟,因此都是使用历史数据建立模型,即使用已经产生的数据去训练,然后使用该模型去拟合未来的数据。但是一般独立同分布的假设往往不成立,即数据的分布可能会发生变化(distribution drift),并且可能当前的数据量过少,不足以对整个数据集进行分布估计
IntelliJ IDEA 是Java开发人员中最受欢迎的IDE之一。它具有许多便利的功能,如智能代码补全和自动化繁琐重复的开发任务,已成为Java社区中友好的IDE。这种便利和用户友好的特性有助于开发人员专注于更大的项目。
作者:章华燕 编辑:赵一帆 1、机器学习中常见的损失函数 一般来说,我们在进行机器学习任务时,使用的每一个算法都有一个目标函数,算法便是对这个目标函数进行优化,特别是在分类或者回归任务中,便是使用损失函数(Loss Function)作为其目标函数,又称为代价函数(Cost Function)。损失函数是用来评价模型的预测值 Y_hat=f(X) 与真实值Y的不一致程度,它是一个非负实值函数。通常使用 L(Y,f(x))来表示损失函数,损失函数越小,模型的性能就越好。 设总有N个样本的样本集为(X,Y)=(
由于单层的感知机模型的表达能力很差,只能表示线性模型,连最简单的 XOR 函数模型都无法表示,所以出现了多层感知机模型,加入了隐藏层,最简单的多层感知机模型有三层,分别为输入层、隐藏层、输出层,其中隐藏层的元素个数和层数是超参数(即自定义的),如下图所示:
破窗效应是犯罪心理学的一个理论,指如果一个建筑,当出现小量破窗的时候,会诱发更多的人为破坏。如果一个建筑出现破窗的时候及时修复,会受到更少破坏。我们是否有这样的经历,当接手一个代码质量较差的项目,例如一个函数有上百行的代码,函数里有大量的 if else,如果让你增加一个功能,你更倾向于直接在目标函数上加入你的改动代码,而不是通读该方法,再进行封装修改呢。其实这样的修改方式,并没有错,也和个人能力没有关系,因为这种修改方式是最保险,最快捷的,他不但维持代码原有功能正常运行,还添加了新的功能。但是,这样的项目,就是典型的破窗效应,因为第一个人产生了破窗,没有及时修复,后面来的人,就会更大胆的破坏,最终项目没法维护。
两个特征区别相差特别大。所形成的等高线比较尖锐。当时用梯度下降法时,很可能要垂直等高线走,需要很多次迭代才能收敛。
有几种适用于Java的开源覆盖技术。在实现Eclipse插件EclEmma时,观察到它们都不是真正为集成而设计的。它们中的大多数特别适合特定工具(Ant任务,命令行,IDE插件),并且不提供允许在不同上下文中嵌入的文档化API。 EMMA和Cobertura是最好的和广泛使用的两个开源工具。这两个工具都不再由原始作者积极维护,并且不支持当前的Java版本。由于缺乏回归测试,因此很难进行维护和添加功能。
有几种适用于Java的开源覆盖技术。在实现Eclipse插件EclEmma时,观察到它们都不是真正为集成而设计的。它们中的大多数特别适合特定工具(Ant任务,命令行,IDE插件),并且不提供允许在不同上下文中嵌入的文档化API。EMMA和Cobertura是最好的和广泛使用的两个开源工具。这两个工具都不再由原始作者积极维护,并且不支持当前的Java版本。由于缺乏回归测试,因此很难进行维护和添加功能。
我们提前设置一个标记数组prime[N] ,提前标记好数字的质数状态,这样就能减少重复判断。
多少次的惨痛教训告诉我们,在软件应用发布维护版本或者补丁之前,应该避免使用其最新版本。虽然每个人都知道初始发布版本V和稳定发布版本V.n之间存在软件质量鸿沟,这个问题却一直没有得到解决。 本文将会讨论5个具有可操作性的原则,以帮助开发团队跨越质量鸿沟 1. 使用代码覆盖率反映测试完整性 软件测试的目的都是为了保证软件能在最终用户使用时是正常运行的。然而,软件测试面临着挑战,如何保证测试的完整性?很多开发组织会制定测试规程去匹配需求文档或者用户文档。这种测试方法可以验证正常操作路径,但是测试边界、错误场景都无
https://www.cnblogs.com/flykai/p/17007554.html
①使用敏捷开发,并不一定意味着应用程序完成得更快且质量更高,敏捷开发最大的优势是它处理需求变更的方式。
这段代码定义了一个程序,该程序包含一个名为main的函数。这个函数执行一个简单的输出操作,向标准输出流(通常是控制台)打印一条消息“Hello, World!”。最后,main函数返回0,表示程序成功结束。
Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联,那在设计程序是就需要考虑。我们先来看一段代码:
彻底弄明白常用的排序算法的基本思想,算法的时间和空间复杂度,以及如何选择这些排序算法,确定要解决的问题的最佳排序算法,我们先总结下冒泡排序和其改进后的快速排序这两个算法,后面再继续总结插入排序、希尔排序、选择排序、堆排序、归并排序和基数排序。
13个人手拉手围成一个圈,假设从1号开始报数1,他的下一位2号报数2,再下一位3号报数3,当报数是3的人(即3号)退出圈,他的前后两人(即2号和4号)重新拉上手,然后从4号开始重复上述过程,这样经过若干次后这个圈会最终剩下一个人,那么请问最后这个人是谁,请写出程序找到这个人。
我们经常都会碰到延迟任务,定时任务这种需求。在网络连接的场景中,常常会出现一些超时控制。随着连接数量的增加,这些超时任务的数量往往也是很庞大的。实现对大量任务的超时管理并不是一个容易的事情。
而当在有父类情况下,如果你那父类没有父类,则其父类的父类默认为object类,所以即使一个类有父类,其内部还是有object类。
有好几位读者私下问我 LeetCode 「打家劫舍」系列问题(英文版叫 House Robber)怎么做,我发现这一系列题目的点赞非常之高,是比较有代表性和技巧性的动态规划题目,今天就来聊聊这道题目。
领取专属 10元无门槛券
手把手带您无忧上云