快速业务通道

诊断Java代码: Impostor Type错误模式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19

诊断Java代码: Impostor Type错误模式

时间:2011-02-12 IBM Eric E. Allen

当使用字段中特殊的标记来区别对象类型时,可能会产生标记对相关数据误贴标签的错误 ― 通称为 Impostor Type 错误模式。在诊断 Java 代码的这一部分中,Eric Allen 对这个错误的症状和起因进行了分析,详细说明了预防错误发生的方法,并讨论了一种吸引人的混合实现方法,这种方法不使用 impostor type,但最后,还是有很多相同的缺点产生。请在 讨论论坛与作者及其他读者分享您对本文的看法。

程序中除了最无关紧要的部分外都要对某些数据类型进行操作。静态类型系统提供了一种方法,它能够确保程序不会对给定类型的数据进行不当的操作。Java 语言的优点之一是严格的区分类型,所以在程序运行前已消除了类型错误。作为开发人员,我们可以使用这个类型系统提供更健壮且没有错误的代码。然而,我们却常常没有让类型系统发挥出最大的潜力。

Impostor Type 错误模式

很多程序可以更多地使用静态类型系统,但它们没有这样做,而是依赖包含区别数据类型标记的特殊字段。

依靠这些特殊字段区别数据类型,这样的程序放弃了类型系统专门提供给它们的保护措施。当这些标记中的一个对它的数据误贴了标签,就会产生我称之为 Impostor Type的错误。

症状

impostor type 错误的一种常见症状是很多概念上不同类型的数据都被同样(并且错误)的方式处理。另一常见症状是数据与任何指定的类型都不匹配。

首要规则是,只要当概念上的数据类型和它被程序处理的方法不匹配,就可以怀疑是否发生了这个模式的错误。

为说明引入这种模式的错误是多么的轻而易举,让我们来考虑一个简单的示例。假设我们需要处理各种各样的欧几里得几何学形状,如圆形、正方形等等。这些几何形状没有坐标,但含有一个 scale 变量,所以可以计算它们的面积。

清单 1. 用 imposter type 实现各种几何形状

public class Form {    String shape;    double scale;    public Form(String _shape, double _scale) {      this.shape = _shape;      this.scale = _scale;    }    public double getArea() {      if (shape.equals("square")) {        return scale * scale;      }      else if (shape.equals("circle")) {        return Math.PI * scale * scale;      }      else { // shape.equals("triangle"), an equilateral triangle        return scale * (scale * Math.sqrt(3) / 4);      }    } }

诊断Java代码: Impostor Type错误模式(2)

时间:2011-02-12 IBM Eric E. Allen

尽管您会发现人们经常这么做,但用这种方法实现几何形状还是存在严重缺点。

最显著的缺点之一是这个方法不能真正的扩展。如果要为我们的 form 引入一个新的几何形状(比如,“五边形”),我们必须进入并修改 getArea() 方法的源代码。不过可扩展性是个独立的考虑因素;在本文中,我们把重点放在实现几何形状所造成的错误的易受性上。我会在以后的文章中回到关于可扩展性的问题上来。

如果我们在程序其它部分构造了一个新的 Form 对象,如下所示,请考虑将会发生什么情况:

清单 2. 构造一个新的 form

Form f = new Form("sqaure", 2);

当然,“square”被拼错了,但是编译器认为,这是完全合法的代码。

现在考虑一下,当我们试图对新的 Form 对象调用,比如说 getArea() 方法时发生什么情况。因为 Form 对象中的几何形状与 if-then-else代码块中的任一测试的几何形状都不匹配,它的面积将在 else分句中被计算,好像它是个三角形似的!

这里将不

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号