🧩 Switch 语句(Switch Statements)
🚨 什么是问题?
如果你写了很长的 switch-case
或 if-else
结构,很容易出问题。每加一种判断条件,就要改很多地方,难维护。
🤔 为什么不好?
switch
分支可能分散在很多文件或方法中,新加一种情况时,你得找遍这些地方修改,很麻烦。- 面向对象的写法应该尽量避免使用
switch
,而是用“多态”来代替。
✅ 怎么办?
- 提取方法 + 移动方法:先把 switch 部分独立成函数,然后放到更合适的类里。
- 用子类或策略模式代替:如果
switch
是根据状态/类型来的,可以用不同子类或策略类代替。 - 多态代替条件:用子类来表示不同情况,每个子类实现自己的行为。
- 选项是 null? → 用“空对象”代替,避免加判断。
💰 有什么好处?
- 结构更清晰,每种情况变成独立类,新增功能更容易。
- 改 switch 变得少很多。
🧪 临时字段(Temporary Field)
🚨 什么是问题?
有些类里的变量,只在特定情况下有值,大多数时候是空的。这些就是“临时字段”。
🤔 为什么不好?
你看着对象有很多字段,但一运行,全是空的,搞不清楚它到底用来干嘛,很混乱。
✅ 怎么办?
- 提取类:把这些只用于某些算法的字段,放到一个专门的类中去。
- 引入空对象:用空对象代替“值为 null”的判断。
💰 有什么好处?
- 类的结构更清晰,不会被一堆“空字段”搞混。
- 更容易维护和阅读。
🚫 拒绝继承(Refused Bequest)
🚨 什么是问题?
你写了一个子类,它继承了父类,但只用了父类的一部分功能,很多继承的方法根本没用上,甚至要手动重写。
🤔 为什么不好?
继承就像父子关系,子类应该天然继承父类的特性。如果子类只想用父类一两个方法,那这个“关系”可能压根不合理。
✅ 怎么办?
- 改用组合:不继承,而是把原来的父类作为普通成员使用。
- 提取通用父类:如果两个类有一部分真的通用,可以提取到新父类中。
💰 有什么好处?
- 你再也不用看到
Dog
居然继承了Chair
这样的奇怪代码了 🐶🪑。 - 结构清晰,职责明确。
🔁 替代类但接口不同(Alternative Classes with Different Interfaces)
🚨 什么是问题?
你发现两个类做的事一模一样,但方法名不一样。
🤔 为什么不好?
- 多余的重复代码
- 别人不知道该用哪个类、哪个方法,维护困难
✅ 怎么办?
- 重命名方法:让它们的方法名统一。
- 合并实现方式:让它们的参数、逻辑一样。
- 提取公共父类:让这两个类都继承同一个父类,把共同功能写到这个父类中。
- 如果功能完全一样,干脆删除其中一个类。
💰 有什么好处?
- 删除重复代码
- 让程序员清楚该用哪个类,不再一头雾水
✅ 总结(白话版)
坏味道 | 表现 | 怎么办 |
---|---|---|
Switch 语句 | 写很多 case 分支 | 用“子类”或“策略模式”代替 |
临时字段 | 变量只偶尔才用 | 拆到新类里,或用空对象 |
拒绝继承 | 子类没用多少父类的东西 | 改成组合关系,或重新设计父类 |
替代类接口不同 | 功能一样,方法名不同 | 统一方法名或合并为一个类 |