陈旧语法密度之三——用直接删除else的方法消除if-else if-else

本文探讨了如何通过直接删除else来简化if-else if-else结构,指出在某些情况下,这样的简化是可行的,并强调不应盲目认为旧代码是良好的实践。此外,针对特殊情况,建议封装方法以避免代码重复并提高可维护性。

用直接删除else法消除if-else if-else

这几节先说一些简单的情况,在基本语法的层面,即使是仍然保持面向过程的编码,也能消除。

请看下面的代码:

public String getReversedOperator3() {

    if (operator.equals("=")) {
        return "!=";
    } else if (operator.equals("==")) {
        return "!=";
    } else if (operator.equals("!=")) {
        return "=";
    } else if (operator.equals("<")) {
        return "!<";
    } else if (operator.equals(">")) {
        return "!>";
    } else if (operator.equals("<=")) {
        return "!<=";
    } else if (operator.equals(">=")) {
        return "!>=";
    }
    return "?";
}

实际上,居然可以直接删除所有else,变成:

public String getReversedOperator4() {
    if (operator.equals("=")) {
        return "!=";
    }
    if (operator.equals("==")) {
        return "!=";
    }
    if (operator.equals("!=")) {
        return "=";
    }
    if (operator.equals("<")) {
        return "!<";
    }
    if (operator.equals(">")) {
        return "!>";
    }
    if (operator.equals("<=")) {
        return "!<=";
    }
    if (operator.equals(">=")) {
        return "!>=";
    }
    return "?";
}

有人可能会说:“我怎么可能犯这种低级错误!”且慢,请先在自己项目的代码中搜索一下else if再说吧。这种情况在我所看的代码中数量庞大,大约10%~20%的else(包括下面的变形)都可以如此兵不血刃地删除掉。

下面则是一种类似的变形:

public String getReversedOperator1() {
    String reversedOperator = null;
    if (operator.equals("=")) {
        reversedOperator = "!=";
    } else if (operator.equals("==")) {
        reversedOperator = "!=";
    } else if (operator.equals("!=")) {
        reversedOperator = "=";
    } else if (operator.equals("<")) {
        reversedOperator = "!<";
    } else if (operator.equals(">")) {
        reversedOperator = "!>";
    } else if (operator.equals("<=")) {
        reversedOperator = "!<=";
    } else if (operator.equals(">=")) {
        reversedOperator = "!>=";
    } else {
        reversedOperator = "?";
    };
    return reversedOperator;
}

又有人会说:“这个else没什么大问题,删不删都可以。”这时候我们要回到代码刚开始写的那一天:如果有人实际上写了第二种没有else的代码,我们是否会执意在上面加上个else变成第一种呢?当然不会。

弯路走多了,有时候连直路都不认识了,这才是问题的关键。

所以这本来是一篇如何不写else的文章,因为世间else写的太多了,才变成了删else的文章。

可以因为旧代码没有修改的价值了因此而不修改,但千万不要认为旧代码是好的。否则未来还会继续照样写。

当然在实际的环境中,我们会把他们都删光,否则很难识别未来是否又多了任何else代码。这种态度很像人类对待老鼠、苍蝇、蟑螂的态度:99.999%的上述所谓害虫实际上都不带有致命的病菌,但没有人真的去识别哪只害虫身上可能有病。

一种特殊情况

“如果前面的例子不直接return怎么办?”

这个时候最好封装一个方法,直接给return掉;然后在任何需要这个分支的地方调用这个方法而非拷贝这段if-else if-else代码。否则很快就会遇到最早我们提到的那个问题了:(当我们维护的时候)居然没有一种简单方法确定性地找到所有用过某个分支的地方。

“我拷贝的代码,当然一模一样!怎么会找不到……咦,谁手这么贱,在else  if 中间放了两个空格!”

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值