【代码坏味道】变更阻碍者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 | 每新增一个子类,多个类都得配套加子类 | 合并继承结构,移除多余子类或改为组合方式 |