首页/开发/代码质量与评审速查/坏味道:数据泥团(Data Clumps)
重构手法62 条

坏味道:数据泥团(Data Clumps)

多个字段或参数总是一起出现(开始/结束时间、经纬度成对出现):用 Extract Class 或 Introduce Parameter Object 合并为类型,并顺手消除重复校验逻辑。

什么是数据泥团

数据泥团指两三个字段或参数总是一起出现:开始与结束时间、经纬度、主机与端口。它们往往还共享同一套判空与校验逻辑,被复制到多个地方。处方是用提取类或引入参数对象把它们合并成一个类型,并顺手把重复的校验搬进新类型,既缩短参数列表,也减少遗漏机会。

基本信息

典型信号两个以上字段总是同行出现,判空与校验逻辑重复
处方提取类 / 引入参数对象
收益参数列表变短,校验与格式化有了归属
相邻问题基本类型偏执、依恋情结
判断标准其中一个字段单独出现时是否还有意义

典型使用场景

  • 时间区间在多个方法里以两个参数成对传递
  • 地址被拆成多个参数一路透传
  • 主机名与端口成对出现在每个连接相关签名里
  • 配置项散落在多个类中,各自重复校验
  • 导出功能里同一组列名在多处重复维护

合并前后

合并前后
// 之前:两个参数总是成对出现,校验逻辑重复
createEvent(String start, String end, String title)

// 之后:合并为一个类型,校验只需要写一次
createEvent(TimeRange range, String title)

// TimeRange 内部负责:格式校验、先后顺序校验、区间长度计算

要不要合并

情况结论理由
字段成对出现且总有校验合并校验逻辑可集中到新类型
字段恰好相同但语义不同不合并强行合并会制造误读
只是两个参数偶尔同行先观察过度建模增加维护成本
合并的重点是搬行为:如果新类型只是字段容器,取值与校验仍散落在调用方,泥团只是换了包装。让新类型自己回答这个区间是否合法这类问题。
语义不同的组合不要合并:名字相同不代表概念相同,错误的抽象比重复参数更难拆开。

易错点

  • 只合并字段不搬行为:新类型沦为纯数据袋,重复校验依旧存在
  • 把语义不同的字段凑成一组:调用方要绕开新类型才能表达原意
  • 一次性做大范围签名改造:影响面失控,应从高频出现的组合开始
  • 新类型做成可变对象:相等性判断与缓存假设被破坏,排查困难

数据来源与参考

  • 《重构》第 2 版 · 第 3 章(Data Clumps)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌