坏味道——数据泥团(Data Clumps)
特征
有时,代码的不同部分包含相同的变量组(例如用于连接到数据库的参数)。这些绑在一起出现的数据应该拥有自己的对象。
问题原因
通常,数据泥团的出现时因为糟糕的编程结构或“复制-粘贴式编程”。
有一个判断是否是数据泥团的好办法:删掉众多数据中的一项。这么做,其他数据有没有因而失去意义?如果它们不再有意义,这就是个明确的信号:你应该为它们产生一个新的对象。
解决方法
- 首先找出这些数据以字段形式出现的地方,运用
提炼类(Extract Class)
将它们提炼到一个独立对象中。 - 如果数据泥团在函数的参数列中出现,运用
引入参数对象(Introduce Parameter Object)
将它们组织成一个类。 - 如果数据泥团的部分数据出现在其他函数中,考虑运用
保持对象完整(Preserve Whole Object)
将整个数据对象传入到函数中。 - 检视一下使用这些字段的代码,也许,将它们移入一个数据类是个不错的主意。
收益
- 提高代码易读性和组织性。对于特殊数据的操作,可以集中进行处理,而不像以前那样分散。
- 减少代码量。
何时忽略
- 有时为了对象中的部分数据而将整个对象作为参数传递给函数,可能会产生让两个类之间不收欢迎的依赖关系,这中情况下可以不传递整个对象。
重构方法说明
提炼类(Extract 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);
引申阅读
欢迎继续阅读 代码的症与药 系列文章。