重构臃肿代码的核心是重新划定职责边界、切断隐式依赖、让每个类只对一种变化负责:按变化原因拆分上帝类,用接口隔离依赖,将条件分支转为多态策略,剥离横切关注点。

重构臃肿代码的核心不是“删代码”,而是重新划定职责边界、切断隐式依赖、让每个类只对一种变化负责。关键在于用设计原则指导具体动作,而不是套概念。
按变化原因拆分上帝类
一个类如果同时处理用户保存、邮件通知、报表生成,就说明它被多个变化原因牵制。比如登录策略调整、审计日志升级、数据库迁移,这三件事本不该互相影响。
- 把每种变化原因抽成独立类:Authenticator 负责认证逻辑,AuditLogger 封装审计行为,UserRepository 抽象数据访问
- 原类中保留委托方法,不破坏调用方:比如 UserManager.sendEmail() 内部调用 emailSender.send(user),接口不变但实现可替换
- 避免 Helper、Util 这类模糊命名,改用 PasswordEncoder、OrderValidator 等带业务语义的名字
用接口隔离依赖,拒绝硬编码
耦合往往藏在 new 和静态调用里。Service 层直接 new JdbcTemplate、Controller 里写 new ObjectMapper(),都是把实现细节焊死在业务逻辑上。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 所有外部依赖必须通过构造函数注入,类型为接口(如 UserRepository、HttpClient)
- 禁止跨层持有底层对象:Service 不该知道 RedisTemplate,只依赖 CacheService.get(key)
- 测试时能直接传入 new MockUserRepository() 或 new InMemoryUserRepository(),就是依赖设计合格的标志
把条件分支转为多态策略
if (type == "email")、switch (format) 这类代码是内聚失效的典型信号——同一个方法里混着多种行为,任一规则变动都得动这个类。
- 定义策略接口:NotificationSender,提供 send(User user) 方法
- 拆出具体实现:EmailSender、SmsSender、PushSender,各自封装协议细节
- 用工厂或 Spring 的 @Qualifier 控制运行时选择,业务类只依赖 NotificationSender 接口
剥离横切关注点,还原业务主干
事务、日志、参数校验、序列化这些通用逻辑塞进业务方法,会让核心流程被噪音淹没,也导致一个方法承担多重责任。
- @Transactional 不要放在 service 方法上,改由 AOP 切面统一管理,或下沉到 repository 层
- 用 @Valid 配合自定义注解做参数校验,而不是在方法开头写一堆 if (user == null)
- 日志用 AOP 或专门的 AuditLogger 类,业务方法里只留关键业务日志,不掺杂技术埋点
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










