当前位置: 首页 > ops >正文

【代码坏味道】变更阻碍者Change Preventers

🔀 Divergent Change(分歧性修改)

🛑 什么是它?

当你修改一个类的时候,发现这个类里很多不相关的方法都要改,就说明这个类的职责太杂了!

🧠 举个例子:你加一个产品类型,却要修改同一个类中用于查找、显示、下单的多个方法。

🤔 为什么这是个问题?

  • 类承担太多职责,不同功能混在一起。
  • 一改功能,牵一发动全身,容易出错。

🛠️ 怎么改?

  • ✂️ 提取类(Extract Class):把不同职责分到不同类中。
  • 🧬 如果多个类功能重复:用继承整理结构(提取父类或子类)。

✅ 有什么好处?

  • 类的职责清晰。
  • 代码更易维护、不会重复劳动。
  • 更容易定位问题或添加新功能。

🔫 Shotgun Surgery(霰弹手术)

🛑 什么是它?

你要加个新功能或改个逻辑,结果需要同时改好几个类里的一小部分,像打霰弹枪一样“到处改”。

🧠 举个例子:想改个价格逻辑,结果 Product 类、Cart 类、Order 类都要动。

🤔 为什么这是个问题?

  • 一个小改动却要遍地找代码,改起来特别麻烦。
  • 说明职责被拆得太散,模块划分不合理。

🛠️ 怎么改?

  • 🚚 移动方法/字段(Move Method/Field):把散落的代码收进一个合适的类。
  • 🧹 如果原来的类因此空了,直接删掉(内联类 Inline Class)。

✅ 有什么好处?

  • 所有相关代码集中到一处。
  • 改代码不再“打散弹”,维护轻松!

🧱 Parallel Inheritance Hierarchies(并行继承层次结构)

🛑 什么是它?

当你给某个类添加一个子类时,发现另一个相关的类也必须添加对应的子类,两个继承结构就像“并排走路”。

🧠 举个例子:

  • Animal -> Cat, Dog
  • 同时 AnimalSoundPlayer -> CatSoundPlayer, DogSoundPlayer

只要新增 Fish,两个类体系都要加一层,改动代价越来越大!

🤔 为什么这是个问题?

  • 类与类之间强耦合,扩展一个就要成对扩展,麻烦大。
  • 系统越来越复杂、难维护。

🛠️ 怎么改?

  • 🧲 第一步:让一个类的对象引用另一个类的对象。
  • 🧹 第二步:把重复逻辑合并,移除冗余的继承结构(用 Move Method/Field)。

✅ 有什么好处?

  • 继承关系更简单。
  • 减少冗余、结构清晰。

❎ 什么时候可以忽略?

  • 如果你尝试精简结构,结果代码变得更乱,那就先别改了。
  • 有时候两个并行结构反而是更清晰的选择。

✅ 小结:这些“坏味道”该怎么处理?

坏味道类型问题表现推荐做法
分歧性修改 Divergent Change一个类里要改很多不相关方法提取类、提取子类/父类
霰弹手术 Shotgun Surgery一个改动要修改很多类移动方法或字段,集中代码,必要时删掉类
并行继承结构 Parallel Hierarchies每新增一个子类,多个类都得配套加子类合并继承结构,移除多余子类或改为组合方式
http://www.xdnf.cn/news/10136.html

相关文章:

  • etcd详解
  • 设计模式——装饰器设计模式(结构型)
  • threejs渲染器和前端UI界面
  • 当前用户的Git全局配置情况:git config --global --list
  • 关于 java:3. Java 常用类库与数据结构
  • TK海外抢单源码/指定卡单
  • 【Python进阶】CPython
  • 37. Sudoku Solver
  • 《Spring Cloud Gateway 快速入门:从路由到自定义 Filter 的完整教程》​
  • 考研系列—操作系统:第三章、内存管理(part.2)
  • MCP Python技术实践
  • token
  • InfluxQL 数据分析实战:聚合、过滤与关联查询全解析
  • AI Agent智能体:底层逻辑、原理与大模型关系深度解析·优雅草卓伊凡
  • JVM类加载高阶实战:从双亲委派到弹性架构的设计进化
  • C++ 观察者模式:设计与实现详解
  • 【Python】解析 io.StringIO 与 io.BytesIO
  • Tomcat的整体架构及其设计精髓
  • 关于5090安装tensorrt(python api)的过程
  • HackMyVM-Art
  • 【PostgreSQL 03】PostGIS空间数据深度实战:从地图服务到智慧城市
  • Axure中继器交互完全指南:核心函数解析×场景实战×避坑策略(懂得才能应用)
  • ssh连接断开,保持任务后台执行——tmux
  • MySQL索引与性能优化入门:让查询提速的秘密武器【MySQL系列】
  • 现代网络安全攻防技术与发展现状
  • 前端面经 websocket
  • Linux笔记---线程
  • 【Github/Gitee Webhook触发自动部署-Jenkins】
  • 数据库主键与索引详解
  • 2025年- H60-Lc168--35.搜索插入的位置(二分查找)--Java版