数据泥团 (Data Clumps)
解释:
数据泥团指的是多个数据项经常一起出现,并且在多个地方一起传递或处理。这种情况通常表明这些数据具有某种内在的关联,应该被封装成一个对象。数据泥团会导致代码的冗余和难以维护,因为每次修改都需要在多个地方进行相同的调整。
解决方法:
- 引入对象:将相关的数据封装到一个对象中。
- 重构方法签名:使用新引入的对象代替多个参数。
- 增强代码内聚性:将操作这些数据的相关方法也移动到新对象中。
例子:
-
数据泥团的代码:
坏味道:
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) { // 删除订单逻辑 } }
-
更多的数据泥团例子:
坏味道:
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) { // 导出报告逻辑 } }
总结:
通过引入对象将数据泥团封装起来,可以减少代码的冗余,提高代码的内聚性和可维护性。在重构过程中,应该遵循以下原则:
- 封装相关数据:将频繁一起出现的数据封装到一个对象中。
- 简化方法签名:使用新对象代替多个参数,简化方法签名。
- 提高内聚性:将操作这些数据的相关方法也移动到新对象中,增强代码的内聚性。