else { // shape.equals("triangle"), an equilateral triangle
return scale * (scale * Math.sqrt(3) / 4);
}
}
}
尽管您会发现人们经常这么做,但用这种方法实现几何外形还是存在严重缺点。
最显著的缺点之一是这个方法不能真正的扩展。假如要为我们的 form 引入一个新的几何外形(比如,“五边形”),我们必须进入并修改 getArea() 方法的源代码。不过可扩展性是个独立的考虑因素;在本文中,我们把重点放在实现几何外形所造成的错误的易受性上。我会在以后的文章中回到关于可扩展性的问题上来。
假如我们在程序其它部分构造了一个新的 Form 对象,如下所示,请考虑将会发生什么情况:
清单 2. 构造一个新的 form
Form f = new Form("sqaure", 2);
当然,“square”被拼错了,但是编译器认为,这是完全合法的代码。
现在考虑一下,当我们试图对新的 Form 对象调用,比如说 getArea() 方法时发生什么情况。因为 Form 对象中的几何外形与 if-then-else 代码块中的任一测试的几何外形都不匹配,它的面积将在 else 分句中被计算,似乎它是个三角形似的!