精华内容
下载资源
问答
  • [Java教程]圈复杂度0 2015-12-02 13:00:42Cyclomatic Complexity1. 概念a. 圈复杂度是一种衡量代码复杂程度...程序的可能错误和高的圈复杂度有着很大关系。c. 圈复杂度的表现:代码中分支循环语句多(if/else, switch...

    [Java教程]圈复杂度

    0 2015-12-02 13:00:42

    Cyclomatic Complexity

    1. 概念

    a. 圈复杂度是一种衡量代码复杂程度的标准。

    b. 圈复杂度高的害处:

    圈复杂度大说明代码的判断逻辑复杂,可能质量低;

    需要的更多的测试用例,难于测试和维护;

    程序的可能错误和高的圈复杂度有着很大关系。

    c. 圈复杂度的表现:

    代码中分支循环语句多(if/else, switch/case, for, while),圈复杂度与分支循环语句个数正相关;

    表达式复杂(含有三元运算符 )。

    2. 圈复杂度的计算方法

    bc91bb04e6e9c61e24c974e4440db8f2.gif

    (1)圈复杂度可以通过程序控制流图计算,公式为:V(G) = e + 2 - n

    e : 控制流图中边的数量

    n : 控制流图中节点的数量(包括起点和终点;所有终点只计算一次,多个return和throw算作一个节点)

    (2)圈复杂度对应程序控制流图中从起点到所有终点的路径的条数,所以页可以通过数路径的方式获得圈复杂度。

    3. 圈复杂度计算实例private int CalculateScore(int culture, String nation, boolean extend) { int result = 0; if (culture < 0) { throw new RuntimeException("分数不能小于0"); } else if (culture < 200) { return culture; } else { switch (nation){ case "汉": result = 0; break; case "蒙": case "回": case "维": case "藏": result = 10; break; default: result = 20; } } if (extend) { result += 10; } return result + culture; }

    程序控制流图:

    bc91bb04e6e9c61e24c974e4440db8f2.gif

    (1)   V(G) = 21 + 2 - 13 = 8;

    (2)   数路径:8条

    4. 减小圈复杂度的方法

    a. 提取函数 - 将独立业务或模块代码独立出来,封装为函数,通过函数名诠释代码作用,做到见名知意。

    b. 替换算法 - 复杂算法会导致bug可能性的增加及可理解性/可维护性的降低,如果函数对性能要求不高,提倡使用简单明了的算法。

    c. 分解条件式 - 复杂的条件表达式,使用函数进行封装

    d. 合并条件式 - 将一系列得到相同结果的条件表达式合并,可以的话封装为函数

    e. 合并重复的条件片段 - 不同条件的分支,有相同的处理,可以提炼出分支以外,或者封装为函数

    f. 移除控制标记 - 使用控制标签作为条件的,使用break 和 return取代

    g. 将查询函数和修改函数分离 - 单一职责原则,强调函数的复用性而不是多用性

    h. 函数携带参数 - 使用带参函数,强调函数的复用性

    i. 以明确函数取代参数 - 强调函数的功能的明确性

    本文网址:http://www.shaoqun.com/a/163857.html

    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

    0

    展开全文
  • Cyclomatic Complexity1....程序的可能错误和高的圈复杂度有着很大关系。c. 圈复杂度的表现:代码中分支循环语句多(if/else, switch/case, for, while),圈复杂度与分支循环语句个数正相关;表达式复...

    Cyclomatic Complexity

    1. 概念

    a. 圈复杂度是一种衡量代码复杂程度的标准。

    b. 圈复杂度高的害处:

    圈复杂度大说明代码的判断逻辑复杂,可能质量低;

    需要的更多的测试用例,难于测试和维护;

    程序的可能错误和高的圈复杂度有着很大关系。

    c. 圈复杂度的表现:

    代码中分支循环语句多(if/else, switch/case, for, while),圈复杂度与分支循环语句个数正相关;

    表达式复杂(含有三元运算符 )。

    2. 圈复杂度的计算方法

    f4ff8b013f9fb855bd92bc337e60aa92.png

    (1)圈复杂度可以通过程序控制流图计算,公式为:V(G) = e + 2 - n

    e : 控制流图中边的数量

    n : 控制流图中节点的数量(包括起点和终点;所有终点只计算一次,多个return和throw算作一个节点)

    (2)圈复杂度对应程序控制流图中从起点到所有终点的路径的条数,所以页可以通过数路径的方式获得圈复杂度。

    3. 圈复杂度计算实例

    private int CalculateScore(int culture, String nation, booleanextend) {int result = 0;if (culture < 0) {throw new RuntimeException("分数不能小于0");

    }else if (culture < 200) {returnculture;

    }else{switch(nation){case "汉":

    result= 0;break;case "蒙":case "回":case "维":case "藏":

    result= 10;break;default:

    result= 20;

    }

    }if(extend) {

    result+= 10;

    }return result +culture;

    }

    程序控制流图:

    927a9cb77809c06829dc56a56cffa536.png

    (1)   V(G) = 21 + 2 - 13 = 8;

    (2)   数路径:8条

    4. 减小圈复杂度的方法

    a. 提取函数 - 将独立业务或模块代码独立出来,封装为函数,通过函数名诠释代码作用,做到见名知意。

    b. 替换算法 - 复杂算法会导致bug可能性的增加及可理解性/可维护性的降低,如果函数对性能要求不高,提倡使用简单明了的算法。

    c. 分解条件式 - 复杂的条件表达式,使用函数进行封装

    d. 合并条件式 - 将一系列得到相同结果的条件表达式合并,可以的话封装为函数

    e. 合并重复的条件片段 - 不同条件的分支,有相同的处理,可以提炼出分支以外,或者封装为函数

    f. 移除控制标记 - 使用控制标签作为条件的,使用break 和 return取代

    g. 将查询函数和修改函数分离 - 单一职责原则,强调函数的复用性而不是多用性

    h. 函数携带参数 - 使用带参函数,强调函数的复用性

    i. 以明确函数取代参数 - 强调函数的功能的明确性

    展开全文
  • 圈复杂度

    2017-10-24 14:05:00
    Cyclomatic Complexity 概念  a. 圈复杂度是一种衡量代码复杂程度的标准。... 程序的可能错误和高的圈复杂度有着很大关系。  c. 圈复杂度的表现:  代码中分支循环语句多(if/else, switch/case, for,...

    Cyclomatic Complexity

    1. 概念

      a. 圈复杂度是一种衡量代码复杂程度的标准。

      b. 圈复杂度高的害处:

        圈复杂度大说明代码的判断逻辑复杂,可能质量低;

        需要的更多的测试用例,难于测试和维护;

        程序的可能错误和高的圈复杂度有着很大关系。

      c. 圈复杂度的表现:

        代码中分支循环语句多(if/else, switch/case, for, while),圈复杂度与分支循环语句个数正相关;

        表达式复杂(含有三元运算符 )。

    1. 圈复杂度的计算方法

    (1)圈复杂度可以通过程序控制流图计算,公式为:V(G) = e + 2 - n

      e : 控制流图中边的数量

      n : 控制流图中节点的数量(包括起点和终点;所有终点只计算一次,多个return和throw算作一个节点)

    (2)圈复杂度对应程序控制流图中从起点到所有终点的路径的条数,所以页可以通过数路径的方式获得圈复杂度。

    1. 圈复杂度计算实例

    复制代码
    private int CalculateScore(int culture, String nation, boolean extend) {
    int result = 0;
    if (culture < 0) {
    throw new RuntimeException("分数不能小于0");
    } else if (culture < 200) {
    return culture;
    } else {
    switch (nation){
    case "汉":
    result = 0;
    break;
    case "蒙":
    case "回":
    case "维":
    case "藏":
    result = 10;
    break;
    default:
    result = 20;
    }
    }

        if (extend) {
            result += 10; 
        }
        return result + culture;
        
    }

    复制代码
    程序控制流图:

    (1) V(G) = 21 + 2 - 13 = 8;

    (2) 数路径:8条

    1. 减小圈复杂度的方法

    a. 提取函数 - 将独立业务或模块代码独立出来,封装为函数,通过函数名诠释代码作用,做到见名知意。

    b. 替换算法 - 复杂算法会导致bug可能性的增加及可理解性/可维护性的降低,如果函数对性能要求不高,提倡使用简单明了的算法。

    c. 分解条件式 - 复杂的条件表达式,使用函数进行封装

    d. 合并条件式 - 将一系列得到相同结果的条件表达式合并,可以的话封装为函数

    e. 合并重复的条件片段 - 不同条件的分支,有相同的处理,可以提炼出分支以外,或者封装为函数

    f. 移除控制标记 - 使用控制标签作为条件的,使用break 和 return取代

    g. 将查询函数和修改函数分离 - 单一职责原则,强调函数的复用性而不是多用性

    h. 函数携带参数 - 使用带参函数,强调函数的复用性

    i. 以明确函数取代参数 - 强调函数的功能的明确性

    转自http://www.cnblogs.com/techroad4ca/archive/2015/12/02/5012406.html

    转载于:https://www.cnblogs.com/szqmvp/p/7723215.html

    展开全文
  • 我想减少开关盒的圈复杂度我的代码是:public String getCalenderName() {switch (type) {case COUNTRY:return country == null ? name : country.getName() + HOLIDAY_CALENDAR;case CCP:return ccp == null ? name...

    我想减少开关盒的圈复杂度

    我的代码是:

    public String getCalenderName() {

    switch (type) {

    case COUNTRY:

    return country == null ? name : country.getName() + HOLIDAY_CALENDAR;

    case CCP:

    return ccp == null ? name : ccp.getName() +" CCP" + HOLIDAY_CALENDAR;

    case EXCHANGE:

    return exchange == null ? name : exchange.getName() + HOLIDAY_CALENDAR;

    case TENANT:

    return tenant == null ? name : tenant.getName() + HOLIDAY_CALENDAR;

    default:

    return name;

    }

    }

    此代码块的复杂度为16,并希望将其降低到10。

    国家,ccp,交易所和租户是我的不同对象。 基于类型I将调用它们各自的方法。

    "此代码复杂度为16,并且希望将其降低到10"为什么不将其降低到9? 还是8? 还是11? 为什么16有问题?

    根据我的声纳规则,我希望将其降低到10以下,如果我们可以进一步降低它,那就太好了。 @安迪·特纳

    @AmarMagar您是否忘记在每种情况下或故意添加中断语句? 我不确定添加中断语句是否有助于降低循环复杂性。

    @克里希纳·昆塔拉(Krishna Kuntala)不需要break语句,因为在每种情况下他都将返回某些东西。

    我相信这是一个Sonar警告。我认为Sonar警告不是必须执行的规则,而只是指导。您的代码块原为READABLE和MAINTAINABLE。它已经很简单,但是如果您真的想要更改它,可以尝试以下两种方法,看看复杂度是否降低了:

    注意:我现在没有编译器,所以可能会出现错误,请对此表示抱歉。

    第一种方法:

    Map multipliers = new HashMap();

    map.put("country", country);

    map.put("exchange", exchange);

    map.put("ccp", ccp);

    map.put("tenant", tenant);

    然后我们可以使用地图获取正确的元素

    return map.get(type) == null ? name : map.get(type).getName() + HOLIDAY_CALENDAR;

    第二种方法:

    您所有的对象都有相同的方法,因此可以在其中添加Interface和getName()方法,并更改方法签名,例如:

    getCalendarName(YourInterface yourObject){

    return yourObject == null ? name : yourObject.getName() + HOLIDAY_CALENDAR;

    }

    已经尝试了第一种方法,但是无法在地图值上调用getName

    然后使用第二种方法,引入一个带有getName()方法的新接口。如果您有共同的行为/方法,则应该使用多态的好处。

    无论如何都以不同的方式找到了答案

    据我所知,不要在switch语句中使用return语句。在switch语句后使用变量应用该逻辑。

    创建一个用于检查空值的方法并从switch调用该方法,然后您将能够降低Cyclomatic Complexity

    您可以用Dictionary>替换switch / case语句。

    看看这个博客文章的最后一个例子

    我认为您可以通过确保代码中的其他内容固定来降低复杂度。

    举个例子:

    case COUNTRY:

    return country == null ? name : country.getName() + HOLIDAY_CALENDAR;

    这意味着如果压延机类型为COUNTRY,则与压延机关联的国家/地区可能为null。这是您应设计避免的事情,因为我看不出为什么这可能是有效的情况。为什么您会有没有国家的国家日历?

    因此,一旦为日历分配了type,请确保没有与日历关联的非空对象。这样,您的情况将像

    case COUNTRY:

    return country.getName() + HOLIDAY_CALENDAR;

    将您的圈复杂度降低到5。

    如果您的首要目标只是减少圈数的复杂性,则应针对每种获取名称的方式创建方法,如下所示。

    public String getCalenderName() {

    switch (type) {

    case COUNTRY:

    return getCountryName();

    case CCP:

    return getCcpName();

    case EXCHANGE:

    return getExchangeName();

    case TENANT:

    return getTenantName();

    default:

    return name;

    }

    }

    private String getCountryName() {

    return country == null ? name : country.getName() + HOLIDAY_CALENDAR;

    }

    private String getCcpName() {

    return ccp == null ? name : ccp.getName() +" CCP" + HOLIDAY_CALENDAR;

    }

    private String getExchangeName() {

    return exchange == null ? name : getName.toString() + HOLIDAY_CALENDAR;

    }

    private String getTenantName() {

    return tenant == null ? name : getName.toString() + HOLIDAY_CALENDAR;

    }

    请注意,在您的特定示例中,我假设您有1个类收集(至少)4个非常相似的行为。重构无疑会更有意义,例如具有一个基本实现(是否抽象)以及其他4个继承的类。

    当然,如果您不想让声纳抱怨,请添加javadoc;)

    如果您的对象:国家/地区,cpp,交易所和租户共享同一接口,例如您可以使用ObjectWithGetName重构代码,如下所示:

    public String getCalenderName() {

    ObjectWithGetNameMethod calendarType = null;

    switch (type) {

    case COUNTRY:

    calendarType = country;

    break;

    case CCP:

    calendarType = cpp;

    break;

    case EXCHANGE:

    calendarType = exchange;

    break;

    case TENANT:

    calendarType = tenant;

    break;

    default:

    calendarType = null;

    }

    return (calendarType != null ? (calendarType.getName() + HOLIDAY_CALENDAR) : name);

    }

    我也认为将开关切换到单独的方法会很好,因为看起来巫婆会在许多不同的地方使用。

    该解决方案不起作用,因为国家/地区,抄送,交易所和租户是不同的实体。因此,在调用getName方法时,我必须使用它们各自的对象来调用方法。

    您可以删除所有空比较,并在切换大小写之前对其进行检查。在这种情况下,复杂度将减少4倍或更多。

    尝试仍然无法减少

    public String getName() {

    if (type == null) {

    return name;

    }

    if (type == BusinessCalendarType.COUNTRY) {

    return country == null ? name : country.getName() + HOLIDAY_CALENDAR;

    } else if (type == BusinessCalendarType.CCP) {

    return ccp == null ? name : ccp.getName() +" CCP" + HOLIDAY_CALENDAR;

    } else if (type == BusinessCalendarType.EXCHANGE) {

    return exchange == null ? name : exchange.getName() + HOLIDAY_CALENDAR;

    } else if (type == BusinessCalendarType.TENANT)  {

    return tenant == null ? name : tenant.getName() + HOLIDAY_CALENDAR;

    } else {

    return name;

    }

    }

    这对我有用

    这在功能上是错误的。 swicht语句中的默认值不对应于type == null

    实际上type是一个Enum,并且肯定会返回这4个值之一或仅返回null。在我的问题中,我写了默认声明,这是因为声纳警告。反正你是对的。根据您的建议,我已经更改了此答案。

    您只是为了使声纳中的警告规则更难阅读而使相对(人类)可读的功能变得更加难以理解...

    展开全文
  • 代码圈复杂度

    2020-02-24 19:24:22
    圈复杂度 (Cyclomatic complexity) 是一种代码复杂度衡量标准,也称为条件复杂度或循环复杂度,它可以用来衡量一个模块判定结构复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有可能情况最少使用...
  • 圈复杂度(Cyclomatic complexity)也称为条件复杂度或循环复杂度,是一种软件度量,是由Thomas J. McCabe, Sr. 在 1976 年提出,用来表示程序复杂度,其符号为 VG 或是 M。圈复杂度是对源代码中线性独立路径数...
  • 圈复杂度及其运用

    2020-12-01 17:01:02
    圈复杂度(Cyclomatic complexity)又称为条件复杂度或循环复杂度,用于衡量要给模块判定结构复杂程度;数量上表现为独立现行路径条数,也可理解为覆盖所有可能情况最少使用测试用例数。 2.圈复杂度的...
  • 简单圈复杂度计算

    2019-12-23 00:07:54
    Cyclomatic Complexity 1. 概念  a. 圈复杂度是一种衡量代码复杂程度的标准。... 程序的可能错误和高的圈复杂度有着很大关系。  c. 圈复杂度的表现:  代码中分支循环语句多(if/else, switch/c...
  • 一个pybuilder插件,使用radon检查项目的圈复杂度。 有关radon的更多信息,请参考。 要将这个插件添加到您的pybuilder项目中,请在build.py顶部添加以下行: use_plugin ( 'pypi:pybuilder_radon' , '~=0.1.0' ) ...
  • 函数的圈复杂度是根据以下规则计算的: 1 is the base complexity of a function +1 for each 'if', 'for', 'case', '&&' or '||' 具有较高圈复杂度的功能需要更多的测试用例才能覆盖所有可能的路径,并且可能更难...
  • #圈复杂度 - Cyclomatic Complexity

    千次阅读 2017-12-01 14:23:38
    ##概念 循环复杂度(Cyclomatic complexity)也称为条件复杂度,是一种软件度量,是由老托马斯·J·麦凯布(英语:Thomas J. McCabe, Sr.) 在1976年提出,用来表示程序复杂度,其符号为VG或是M。...圈复杂度(Cyclom
  • 循环复杂性有助于使我们远离编写更容易出错,更复杂测试且更难以推理复杂代码。 我会特别关注后者,因为这意味着可读性低和维护成本高。 例如,if / else语句通常用于: if THIS then do some logic in order ...
  • 循环复杂性可以帮助我们避免编写复杂代码,因为这些代码更容易出错,测试起来更加复杂,并且难以推理。 我会特别注意后者,因为这意味着可读性低和维护成本高。 例如,if / else语句通常用于: if THIS then do ...
  • 使用python和radon批量获取代码复杂度 目录使用python和radon批量获取代码复杂度任务概述为啥用radon如何使用radon注意点 ...确实,mi指数或者圈复杂度要比我们想的循环深度要好(再说直接调用就好)。 如何使
  • 圆圈中最后剩下数字(循环链表) 代码(C++)本文地址: http://blog.csdn.net/caroline_wendy题目: 0,1...,n-1这n...使用循环链表, 依次遍历删除, 时间复杂度O(mn), 空间复杂度O(n).代码:/* * main.cpp * * Created
  • 约瑟夫问题描述:n个人围成一个,编号为0,1,2,..,n-1,设定一个常数k,然后从0号开始从1依次报数,报到k那个人退出,后面一个人继续从1开始报数,依次类推,求最后剩下编号 方法1:模拟游戏过程方法...
  • 我在用matlab编写一个小算法,这个算法里面可能多次循环的嵌套,导致得到最终结果(输入Reader=800,Tag=1000,r=30,范围为[1,900]的时候),花费了将近800多秒!!!劳驾各方神圣给我指点迷津,降低我这个算法的...
  • //0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。 //求出这个圆圈里剩下最后一个数字。比如0,1,2,3,4,从0开始每次...//传统循环找,时间复杂度O(nm),空间复杂度O(n) int LastRe
  • 笔试题之循环报数

    2020-09-06 11:07:14
    题目:有n个人围成一,顺序排号。...技巧:并不是真正删除,而是通过0,1去标记,如果物理删除,再循环,时间复杂度会很高 import java.util.Scanner; public class Tran2 { public static void
  • 约瑟夫环在《具体数学》中给出了任意m公式推导,奈何具体数学学得不精,过了一段时间便忘光了,数学能力好人可以考虑公式直接推,时间复杂度和空间复杂度绝对是最低。 我这里便利用计算机性能,使用了模拟...
  • 圆圈中最后剩下数字(递推公式) 代码(C++)本文地址:http://blog.csdn.net/caroline_wendy题目: 0,1......可以推导出约瑟夫环递推公式, 使用循环进行求解, 时间复杂度O(n), 空间复杂度O(1).代码:/* * main.cpp * *
  • 约瑟夫环 题目 0,1,...,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。...时间复杂度O(m*n) 空间复杂度O(n) 解法2:用数组模拟 每次计算下标,需要考虑末尾条件 解法3:数学推导 f(n

空空如也

空空如也

1 2 3 4 5 6
收藏数 118
精华内容 47
关键字:

循环的圈复杂度