小朋友,你是否有很多if-else

if-else代码优化的八种方案

背景

需求总是不断的接,代码不停地写,每次回过头来看自己的代码是否依旧能感到熟悉,还是陌生到需要从头梳理一遍逻辑?每次迭代中不断的修改更新自己或者同事的方法模块,是否能从中总结点什么?

今天分享一下 if-else 太多的代码该怎么优化的五种方案,事实上如果你心里有了这些方法,在编程的过程中就应该很好的应用进代码中,上线着急,开发时间短都不是接口,编码方式是一种习惯,这些习惯直接决定了你的编程风格,而不是开发后慢慢的优化修改成你的编码风格。

方案

一: 提前 return
这是 if-else 嵌套太多层的直接原因,提前 return 是解决太多代码嵌套的最有效的保障。

    //修改前
    public String shopping() {
        if (商品列表 != 空) {
            if (巧克力分类 != 空) {
                if (瑞士莲巧克力 != 空) {
                    return "瑞士莲巧克力";
                } else if (德芙巧克力 != 空) {
                    return "德芙巧克力";
                } else {
                    return "不想买了";
                }
            }
        }
        return "不想买了";
    }


    //修改后
    public String shopping() {
        if(商品列表==空){
            return "不想买了";
        }
        if(巧克力分类==空){
            return "不想买了";
        }
        if(瑞士莲巧克力!=空){
            return "瑞士莲巧克力";
        }
        if(德芙巧克力!=空){
            return "德芙巧克力";
        }
        return "不想买了";
    }

二: 条件表达式

有些代码的判断,可以使用一个条件表达式来协助判断,提升一下代码的阅读性,比如上方的四个if-else,虽然解决了嵌套太多的问题,但是迎来了新的问题,流水账式的代码太长,使用下列的条件表达式帮忙再优化一下

    public String shopping() {
        Boolean 有巧克力吗 = 商品列表 != 空 && 巧克力分类 != 空;
        if (!有巧克力吗) {
            return "不想买了";
        }
        if (瑞士莲巧克力 != 空) {
            return "瑞士莲巧克力";
        }
        if (德芙巧克力 != 空) {
            return "德芙巧克力";
        }
        return "不想买了";
    }


    public String shopping() {
        Boolean 有巧克力吗 = 商品列表 == 空 || 巧克力分类 == 空;
        if (!有巧克力吗) {
            return "不想买了";
        }
        if (瑞士莲巧克力 != 空) {
            return "瑞士莲巧克力";
        }
        if (德芙巧克力 != 空) {
            return "德芙巧克力";
        }
        return "不想买了";
    }

三: 拆方法

将上方的巧克力的判断逻辑拆出去,避免未来有更多的巧克力品牌判断增加更对的if-else,同时职责单一了当前方法,拆出的方法,其他模块也能公用

    public String shopping() {
        Boolean 有巧克力吗 = 商品列表 != 空 && 巧克力分类 != 空;
        if (!有巧克力吗) {
            return "不想买了";
        }
        return getChocolates(巧克力分类);
    }


    private String getChocolates(巧克力分类){
        if (瑞士莲巧克力 != 空) {
            return "瑞士莲巧克力";
        }
        if (德芙巧克力 != 空) {
            return "德芙巧克力";
        }
        return "不想买了";
    }

四: 三元运算符

有些代码的判断,还可以使用一个三元运算符来协助判断一下,比如上方的 getChocolates 方法

    private String getChocolates(巧克力分类){
        if (瑞士莲巧克力 == 空) {
            return 德芙巧克力 == 空 ? "不想买了" : 德芙巧克力;
        }
        return "瑞士莲巧克力";
    }

五: 使用枚举

    private String getChocolatesEnum(巧克力分类){
        return ChocolatesEnum.find(巧克力分类);
    }


    public enum ChocolatesEnum{
        LINDT(瑞士莲),MARSINC(德芙);

        ChocolatesEnum find(当前巧克力){
            fot(){
                if(当前巧克力 == 瑞士莲){
                    return 瑞士莲;
                }
                if(当前巧克力 == 德芙){
                    return 德芙;
                }
            }
            return "不想买了";
        }
    }

总结:还有很多比如 Optional、表驱动法、策略模式、模板方法等,在不同的场景使用不同的方式都能让代码的风格和阅读质量提升,实在不行,至少第一种方案要考虑用一下,至少阅读理解方便起来了,巧克力的例子不好再继续举例子了,先介绍到这里吧。