`

类层次优于标签类

 
阅读更多

有时候,可能会遇到带有两个甚至更多风格的实例的类,并包含表示实例风格的标签(tag)域。
Demo:

 

[java] view plain copy
 
  1. // Tagged class - vastly inferior to a class hierarchy!  
  2. class Figure {  
  3.     enum Shape { RECTANGLE, CIRCLE };  
  4.   
  5.     // Tag field - the shape of this figure  
  6.     final Shape shape;  
  7.   
  8.     // These fields are used only if shape is RECTANGLE  
  9.     double length;  
  10.     double width;  
  11.   
  12.     // This field is used only if shape is CIRCLE  
  13.     double radius;  
  14.   
  15.     // Constructor for circle  
  16.     Figure(double radius) {  
  17.         shape = Shape.CIRCLE;  
  18.         this.radius = radius;  
  19.     }  
  20.   
  21.     // Constructor for rectangle  
  22.     Figure(double length, double width) {  
  23.         shape = Shape.RECTANGLE;  
  24.         this.length = length;  
  25.         this.width = width;  
  26.     }  
  27.   
  28.     double area() {  
  29.         switch(shape) {  
  30.           case RECTANGLE:  
  31.             return length * width;  
  32.           case CIRCLE:  
  33.             return Math.PI * (radius * radius);  
  34.           default:  
  35.             throw new AssertionError();  
  36.         }  
  37.     }  
  38. }  

这些标签类(tagged class)有着许多优点,但是破坏了可读性。
标签类过于冗长、容易出错,并且效率低下。

表示多种风格对象的数据类型:子类型化(subtyping)。标签类正是类层次的一种简单的仿效。
Demo:

[java] view plain copy
 
  1. // Class hierarchy replacement for a tagged class  
  2. abstract class Figure {  
  3.     abstract double area();  
  4. }  
  5. class Circle extends Figure {  
  6.     final double radius;  
  7.   
  8.     Circle(double radius) { this.radius = radius; }  
  9.   
  10.     double area() { return Math.PI * (radius * radius); }  
  11. }  
  12. class Rectangle extends Figure {  
  13.     final double length;  
  14.     final double width;  
  15.   
  16.     Rectangle(double length, double width) {  
  17.         this.length = length;  
  18.         this.width  = width;  
  19.     }  
  20.     double area() { return length * width; }  
  21. }  
  22. class Square extends Rectangle {  
  23.     Square(double side) {  
  24.         super(side, side);  
  25.     }  
  26. }  


标签类很少有适用的时候。当你想要编写一个包含显示标签域类时,应该考虑一下,这个标签是否可以被取消,这个类是否可以用类层次来代替。当你遇到一个包含标签与的现有类时,就要考虑将它重构到一个层次结构中去。

分享到:
评论

相关推荐

    论文研究-最大熵模型在邮件分类中的应用.pdf

    邮件分类是指在给定的分类...充分利用邮件各字段信息,取得的总体分类效果最好,但对合法邮件,利用邮件头及邮件标题却取得了最好结果,并在层次分类中验证了这点,层次分类效果要优于平面分类。最后进行了总结和展望。

    基于多层次特征提取的胶囊网络文本分类研究.docx

    文本分类的应用场景非常广泛,涵盖自动标签、情感分析、垃圾邮件过滤、垃圾评论过滤等任何需要自动归档文本的场合。近年来,深度学习利用词向量的分布式表示构建模型的输入,主流的深度学习模型,如卷积神经网络和...

    基于层次架构的WSN标签寻址技术研究 (2013年)

    针对基于地址的寻址方式无法满足以业务为中心的大规模无线传感器网络(WSN)寻址要求的问题,提出了一种适合大规模异构WSN的层次架构和基于该架构的一种标签寻址( LBA)机制。LBA寻址机制将不同业务类型进行编码从而形成...

    论文研究-基于层级成长单元结构算法的虚拟实践社区知识地图的构建.pdf

    该方法首先改进了成长单元结构算法,利用层级成长单元结构算法对社区内的知识对象进行聚类,然后基于标签自组织映射算法自动确定出每一类所代表的主题,构造出层级知识地图.实验结果表明,所提出方法的聚类效果要优于...

    论文研究-改进的.pdf

    提出一种标签与路径相结合的XML文档向量模型,基于这个模型,首先对原始文档集进行多次抽样,在新文档集上进行K均值聚类,然后对得到的聚类中心集合进行层次聚类。在人工数据集和真实数据集上的实验表明,该算法在...

    论文研究-基于LSPI索引的不确定XML查询处理算法.pdf

    针对目前已有XML通配符查询处理需将文档中所有元素标签读入内存中,匹配效率低的问题,提出一种新的基于LSPI(leaf sibling of path information)索引的不确定XML包含通配符和复杂谓词的查询处理算法Prob-...

    人工智能导论-第二课人工神经网络.ppt

    深度学习是高度数据依赖型的算法,它的性能通常随着数据量的增加而不断增强,它的可扩展性(Scalability)显著优于传统的机器学习算法。 机器学习可以分为监督学习、非监督学习和半监督学习三类。监督学习是指从有...

    uwb室内定位系统详解.doc

    UWB 室内定位系统使用 UWB 定位技术,通过 TDOA 到达时间差的算法实现三维定位,定位精度优于 30cm,单区域支持多于 1000/秒的定位标签,精度高,容量大。高精度室定位系统应用软件支持 PC 端和移动端访问,并提供...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例154 按继承层次对类排序 201 实例155 查看内部类信息 202 7.2 反射的进阶 203 实例156 动态设置类的私有域 203 实例157 动态调用类中的方法 204 实例158 动态实例化类 205 实例159 创建长度可变的数组 206 实例...

    基于LSPI索引的不确定XML查询处理算法 (2014年)

    针对目前已有XML通配符查询处理需将文档中所有元素标签读入内存中,匹配效率低的问题,提出一种新的基于LSPI(leaf sibling of path information)索引的不确定XML包含通配符和复杂谓词的查询处理算法Prob-...

    Facebook AI实验室开源的相似性搜索库Faiss.zip

    尽管 GPU 擅长数据并行任务,但之前的方法要么会在并行性不高的算法(如 k-min selection)上遭遇瓶颈,要么不能有效利用内存的层次结构。为此雷锋网了解到,他们提出一种可用于k-selection的新设计,使其能以高达...

Global site tag (gtag.js) - Google Analytics