代码的坏味道(3)——基本类型偏执(Primitive Obsession)
坏味道——基本类型偏执(Primitive Obsession)
特征
- 使用基本类型而不是小对象来实现简单任务(例如货币、范围、电话号码字符串等)。
- 使用常量编码信息(例如一个用于引用管理员权限的常量
USER_ADMIN_ROLE = 1)。- 使用字符串常量作为字段名在数组中使用。

问题原因
类似其他大部分坏味道,基本类型偏执诞生于类初建的时候。一开始,可能只是不多的字段,随着表示的特性越来越多,基本数据类型字段也越来越多。
基本类型常常被用于表示模型的类型。你有一组数字或字符串用来表示某个实体。
还有一个场景:在模拟场景,大量的字符串常量被用于数组的索引。
解决方法

大多数编程语言都支持基本数据类型和结构类型(类、结构体等)。结构类型允许程序员将基本数据类型组织起来,以代表某一事物的模型。
基本数据类型可以看成是机构类型的积木块。当基本数据类型数量成规模后,将它们有组织地结合起来,可以更方便的管理这些数据。
- 如果你有大量的基本数据类型字段,就有可能将其中部分存在逻辑联系的字段组织起来,形成一个类。更进一步的是,将与这些数据有关联的方法也一并移入类中。为了实现这个目标,可以尝试
以类取代类型码(Replace Type Code with Class)。 - 如果基本数据类型字段的值是用于方法的参数,可以使用
引入参数对象(Introduce Parameter Object)或保持对象完整(Preserve Whole Object)。 - 如果想要替换的数据值是类型码,而它并不影响行为,则可以运用
以类取代类型码(Replace Type Code with Class)将它替换掉。如果你有与类型码相关的条件表达式,可运用以子类取代类型码(Replace Type Code with Subclass)或以状态/策略模式取代类型码(Replace Type Code with State/Strategy)加以处理。 - 如果你发现自己正从数组中挑选数据,可运用
以对象取代数组(Replace Array with Object)。
收益
- 多亏了使用对象替代基本数据类型,使得代码变得更加灵活。
- 代码变得更加易读和更加有组织。特殊数据可以集中进行操作,而不像之前那样分散。不用再猜测这些陌生的常量的意义以及它们为什么在数组中。
- 更容易发现重复代码。

重构方法说明
以类取代类型码(Replace Type Code with Class)
问题
类之中有一个数值类型码,但它并不影响类的行为。

解决
以一个新的类替换该数值类型码。

引入参数对象(Introduce Parameter Object)
问题
某些参数总是很自然地同时出现。

解决
以一个对象来取代这些参数。

保持对象完整(Preserve Whole Object)
问题
你从某个对象中取出若干值,将它们作为某一次函数调用时的参数。
int low = daysTempRange.getLow();
int high = daysTempRange.getHigh();
boolean withinPlan = plan.withinRange(low, high);
解决
改为传递整个对象。
boolean withinPlan = plan.withinRange(daysTempRange);
以子类取代类型码(Replace Type Code with Subclass)
问题
你有一个不可变的类型码,它会影响类的行为。

解决
以子类取代这个类型码。

以状态/策略模式取代类型码(Replace Type Code with State/Strategy)
问题
你有一个类型码,它会影响类的行为,但你无法通过继承消除它。

解决
以状态对象取代类型码。

以对象取代数组(Replace Array with Object)
问题
你有一个数组,其中的元素各自代表不同的东西。
String[] row = new String[3];
row[0] = "Liverpool";
row[1] = "15";
解决
以对象替换数组。对于数组中的每个元素,以一个字段来表示。
Performance row = new Performance();
row.setName("Liverpool");
row.setWins("15");
引申阅读
欢迎继续阅读 代码的症与药 系列文章。
代码的坏味道(3)——基本类型偏执(Primitive Obsession)的更多相关文章
- Refactoring之——代码的坏味道(二)过大的类 &(三)基本类型偏执
1.1.2 Large Class(过大的类) 特征:一个类包含过多的字段.方法.代码行. 问题原因: 类通常一开始很小,但是随着程序的增长而逐渐膨胀. 类似于过长方法,程序员通常觉得在一个现存类中添 ...
- Bad Smell (代码的坏味道)
sourcemaking 如果一段代码是不稳定或者有一些潜在问题的,那么代码往往会包含一些明显的痕迹.正如食物要腐坏之前,经常会发出一些异味一样, 我们管这些痕迹叫做 "代码异味" ...
- Refactoring之——代码的坏味道(一)过长方法
1 代码的坏味道 重构一书中提到了22种代码的坏味道,大致可以分为几类. 识别代码的坏味道,有助于发现代码的潜在问题,从而可以有的放矢的修改现有代码,使之不断完善. 1.1 Bloaters(臭鲱,暂 ...
- 消灭 Java 代码的“坏味道”
消灭 Java 代码的“坏味道” 原创: 王超 阿里巴巴中间件 昨天 导读 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层.着实用功,便见道无终穷,愈 ...
- 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)
膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...
- 重构 之 总结代码的坏味道 Bad Smell (一) 重复代码 过长函数 过大的类 过长参数列 发散式变化 霰弹式修改
膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...
- Chapter 3 :代码的坏味道
"如果尿布臭了,就换掉它." --Beck奶奶,论保持小孩清洁的哲学 代码的坏味道这一章集中论述该何时重构.具体的重构方法在后面的章节. "没有任何度量规矩比得上见识广博 ...
- 代码的坏味道(16)——纯稚的数据类(Data Class)
坏味道--纯稚的数据类(Data Class) 特征 纯稚的数据类(Data Class) 指的是只包含字段和访问它们的getter和setter函数的类.这些仅仅是供其他类使用的数据容器.这些类不包 ...
- 代码的坏味道(10)——发散式变化(Divergent Change)
坏味道--发散式变化(Divergent Change) 发散式变化(Divergent Change) 类似于 霰弹式修改(Shotgun Surgery) ,但实际上完全不同.发散式变化(Dive ...
随机推荐
- TestNG Assert 详解
org.testng.Assert 用来校验接口测试的结果,那么它提供哪些方法呢? 中心为Assert测试类,一级节点为方法例如assertEquals,二级结点为参数类型及参数个数,double 3 ...
- Oracle like查询
查询方式:LIKE '%xx%' 普通: SELECT * FROM TABLE T WHERE T.COLUNM LIKE '%xx%' 优化:使用 INSTR SELECT * FROM TABL ...
- 下载判断Android和iOS
//下载 function down(){ var url = ''; var u = navigator.userAgent, app = navigator.appVersion; var isA ...
- es6入门教程完整版
ECMAScript 6入门 <ECMAScript 6入门>是一本开源的JavaScript语言教程,全面介绍ECMAScript 6新引入的语法特性. 作者:阮一峰 授权:署名-非商用 ...
- 学习笔记:因为java匿名类学习到接口的一些小用法
在看CometD的示例代码时发现了许多有意思的代码,但说实话看别人的代码确实是件很累的事情,所以就看到这个知识点做一下记录吧. 先看一段代码: 代码1 这段代码中有一个new的操作,而且是在方 ...
- NodeJS入门(五)—— process对象
process对象用于处理与当前进程相关的事情,它是一个全局对象,可以在任何地方直接访问到它而无需引入额外模块. 它是 EventEmitter 的一个实例. 本章的示例可以从我的Github上下载到 ...
- MySQL 基础及性能优化工具
数据库,用户及权限 常用用户管理操作 # 创建本地用户 abc create user abc@localhost # 创建内网能够访问的用户 abc create user abc@'192.168 ...
- Linux 配置YUM
标签:MYSQL/linux 概述 文章主要介绍配置163,mysql,epel这三个yum源. 目录 概述 步骤 下载安装包 卸载自带的yum 安装yum包 添加yum 总结 步骤 安装163源 注 ...
- X509 证书生成
X509证书介绍X.509 是由国际电信联盟(ITU-T)制定的数字证书标准,相信这是人尽皆知的了,目前X.509证书据我所知有三个版本,.net中使用的是x.509-2,X.509-2 版引入了主体 ...
- iOS-SDWebimage底层实现原理
其实有些框架的实现原理,并没有想象中那么难,思想也很简单,主要是更新第三方框架的作者对自己写的代码,进行了多层封装,使代码的可读性降低,也就使得框架看起来比较难.我来实现以下SDWebimage的的曾 ...