代码坏味道:发散式变化

发散式变化 (Divergent Change)

解释
发散式变化指的是一个模块需要因为多种不同的原因而发生变化。这通常意味着这个模块承担了过多的职责,违反了单一职责原则(Single Responsibility Principle, SRP)。当一个模块需要频繁地因为不同的原因进行修改时,维护起来会变得非常困难,增加了出错的可能性。

解决方法

  1. 单一职责原则:将一个承担多种职责的模块拆分成多个每个只承担单一职责的模块。
  2. 模块化设计:通过模块化设计,将不同的职责分配到不同的类或函数中。
  3. 面向对象设计:利用继承和多态,将变化的部分封装在不同的类中。

例子

  1. 违反单一职责的类

    坏味道

    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;
        }
    }
    
  2. 处理多种变化的函数

    坏味道

    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) {
            // 打印文档
        }
    }
    

总结
通过遵循单一职责原则和模块化设计,可以有效减少发散式变化的坏味道,提高代码的可维护性和可读性。在重构过程中,应该遵循以下原则:

  • 单一职责原则:每个类或函数只做一件事。
  • 模块化设计:将不同的职责分配到不同的类或函数中。
  • 面向对象设计:利用继承和多态,将变化的部分封装在不同的类中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值