首页/开发/代码质量与评审速查/模式误用与过度设计识别
设计原则与模式62 条

模式误用与过度设计识别

设计模式是词汇表而非目标:没有对应变化点就套模式,会引入额外类型与间接层;识别信号——为模式而生的接口只有单一实现、类名里写着模式名却说不清意图。

模式误用与过度设计

设计模式是描述解法的词汇表,不是目标。GoF 原书明确它记录的是对常见问题的可复用解法,是否适用取决于变化点是否真实存在。没有第二种实现、没有第二个变化轴就套模式,只会多出类型与间接层,读代码的人要付出理解成本却换不来灵活性。

基本信息

来源GoF《设计模式》序言:模式是对重复问题的解法描述,非普适
识别信号抽象层无对应扩展压力、接口只有单一实现、类名写着模式名却说不清意图
代价类型与间接层增多,新人上手成本上升
习惯先写直白实现,真的出现变化点再引入模式

常见过度设计形态

  • 为「将来可能换数据库」抽出仓储接口,实际只有一套实现且从不替换
  • 用抽象工厂管理只有一种风格的产品族
  • 把一次性的数据变形封装成多层策略加注册表
  • 为三个 if 引入责任链,链的装配逻辑比判断还长
  • 声明式配置驱动的通用引擎,配置项只有一处在用

评审自检问题

评审自检问题
□ 这个模式消除的具体坏味道是什么?(写出名字)
□ 不用它,最坏情况会怎样?成本可接受吗?
□ 当前存在第二种实现或第二个变化轴吗?
□ 新增一个同类实现,是加文件还是改多处?
□ 半年后新人能读懂并敢改这层抽象吗?

信号与处理

信号说明处理
接口单实现抽象没有被任何替换压力驱动内联回具体实现
类名带模式词命名靠模式撑场面,意图没写清按职责重命名
配置项闲置开关与分支从未被触发删除分支与配置
间接层追查费力一次调用跳转超过三处合并为直白流程
与「夸夸其谈通用性」这条坏味道互查:「现在不需要,但将来可能要用」通常就是删除信号。删除前先确认变化点是否真实存在,别把已经出现过的第二种实现一起删掉。

易错点

  • 评审以「用了什么模式」评优劣:诱发表演式设计,代码量与理解成本同步上升
  • 为删除模式而删除:误判真实存在的变化点,把已经稳定运行的扩展点拆掉
  • 抽象先行却不写测试:多层委托的行为在重构中悄悄漂移,没人发现

数据来源与参考

  • 《设计模式》(GoF)序言与使用说明;《重构》第 2 版 Speculative Generality
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌