阿里P8架构师教你kill祖传石山代码重复/大量ifelse( 四 )

如果原始的DTO有100个字段 , 我们需要复制90个字段到DO中 , 保留10个不赋值 , 最后应该如何校验正确性呢?

  • 数数吗?即使数出有90行代码 , 也不一定正确 , 因为属性可能重复赋值
  • 有时字段名相近 , 比如complainable和commentable , 容易搞反
  • 对两个目标字段重复赋值相同的来源字段
  • 明明要把DTO的值赋值到DO中 , 却在set的时候从DO自己取值 , 导致赋值无效
使用类似BeanUtils这种Mapping工具来做Bean的转换 , copyProperties方法还允许我们提供需要忽略的属性:
阿里P8架构师教你kill祖传石山代码重复/大量ifelse文章插图
5 总结重复代码多了总有一天会出错 。
  • 有多个并行的类实现相似的代码逻辑 考虑提取相同逻辑在父类中实现 , 差异逻辑通过抽象方法留给子类实现 。 使用类似的模板方法把相同的流程和逻辑固定成模板 , 保留差异的同时尽可能避免代码重复 。 同时 , 可以使用Spring的IoC特性注入相应的子类 , 来避免实例化子类时的大量if…else代码 。
  • 使用硬编码的方式重复实现相同的数据处理算法 考虑把规则转换为自定义注解 , 作为元数据对类或对字段、方法进行描述 , 然后通过反射动态读取这些元数据、字段或调用方法 , 实现规则参数和规则定义的分离 。 也就是说 , 把变化的部分也就是规则的参数放入注解 , 规则的定义统一处理 。
  • 业务代码中常见的DO、DTO、VO转换时大量字段的手动赋值 , 遇到有上百个属性的复杂类型 , 非常非常容易出错 不要手动进行赋值 , 考虑使用Bean映射工具进行 。 此外 , 还可以考虑采用单元测试对所有字段进行赋值正确性校验 。
代码重复度是评估一个项目质量的重要指标 , 如果一个项目几乎没有任何重复代码 , 那么它内部抽象一定非常好 。 重构时 , 首要任务是消除重复 。
参考
  • 《重构》
  • 搞定代码重复的三个绝招