if判断如何写的漂亮,增加可读性

这个问题想了好长时间,自己平常写代码也会出现很多if嵌套问题,也没有很好的处理,感觉代码不好看,在网上查资料总结了下,常见if else判断 出现在逻辑异常判断和 各种不同状态处理

常见异常例子

逻辑异常是一个正常的业务流程,状态管理也是一个正常的业务流程, 举个例子

逻辑异常

// 逻辑异常
function addUser(user: any){
    if(user.name ==null){
     //do what
    }
    if(user.phone == null){
     // do other what
     }
}

状态处理


// 状态处理
funtion applyUser(){
    if (user.status == 1){
     // do what
    }
    if ( user.status == 2){
     // do what;
    }
}

常见就这2种,夹杂在一起,这些代码都是必须的,所以会给人无从下手的感觉

逻辑异常解决办法

1. 合并条件(A:熟知语言常if判断为false的条件,B:常用 或条件);


function addUser(user){
 // 重构前
 if(user.name == null || user == ''){
   return false'
}
if(user.name == null){
return false
}

// 合并后,(js中,null,undefined, '',0 在 if中都表示 false,其他语言类似特征可以参考这个)
if(!user.name){
   return false;
}

// 重构前
if(user.age < 18)
       return false;

   if(user.age > 60)
       return false;

   if(!user.name)
       return false;
// 重构后
if(user.age < 18 || user.age > 60 || !user.name){
return false;
}

总结: 如果有一系列条件测试都得到相同结果,将这些结果测试合并为一个条件表达式。

2 少用 result 临时变量,直接return, 如果if-else没有嵌套关系,,提到第一层

getMoney(user){
   let result;
   if(user.type == 'isChild') {
       result = do1();
   }else{
       if(user.type == 'oldman'){
           result = do2();
       }
       else{
           if(user.type == 'qingnian'){
               result = do3();
           else{
               result = do4();
           }
       }
   }
   return result;
   }

   // 重构后
    getMoney(user){
       if(user.type == 'isChild') {
           return do1();
       };
       if(user.type == 'oldman'){
          return  do2();
       };
       if(user.type == 'qingnian'){
           return  do3();
       };
       return do4();
   }

3. 把正常的业务流程放到最外面

public double getAdjustedCapital(){
   double result = 0.0;
   if(_capital > 0.0 ){
       if(_intRate > 0 && _duration >0){
           resutl = (_income / _duration) *ADJ_FACTOR;
       }
   }
   return result;
}
#### A:,减少嵌套和移除临时变量:
public double getAdjustedCapital(){
   if(_capital <= 0.0 ){
       return 0.0;
   }
   if(_intRate > 0 && _duration >0){
       return (_income / _duration) *ADJ_FACTOR;
   }
   return 0.0;
}
#### B:在优化一把,把主要逻辑放到外面
public double getAdjustedCapital(){
   if(_capital <= 0.0 ){
       return 0.0;
   }
   if(_intRate <= 0 || _duration <= 0){
       return 0.0;
   }

   return (_income / _duration) *ADJ_FACTOR;
}

总结: 将条件反转使异常情况先退出,让正常流程维持在主干流程。

在举个例子,看个比较复杂的,多层嵌套

public ArrayList<Student> getStudents(int uid){
        ArrayList<Student> result = new ArrayList<Student>();
        Student stu = getStudentByUid(uid);
        if (stu != null) {
            Teacher teacher = stu.getTeacher();
            if(teacher != null){
                ArrayList<Student> students = teacher.getStudents();
                if(students != null){
                    for(Student student : students){
                        if(student.getAge() > = 18 && student.getGender() == MALE){
                            result.add(student);
                        }
                    }
                }else {
                    logger.error("获取学生列表失败");
                }
            }else {
                logger.error("获取老师信息失败");
            }
        } else {
            logger.error("获取学生信息失败");
        }
        return result;
    }

// 优化一把
public ArrayList<Student> getStudents(int uid){
        ArrayList<Student> result = new ArrayList<Student>();
        Student stu = getStudentByUid(uid);
        if (stu == null) {
            logger.error("获取学生信息失败");
            return result;
        }

        Teacher teacher = stu.getTeacher();
        if(teacher == null){
            logger.error("获取老师信息失败");
            return result;
        }

        ArrayList<Student> students = teacher.getStudents();
        if(students == null){
            logger.error("获取学生列表失败");
            return result;
        }

        for(Student student : students){
            if(student.getAge() > 18 && student.getGender() == MALE){
                result.add(student);
            }
        }
        return result;
    }

状态管理

1.代码中另外一种常见的if else是根据 状态返回不同业务, 如何状态处理具有公共性,这样的话我们可以把状态处理抽成一个公共的方法,


    function addUser(user){
    if(user.status == "isChild"){
       let flg = user.getMony;
       user.money = flg* user.xxxx
    } else if(user.status == "old"){
       let flg = user.getMony;
       user.money = flg* user.xxxx
    }

    // 把处理公共的抽成一个方法

    function getMoney(user){ return money};
    function allMoney (user){
    if(user.status == "isChild"){
       return getMoney(user);
    } else if(user.status == "old"){
       ureturn getMoney(user);
    }
    }

2.要是很复杂的就可以用面向对象的玩法,写个抽象类,每个具体的实现这个抽象类,就不存在if else(其实面向对象的打法,基本可以做到不用if else )


 public getSpeed(){
    switch(_type){
        case EUROPEAN:
            return getBaseSpeed();
        case AFRICAN:
            return getBaseSpeed()-getLoadFactor()*_numberOfCoconuts;
        case NORWEGIAN_BLUE:
            return (_isNailed)?0:getBaseSpeed(_voltage);
    }
}
 // 重构一把
 class Bird{
    abstract double getSpeed();
}

class European extends Bird{
    double getSpeed(){
        return getBaseSpeed();
    }
}

class African extends Bird{
    double getSpeed(){
        return getBaseSpeed()-getLoadFactor()*_numberOfCoconuts;
    }
}

class NorwegianBlue extends Bird{
    double getSpeed(){
        return (_isNailed)?0:getBaseSpeed(_voltage);
    }

这种打法伤筋动骨,一般用的少

以上就是自己体会,和从网上查找资料的一些总结,自己能学习学习,也希望能帮助到大家

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • ①密谋团协作管理# 0.密谋全体人员必备a.密谋团成员必须记住所有参与者名字b.积极与参与者沟通,让参与者更好的融...
    张大可ke阅读 1,349评论 0 0
  • 热油锅入蒜末、红泡椒、藕片翻炒,入蒜心细条、盐、鸡精翻炒出锅
    渡把阅读 139评论 0 0