用直接删除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; }