代码圈复杂度

java代码规范之代码圈复杂度

1,圈复杂度

  1. 定义
    圈复杂度 (Cyclomatic complexity) 是一种代码复杂度的衡量标准,也称为条件复杂度或循环复杂度,它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。简称 CC 。其符号为 VG 或是 M 。


    圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的圈复杂度有着很大关系。

  2. 案例
    计算方法
    有一个简单的计算方法,圈复杂度实际上就是等于判定节点的数量再加上1。向上面提到的:if else 、switch case 、 for循环、三元运算符,&&,|| 等等,都属于一个判定节点,例如下面的代码:
public void get(param){
int result = 1;
    if (param > 0) {
        result--;
    }
    for (let i = 0; i < 10; i++) {
        result += Math.random();
    }
    switch (parseInt(result)) {
        case 1:
            result += 20;
            break;
        case 2:
            result += 30;
            break;
        default:
            result += 10;
            break;
    }
    return result > 20 ? result : result;
  1. 度量插件
    IDEA可以安装MetricsReloaded插件

  2. 改进方案
    改进方案的目的是为了提高代码质量,而不是单单为了降低圈复杂度,一切以提高代码质量为原则。
  • 替换算法
if(str == 'China'){
  result = '中国人';
}
else if(str == 'US'){
  result = '美国人';
}
else if(str == 'France'){
  result = '法国人';
}
 
//替换成下面
people = [
  'China' => '中国人',
  'US' => '美国人',
  'France' => '法国人'
];
result = people[str];
  • Optional
public void test(User user){
    if(user != null){
        String userName = user.getUserName();
        Integer age = user.getAge();
        if(userName != null){
            userName = userName.toUpperCase();
            user.setUserName(userName);
        }
        if(age != null){
            age += 10;
            user.setAge(age);
        }
        ....
    }
}
 
//变成下面
 
public void test(User user){
    Optional<User> optional = Optional.ofNullable(user);
    optional.map(u -> {
        u.setUserName(u.getUserName().toUpperCase());
        u.setAge(u.getAge() + 10);
    });
}
  • 以多态取代条件式(将整个条件式的每个分支放进一个子类的重载方法中,然后将原始函数声明为抽象方法。
switch (cat){
    case ‘fish’:
        eatFish();
    case ‘moss’:
        eatMoss();
}
public void eatFish() {
    sys.out "Whale eats fish";
}
public void eatMoss() {
    sys.out "Whale eat moss";
}
 
//to
 
interface Eat {
    public eatFish();  
    public eatMoss();
}
class Whale implements Eat {
    public void eatFish() {
        sys.out "Whale eats fish";
    }
    public void eatMoss() {
        sys.out "Whale eat moss";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值