用直接删除switch case的方法消除switch case
以下的代码的代码看似极具娱乐性,然而却都是真实案例。
第一个案例来自于2001年左右的一个C++产品,给人印象如此之深,以致于十多年来记忆几乎分毫不差:
public int returnN(int n) {
switch (n) {
case 1: return 1;
case 2: return 1;
case 3: return 1;
case 4: return 1;
case 5: return 1;
case 6: return 1;
default: return n;
}
}
下面是一个看似有点差别的例子,但实际上是一回事。此案例发现于2017年的一个Java代码中:
public int functionN(int n) {
int result = 0;
switch (n) {
case 1:
result = function(1);
break;
case 2:
result = function(2);
break;
case 3:
result = function(3);
break;
case 4:
result = function(4);
break;
case 5:
result = function(5);
break;
case 6:
result = function(6);
break;
default: result = function(n);
}
return result;
}
下面的例子同样来自2017年的一个Java代码。虽然是用if-else if-else实现的,却有“异曲同工之妙”:
public List<String> totalList(List<String> listLeft, List<String> listRight) {
List<String> listAll = new ArrayList<>();
if (!listLeft.isEmpty() && !listRight.isEmpty()) {
listAll.addAll(listLeft);
listAll.addAll(listRight);
} else if (!listLeft.isEmpty() && listRight.isEmpty()) {
listAll.addAll(listLeft);
} else {
listAll.addAll(listRight);
}
return listAll;
}
提示:上述代码中的if-else结构实际只需要两行代码,而且这两行代码本来就已经写在里边了。
这个案例是企业团队自己提供给我的,因为我当时“夸下海口”说任何else都是可以被删除的(实际上尽管不断受到各种挑战,迄今为止仍然没有else存活的特例)。当我看了足足一分钟尝试确认里边的逻辑的时候(之所以花费这么多时间,一则代码差别细微令人眼花缭乱,二则当时觉得既然用这么多代码而非两行代码,一定有其妙用),团队甚至自豪地说“我们的业务是很复杂的,不是那么容易看懂的……”
为何专业人士开发的代码,围观的整个团队都感觉在正常不过了,却会在几秒钟内被外行看出破绽?
人们常说:“美无处不在,只是缺少发现美的眼睛”。实际上反过来说也很有道理:
“垃圾代码无处不在,只是缺少发现垃圾代码的眼睛。”
若以憎恶的眼光审视所有switch case, if-else if-else,甚至是单个if-else,会发现每一处都存在或大或小的问题。即使在那些无关痛痒的地方,删除之前至少不会比删除之后的代码好。比如下面这个几乎每个产品中都有不止一处的例子:
if (value == true) {
return true;
} else {
return false;
}