代码优化(一)

if-else语句优化

 

代码 if-else 代码太多的缺点

最大的问题是代码逻辑复杂,维护性差,极容易引发 bug

重构 if-else原则

尽可能地维持正常流程代码在最外层——主干代码是正常流程,避免嵌套过深

实现的手段有

减少嵌套、移除临时变量、条件取反判断、合并条件表达式等

 

实例一:合并条件表达式

重构前

 1  double disablityAmount(){
 2    if(_seniority < 2)
 3        return 0;
 4
 5    if(_monthsDisabled > 12)
 6        return 0;
 7
 8    if(_isPartTime)
 9        return 0;

重构后

1  double disablityAmount(){
2    if(_seniority < 2 || _monthsDisabled > 12 || _isPartTime)
3        return 0;
实例二:改包含关系为平行关系(嵌套无关联性时);废除临时变量
 1  double getPayAmount(){
 2    double result;
 3    if(_isDead) {
 4        result = deadAmount();
 5    }else{
 6        if(_isSeparated){
 7            result = separatedAmount();
 8        }
 9        else{
10            if(_isRetired){
11                result = retiredAmount();
12            else{
13                result = normalPayAmount();
14            }
15        }
16    }
17    return result;

重构后

 1  double getPayAmount(){
 2      if(_isDead)
 3         return deadAmount();
 4
 5      if(_isSeparated)
 6          return separatedAmount();
 7
 8      if(_isRetired)
 9          return retiredAmount();
10
11    return normalPayAmount();
实例三:将条件反转使异常情况先退出;维持正常流程代码在最外层
1  public double getAdjustedCapital(){
2    double result = 0.0;
3    if(_capital > 0.0 ){
4        if(_intRate > 0 && _duration >0){
5            resutl = (_income / _duration) *ADJ_FACTOR;
6        }
7    }
8    return result;

重构后

 1  public double getAdjustedCapital(){
 2    if(_capital <= 0.0 ){
 3        return 0.0;
 4    }
 5    if(_intRate <= 0 || _duration <= 0){
 6        return 0.0;
 7    }
 8
 9    return (_income / _duration) *ADJ_FACTOR;

 
重构前:


1   /* 查找年龄大于18岁且为男性的学生列表 */
2    public ArrayList<Student> getStudents(int uid){
3        ArrayList<Student> result = new ArrayList<Student>();
4        Student stu = getStudentByUid(uid);
5        if (stu != null) {
6            Teacher teacher = stu.getTeacher();
7            if(teacher != null){
8                ArrayList<Student> students = teacher.getStudents();
9                if(students != null){
10                    for(Student student : students){
11                        if(student.getAge() > = 18 && student.getGender() == MALE){
12                            result.add(student);
13                        }
14                    }
15                }else {
16                    logger.error("获取学生列表失败");
17                }
18            }else {
19                logger.error("获取老师信息失败");
20            }
21        } else {
22            logger.error("获取学生信息失败");
23        }
24        return result;
25    }

重构后:

1   /* 查找年龄大于18岁且为男性的学生列表 */
 2    public ArrayList<Student> getStudents(int uid){
 3        ArrayList<Student> result = new ArrayList<Student>();
 4        Student stu = getStudentByUid(uid);
 5        if (stu == null) {
 6            logger.error("获取学生信息失败");
 7            return result;
 8        }
 9
10        Teacher teacher = stu.getTeacher();
11        if(teacher == null){
12            logger.error("获取老师信息失败");
13            return result;
14        }
15
16        ArrayList<Student> students = teacher.getStudents();
17        if(students == null){
18            logger.error("获取学生列表失败");
19            return result;
20        }
21
22        for(Student student : students){
23            if(student.getAge() > 18 && student.getGender() == MALE){
24                result.add(student);
25            }
26        }
27        return result;
28    }
实例四:将把 if-else 内的代码都封装成一个公共函数
 1  double getPayAmount(){
 2    Object obj = getObj();
 3    double money = 0;
 4    if (obj.getType == 1) {
 5        ObjectA objA = obj.getObjectA();
 6        money = objA.getMoney()*obj.getNormalMoneryA();
 7    }
 8    else if (obj.getType == 2) {
 9        ObjectB objB = obj.getObjectB();
10        money = objB.getMoney()*obj.getNormalMoneryB()+1000;
11    }
12    return money;
12  }

重构后:

 1  double getPayAmount(){
 2    Object obj = getObj();
 3    if (obj.getType == 1) {
 4        return getType1Money(obj);
 5    }
 6    else if (obj.getType == 2) {
 7        return getType2Money(obj);
 8    }
 9 }
10
11  double getType1Money(Object obj){
12    ObjectA objA = obj.getObjectA();
13    return objA.getMoney()*obj.getNormalMoneryA();
14  }
15
16  double getType2Money(Object obj){
17    ObjectB objB = obj.getObjectB();
18    return objB.getMoney()*obj.getNormalMoneryB()+1000;
19  }
实例五:多态取代条件表达式

重构前:

 1  double getSpeed(){
 2    switch(_type){
 3        case EUROPEAN:
 4            return getBaseSpeed();
 5        case AFRICAN:
 6            return getBaseSpeed()-getLoadFactor()*_numberOfCoconuts;
 7        case NORWEGIAN_BLUE:
 8            return (_isNailed)?0:getBaseSpeed(_voltage);
 9      }
10  }

重构后:

 1  class Bird{
 2    abstract double getSpeed();
 3  }
 4
 5  class European extends Bird{
 6    double getSpeed(){
 7        return getBaseSpeed();
 8    }
 9  }
10
11  class African extends Bird{
12    double getSpeed(){
13        return getBaseSpeed()-getLoadFactor()*_numberOfCoconuts;
14    }
15  }
16
17  class NorwegianBlue extends Bird{
18    double getSpeed(){
19        return (_isNailed)?0:getBaseSpeed(_voltage);
20    }
21  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值