今天来看提示二十三: 类层次优于标签类。
作者使用了Figure的例子说明了标签类是那种拥有多种风格实例,通过标签来指明实例的风格。
这种标签类有着许多缺点:
- 它们中充斥着样板代码,包括枚举声明,标签域以及条件语句。由于许多个实现乱七八糟的挤在了单个类中,破坏了可读性。
- 内存占用也增加了,因为实例承担了属于其他风格的不相关的域。
- 域也不能做成final类型的,除非构造器初始化了不相关的域,产生了更多的样板代码。构造器必须不借助编译器,来设置标签域,并且初始化正确的数据域;如果初始化了错误的域,程序就会在运行的时候出错。
- 无法给标签类添加风格,除非可以修改源文件,如果一定要添加风格,就必须给每个条件语句都添加一个条件,否则就会在运行的时候失败。
- 最后,实例的数据类型没有提供任何关于其风格的线索。
作者认为针对这种情况,我们应该使用子类化来解决。每次遇到标签类的时候我们都可以尝试用子类化来替代,这样更能反映类型之间的自然层次关系,提高了灵活性。
刚刚读完我感觉标签类很蠢,既然有这么多缺点,为什么还有人要用它。但是我仔细思考我们系统中,确实还是有一些标签类在使用,比如我们经常能想到的Order,比如之前提到的FeedbackTriggerInfo,比如SendWxMpNotificationRequest。很多地方都有他们的身影,就是因为这样使用比较简单,修改起来也比较容易,多一个类型就多加个标签。当然我不是说这样做很好,我想如果只是一些简单的判断是不是也不用一棍子打死,并不是所有用了标签类的地方都必须要改掉。
标签类
网友评论