如何降低代码圈复杂度

文章介绍了提高代码质量的七个编程技巧,包括提炼函数以降低复杂度、替换算法以简化逻辑、使用Optional避免空指针异常、逆向表达简化条件判断、合并条件式、移除控制标识以及用多态替换条件式,旨在优化代码结构和可读性。

已剪辑自: https://mp.weixin.qq.com/s?__biz=MzI2MTE4Nzk5MA%3D%3D&mid=2247483685&idx=1&sn=26072d6a41ed9abef0e5e009f0a7a630&scene=45#wechat_redirect

改进方案的目的是为了提高代码质量,而不是单单为了降低圈复杂度,一切以提高代码质量为原则。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F9plFcXa-1679233463735)(null)]

技巧一、提炼函数

把子程序的一部分提取成另一个子程序,不会降低整个程序的复杂度,只是把决策点移到其他地方,但是这样做可以降低你在同一时间必须关注的复杂度水平。由于重点是要降低你需要在头脑中同时考虑的项目的数量,所以降低一个给定程序的复杂度是有价值的。

public void test(Integer number){
  if(number < Integer.MIN_VALUE)
  {
    number = Integer.MIN_VALUE;
  }
  for(int i = 0; i < number; i++){
    //some code
  }
}
//替换成下面
public void  test(Integer number){
  number = getMin(number);
  for(int i = 0; i < number; i++){
    //some code
  }
}
function getMin(number){
  if(number < Integer.MIN_VALUE){
    return Integer.MIN_VALUE;
  }
  return number
}

技巧二、替换算法

if(str == 'China'){
  result = '中国人';
}
else if(str == 'US'){
  result = '美国人';
}
else if(str == 'France'){
  result = '法国人';
}
//替换成下面
Map people = new HashMap<String ,String>();
map.put("China","中国人");
map.put("US","美国人");
map.put("France","法国人");
result = people.get(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 -> {
        if(u.getUserName() !=null){
            u.setUserName(u.getUserName().toUpperCase());
        }
        if(u.getAge() != null){
            u.setAge(u.getAge() + 10);
        }
    });
}

技巧四、逆向表达

if((条件1 && 条件2) || !条件1){
  return true;
}
else{
  return false;
}
//变成
if(条件1 && !条件2){
  return false;
}
return true;

技巧五、合并条件(将这些判断合并为一个条件式,并提取成独立函数)

if($x < 1) return 0;
if($y > 10) return 0;
if($z != 0) return 0;
//to
if(get_result($x,$y,$z)) return 0;

技巧六、移除控制标识**(可以使用break和return取代控制标记。)**

boolean flag = false;
for(arr : arrs){
    if(!flag){
        if(arr == 1){
            someFunction();
            bool = true;
        }
        if(arr == 2){
            someFunction();
            bool = true;
        }
    }
}
//to
for(arr : arrs){
    if(arr == 1 || arr == 2){
        someFunction();
    }
    break;
}

技巧七、以多态取代条件式(将整个条件式的每个分支放进一个子类的重载方法中,然后将原始函数声明为抽象方法。

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";
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机载软件与适航

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值