“坏”代码是怎么生成的(2)

今天接着改bug,先看下面一段代码:

1 public bool IsApple(string fruitName)
2 {
3   return !fruitName.Contains("Orange") && !fruitName.Contains("Banana");
4 }

什么什么?不是橘子也不是香蕉的水果就是苹果?小孩子也知道这个逻辑有问题。但是,在我们的代码中却真实存在这样的逻辑。要判断某个对象是否属于某种类型时,不是直接判断其是否具有某种属性,而是通过“排除法”来判定。

为什么会出现这样的代码?在最初的代码里,程序只需要处理Apple和Orange两类水果,所以程序员A写出了如下代码:

1 public bool IsApple(string fruitName)
2 {
3   return !fruitName.Contains("Orange");
4 }

过了一段时间,需求有了变化,程序需要处理Banana。此时程序员B发现函数IsApple()存在问题,于是将它更新成了代码片断1的那个样子。

如果程序员A将最初的代码写成如下:

1 public bool IsApple(string fruitName)
2 {
3   return fruitName.Contains("Apple");
4 }

这样的话程序员B就不会在这段代码基础上画蛇添足了。

再进一步,如果程序员A考虑到,为什么要通过一个名字fruitName来判断其类型呢?将Apple实现成Fruit的子类,以后需求变化需要支持Orange, Banana时再添加对应的子类不就可以了吗?

原文地址:https://www.cnblogs.com/susy/p/1926866.html