本文共 2319 字,大约阅读时间需要 7 分钟。
这几节先说一些简单的情况,在基本语法的层面,即使是仍然保持面向过程的编码,也能消除。
请看下面的代码:
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 中间放了两个空格!”
转载地址:http://otbob.baihongyu.com/