代码坏味道:数据泥团

数据泥团 (Data Clumps)

解释
数据泥团指的是多个数据项经常一起出现,并且在多个地方一起传递或处理。这种情况通常表明这些数据具有某种内在的关联,应该被封装成一个对象。数据泥团会导致代码的冗余和难以维护,因为每次修改都需要在多个地方进行相同的调整。

解决方法

  1. 引入对象:将相关的数据封装到一个对象中。
  2. 重构方法签名:使用新引入的对象代替多个参数。
  3. 增强代码内聚性:将操作这些数据的相关方法也移动到新对象中。

例子

  1. 数据泥团的代码

    坏味道

    public class Order {
        public void createOrder(String customerName, String customerAddress, String customerEmail, String product, int quantity) {
            // 创建订单逻辑
        }
    
        public void updateOrder(String customerName, String customerAddress, String customerEmail, String product, int quantity) {
            // 更新订单逻辑
        }
    
        public void deleteOrder(String customerName, String customerAddress, String customerEmail, String product, int quantity) {
            // 删除订单逻辑
        }
    }
    

    重构

    // 定义一个 Customer 类来封装客户相关的数据
    public class Customer {
        private String name;
        private String address;
        private String email;
    
        public Customer(String name, String address, String email) {
            this.name = name;
            this.address = address;
            this.email = email;
        }
    
        public String getName() {
            return name;
        }
    
        public String getAddress() {
            return address;
        }
    
        public String getEmail() {
            return email;
        }
    }
    
    // 定义一个 ProductOrder 类来封装产品订单的数据
    public class ProductOrder {
        private String product;
        private int quantity;
    
        public ProductOrder(String product, int quantity) {
            this.product = product;
            this.quantity = quantity;
        }
    
        public String getProduct() {
            return product;
        }
    
        public int getQuantity() {
            return quantity;
        }
    }
    
    public class Order {
        public void createOrder(Customer customer, ProductOrder productOrder) {
            // 创建订单逻辑
        }
    
        public void updateOrder(Customer customer, ProductOrder productOrder) {
            // 更新订单逻辑
        }
    
        public void deleteOrder(Customer customer, ProductOrder productOrder) {
            // 删除订单逻辑
        }
    }
    
  2. 更多的数据泥团例子

    坏味道

    public class ReportGenerator {
        public void generateReport(String startDate, String endDate, String reportType) {
            // 生成报告逻辑
        }
    
        public void exportReport(String startDate, String endDate, String reportType, String format) {
            // 导出报告逻辑
        }
    }
    

    重构

    // 定义一个 ReportDetails 类来封装报告相关的数据
    public class ReportDetails {
        private String startDate;
        private String endDate;
        private String reportType;
    
        public ReportDetails(String startDate, String endDate, String reportType) {
            this.startDate = startDate;
            this.endDate = endDate;
            this.reportType = reportType;
        }
    
        public String getStartDate() {
            return startDate;
        }
    
        public String getEndDate() {
            return endDate;
        }
    
        public String getReportType() {
            return reportType;
        }
    }
    
    // 定义一个 ExportDetails 类来封装导出相关的数据
    public class ExportDetails {
        private String format;
    
        public ExportDetails(String format) {
            this.format = format;
        }
    
        public String getFormat() {
            return format;
        }
    }
    
    public class ReportGenerator {
        public void generateReport(ReportDetails reportDetails) {
            // 生成报告逻辑
        }
    
        public void exportReport(ReportDetails reportDetails, ExportDetails exportDetails) {
            // 导出报告逻辑
        }
    }
    

总结
通过引入对象将数据泥团封装起来,可以减少代码的冗余,提高代码的内聚性和可维护性。在重构过程中,应该遵循以下原则:

  • 封装相关数据:将频繁一起出现的数据封装到一个对象中。
  • 简化方法签名:使用新对象代替多个参数,简化方法签名。
  • 提高内聚性:将操作这些数据的相关方法也移动到新对象中,增强代码的内聚性。
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值