圣诞大减价开始了!

用类替换类型代码

什么是类型代码?当您拥有一组数字或字符串,而不是单独的数据类型时,类型代码就会出现,这些数字或字符串构成了某些实体的允许值列表。通常这些特定的数字和字符串通过常量被赋予可理解的名称,这就是为什么这种类型代码会遇到这么多的原因。

问题

类有一个包含类型代码的字段。这种类型的值不用于运算符条件,也不影响程序的行为。

解决方案

创建一个新类,并使用它的对象而不是类型代码值。

之前
用类前替换类型代码
用类后替换类型代码

为什么重构

使用类型代码的最常见原因之一是使用数据库,当数据库的字段中一些复杂的概念用数字或字符串编码时。

例如,你有一门课用户在这个领域user_role,其中包含关于每个用户(管理员、编辑人员或普通用户)的访问权限的信息。在本例中,这个信息在字段中被编码为一个E,U分别。

这种方法的缺点是什么?字段设置器通常不检查发送了哪个值,当有人向这些字段发送非预期的或错误的值时,可能会导致大问题。

此外,对于这些字段,类型验证是不可能的。可以向它们发送任何数字或字符串,IDE不会检查这些数字或字符串的类型,甚至允许程序运行(稍后崩溃)。

好处

  • 我们希望将基本值集(即编码类型)转换为成熟的类,并具有面向对象编程所提供的所有好处。

  • 通过用类替换类型代码,我们允许在编程语言级别上对传递给方法和字段的值进行类型提示。

    例如,当一个值传递给一个方法时,编译器以前看不到数值常量和某个任意数字之间的区别,而现在当传递不符合指定类型类的数据时,您会在IDE内部收到错误警告。

  • 因此,我们可以将代码移动到该类型的类中。如果您需要在整个程序中对类型值执行复杂的操作,那么现在这段代码可以“驻留”在一个或多个类型类中。

什么时候不用

如果在控制流结构中使用编码类型的值(如果开关,等等)和控制类行为,你应该对类型代码使用两种重构技术之一:

如何重构

  1. 创建一个新类,并赋予它一个与编码类型的目的相对应的新名称。这里我们称之为类型的类

  2. 将包含类型代码的字段复制到类型的类而且要保密。然后为该字段创建一个getter。只能从构造函数中为该字段设置值。

  3. 对于编码类型的每个值,在中创建静态方法类型的类.它会创建一个新的类型的类与编码类型的此值对应的。

  4. 在原始类中,将编码字段的类型替换为类型的类.在构造函数和字段setter中创建该类型的新对象。更改字段getter,以便它调用类型的类getter。

  5. 将所有提到的编码类型的值替换为相关的调用类型的类静态方法。

  6. 从原始类中删除编码的类型常量。

Baidu
map