第 5 章:信息隐藏与泄漏
系列:软件设计的哲学 · 第 5/22 章
全书导读:00-overview.md
一句话总结
模块应隐藏设计决策;当同一知识在多处出现或跨边界暴露时,即发生信息泄漏,复杂度随之扩散。
核心观点浓缩
- 信息隐藏:把可能变化的决策封在模块内,外部只依赖稳定抽象
- 泄漏:调用方或兄弟模块需了解本不该知道的内部格式、顺序、协议
- 时间分解泄漏:按「先 A 后 B」拆模块,把执行顺序泄漏给上层
- 泄漏导致变更放大:改内部表示要同步改所有知情方
- 隐藏的是知识,不仅是
private关键字——public API 形状也会泄漏
关键概念 / 金句
| 泄漏类型 | 例子 |
|---|---|
| 格式泄漏 | 暴露内部 JSON 字段名,调用方直接解析 |
| 顺序泄漏 | 必须先 connect 再 configure,文档外无保障 |
| 临时分解 | 按开发步骤拆类,非按信息边界拆 |
本章在全书中的位置
第 5 章解释深模块如何成立:接口简单是因为知识被藏住了。与第 9 章「拆还是合」、第 7 章「分层」紧密相连——拆分准则本质是信息边界。
个人思考与启发
配置项从 QSettings 读到 UI 再传到 Service,若三层都懂键名与默认值,一改键名全库搜。应收敛到单一 AppConfig 深模块,外部只问「导出路径是什么」。
与《程序员修炼之道》对照
- DRY:重复常是信息未隐藏,同一知识拷贝到多处
- 正交:模块正交 ⟺ 各自隐藏独立知识,变更不牵连
- 「勿打破封装」与本书一致;本书进一步指出 API 设计 也会破封装
重点与注意
重点:问「这个知识必须被谁知道?」——答案应尽可能少。
重点:按信息边界拆模块,不按开发时间线拆。
注意:friend、包内可见等技巧是手段,目标是知识不扩散。
注意:过度隐藏导致调试困难时,用可观测性接口(日志、诊断)而非泄漏内部结构。
导航:第 4 章 模块应深 · 下一篇:第 6 章 通用模块更深