发散式变化 (Divergent Change)
解释:
发散式变化指的是一个模块需要因为多种不同的原因而发生变化。这通常意味着这个模块承担了过多的职责,违反了单一职责原则(Single Responsibility Principle, SRP)。当一个模块需要频繁地因为不同的原因进行修改时,维护起来会变得非常困难,增加了出错的可能性。
解决方法:
- 单一职责原则:将一个承担多种职责的模块拆分成多个每个只承担单一职责的模块。
- 模块化设计:通过模块化设计,将不同的职责分配到不同的类或函数中。
- 面向对象设计:利用继承和多态,将变化的部分封装在不同的类中。
例子:
-
违反单一职责的类:
坏味道:
public class Employee { private String name; private double salary; public Employee(String name, double salary) { this.name = name; this.salary = salary; } // 处理员工数据 public void saveEmployee() { // 保存员工数据到数据库 } // 计算工资 public double calculatePay() { // 计算员工工资 return salary; } // 生成员工报告 public String generateReport() { // 生成员工报告 return "Employee Report for " + name; } }
重构:
// 将不同的职责分离到不同的类中 // 负责员工数据管理 public class EmployeeRepository { public void saveEmployee(Employee employee) { // 保存员工数据到数据库 } } // 负责工资计算 public class Payroll { public double calculatePay(Employee employee) { // 计算员工工资 return employee.getSalary(); } } // 负责报告生成 public class ReportGenerator { public String generateReport(Employee employee) { // 生成员工报告 return "Employee Report for " + employee.getName(); } } public class Employee { private String name; private double salary; public Employee(String name, double salary) { this.name = name; this.salary = salary; } public String getName() { return name; } public double getSalary() { return salary; } }
-
处理多种变化的函数:
坏味道:
public class Document { private String content; public Document(String content) { this.content = content; } // 处理文档内容 public void formatDocument() { // 格式化文档内容 } // 保存文档 public void saveDocument() { // 保存文档到文件 } // 打印文档 public void printDocument() { // 打印文档 } }
重构:
public class Document { private String content; public Document(String content) { this.content = content; } public String getContent() { return content; } } // 负责文档格式化 public class DocumentFormatter { public void format(Document document) { // 格式化文档内容 } } // 负责文档保存 public class DocumentSaver { public void save(Document document) { // 保存文档到文件 } } // 负责文档打印 public class DocumentPrinter { public void print(Document document) { // 打印文档 } }
总结:
通过遵循单一职责原则和模块化设计,可以有效减少发散式变化的坏味道,提高代码的可维护性和可读性。在重构过程中,应该遵循以下原则:
- 单一职责原则:每个类或函数只做一件事。
- 模块化设计:将不同的职责分配到不同的类或函数中。
- 面向对象设计:利用继承和多态,将变化的部分封装在不同的类中。