美文网首页
类层次由于标签类

类层次由于标签类

作者: 没走过的二丁目 | 来源:发表于2018-06-06 15:59 被阅读0次

有时候,可能会遇到带有两种甚至更多种分格的实例的类,并包含标识实例分格的标签域,举个栗子

public class Figure{
    enum Shape {
        RECTANGLE,
        CIRCLE
    }
     
    // Tag field - the shape of this figure
    final Shape shape;
     
    // These field are use only if shape if RECTANGLE
    double length;
    double width;
     
    // This field is use only if shape is CIRCLE
    double radius;
     
    // Constructor for circle
    public Figure(double radius) {
        shape = Shape.CIRCLE;
        this.radius = radius;
    }
     
    // Constructor for rectangle
    public Figure(double length, double width) {
        shape = Shape.RECTANGLE;
        this.length = length;
        this.width = width;
    }
     
    double area() {
        switch (shape) {
        case RECTANGLE:
            return length * width;
        case CIRCLE:
            return Math.PI * (radius * radius);
        default:
            throw new AssertionError();
        }
    }
}

这样的标签类有许多缺点,充斥着样板代码,包括枚举,标签域以及条件语句。由于多个乱七八糟的实现挤在了一个类中,破坏了可读性。一句话总结标签类过于冗长,容易出错,并且效率低下。

好的处理方法——子类化类型

为了将标签类转化成类层次,首先要为标签类中的每个方法都定义一个包含抽象方法的抽象类。在上述类中只有一个这样的方法area。这个抽象类是类层次的根,看代码

abstract class Figure {
    abstract double area();
}

class Circle extends Figure {
    final double radius;
    Circle(double radius) {
        this.radius = radius;
    }
    double area() {
        return Math.PI * radius * radius;
    }
}

class Rectangle extends Figure {
    final double length;
    final double width;
    Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }
    double area() {
        return length * width;
    }
}

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

相关文章

  • 类层次由于标签类

    有时候,可能会遇到带有两种甚至更多种分格的实例的类,并包含标识实例分格的标签域,举个栗子 这样的标签类有许多缺点,...

  • 第 23 条:类层次优先与标签类

    标签类 类层次

  • 提示二十三

    今天来看提示二十三: 类层次优于标签类。 作者使用了Figure的例子说明了标签类是那种拥有多种风格实例,通过标签...

  • 类层次优先于标签类

    这种标签类的缺点 职责不唯一 可读性差 内存占用增加了 不能将length、width 、radius域设置为fi...

  • 无标题文章

    聚类方法整理 标签(空格分隔): 算法学习 聚类算法大类 1. K-Mean 2. 层次聚类算法 3. SOM聚类...

  • 数据挖掘

    数据立方体,最小内存计算 层次聚类 首先介绍聚类中的层次聚类算法。层次法又分为凝聚的层次聚类和分裂的层次聚类。 凝...

  • Kmeans笔记

    训练过程中,没有标签,属于无监督学习。 层次聚类有包含关系,非层次聚类没有包含关系 举个例子:外部评价方法:有1亿...

  • R 实现聚类分析_07Jul2020

    聚类分析 层次聚类 kmeans 使用eclust进行kmeans聚类或层次聚类

  • 类标签

    header(页眉) Banner轮播 footer(页尾) nav(导航) article(独立的文章内容) s...

  • 11 聚类算法 - 密度聚类 - DBSCAN、MDCA

    09 聚类算法 - 层次聚类10 聚类算法 - 代码案例四 - 层次聚类(BIRCH)算法参数比较 七、密度聚类概...

网友评论

      本文标题:类层次由于标签类

      本文链接:https://www.haomeiwen.com/subject/oudmsftx.html