1 符号和症状

  • 用原始类型代替小对象,用于简单任务(如货币、范围、用作电话号码的特别字符串,等等)。
  • 使用常量编码信息(如使用常量USER_ADMIN_ROLE=1来指代具有管理员权限的用户)。
  • 在数据数组中用字符串常量作为字段名。
    04 代码坏味之肿胀-3:原语强迫症 - 图1

    2 问题的根源

    与其他代码坏味已有,原始强迫症来源于片刻的虚弱。不过是一个存储数据的字段:创建一个原始字段比创建一个全新的类简单多了。这样,加入了一个原始字段,然后需要另一个字段,也加入了。最终,类变得很大。
    原始类型常用于模拟类型。不是使用单独的数据类型,而是用一组数值或者字符串,形成可用值或者某些实体的列表。这些数值和字符串通常成为常量,被赋予容易理解的名字,从而广泛传播。
    另一种情况是字段模拟。类含有大量不同的数据,把字符串常量(特定于这个类)用作数组下标。

    3 治疗

  • 如果有大量原始字段,可能应该把一些字段逻辑地组织到类中。如果把与这些字段相关的行为也移动到类中,就更好了。试试用对象代替数据值
    04 代码坏味之肿胀-3:原语强迫症 - 图2

  • 如果原始字段的值在方法参数中使用,试试引入参数对象,或者保存整个对象
  • 用变量编码复杂的数据时,试试用类替代类型编码用子类替代类型编码用状态/策略替代类型编码
  • 如果变量中有数组,试试用对象替代数组
    04 代码坏味之肿胀-3:原语强迫症 - 图3

    4 收益

  • 使用对象替代原始类型,代码变得更灵活。

  • 更容易理解和组织的代码。对特定数据的操作代码在同一个地方,而不是分散在多处。不必猜测为什么数组中有这么多奇怪的常量。
  • 更容易发现重复的代码。