总结
设计原则小结
这些是本书中讨论的最重要的软件设计原则:
- 复杂性是增量产生的:您必须努力处理小事情(请参阅 第 2.4 节)。
- 能工作的代码是不够的(请参阅 第 3.2 节)。
- 持续进行小额投资以改善系统设计(请参阅 第 3.3 节)。
- 模块应该是深的(请参阅 第 4.4 节)
- 接口的设计应尽可能简化其最常见的用法(请参阅 第 4.7 节)。
- 让模块的接口简单比让其实现简单更为重要(请参阅 第 8 章 和 第 9.7 节)。
- 通用模块是更深的(请参阅 第 6 章)。
- 分开通用代码和专用代码(请参阅 第 6.6 节 和 第 9.4 节)。
- 不同的层级应具有不同的抽象(请参阅 第 7 章)。
- 下沉复杂性(请参阅 第 8 章)。
- 通过定义来规避错误(请参阅 第 10.3 节)。
- 设计两次(请参阅 第 11 章)。
- 注释应该描述代码中难以理解的内容(请参阅 第 13 章)。
- 软件应被设计成易于阅读而不是易于编写(请参阅 第 18.2 节)。
- 软件开发的增量应该是抽象而不是功能(请参阅 第 19.2 节)。
- 区分重要的和不重要的事情,并强调重要的事情(请参阅 第 21 章)。
危险信号小结
这些是本书中讨论的一些最重要的危险信号。系统中任何这些症状的存在都表明系统的设计存在问题:
- 浅模块:类或方法的接口并不比其实现简单得多(请参阅 第 4.5 节 和 第 13.5 节)。
- 信息泄露:设计决策反映在多个模块中(请参阅 第 5.2 节)。
- 时间分解:代码结构基于执行操作的顺序,而不是基于信息隐藏的原则(请参阅 第 5.3 节)。
- 过度暴露:API 强迫调用者在使用常用功能的时候还需要去了解那些很少使用的功能(请参阅 第 5.7 节)。
- 透传方法:一种几乎不执行任何操作的方法,只是将其参数传递给具有相似签名的另一个方法(请参阅 第 7.1 节)。
- 重复:一遍又一遍的重复代码(请参阅 第 9.4 节)。
- 通用专用混合体:专用代码与通用代码没有整洁地分开(请参阅 第 9.5 节)。
- 连体方法:两个方法之间的依赖很多,以至于很难在不理解一个方法的实现的情况下理解另一个方法的实现(请参阅 第 9.8 节)。
- 注释重复了代码:注释中的所有信息在旁边的代码里显而易见(请参阅 第 13.2 节)。
- 实现文档污染了接口:接口注释描述了其用户不需要了解的实现细节(请参阅 第 13.5 节)。
- 模糊的名称:变量或方法的名称过于不精确,以至于它不能传递太多有用的信息(请参阅 第 14.3 节)。
- 难以选取名称:很难为实体提供一个精确而直观的名称(请参阅 第 14.3 节)。
- 难以描述:为了得到完整的描述,变量或方法的文档必须很长(请参阅 第 15.3 节)。
- 难以理解的代码:一段代码的行为或含义不容易被理解(请参阅 第 18.2 节)。
关于作者
John Ousterhout 是斯坦福大学的 Bosack Lerner 计算机科学教授。他当前的研究重点是新的软件堆栈层,以允许数据中心应用程序利用具有微秒级延迟的通信和存储技术。Ousterhout 之前的 14 年经历在工业界,并创办了 Scriptics 和 Electric Cloud 这两家公司,再之前的 14 年则是加州大学伯克利分校的计算机科学教授。他是 Tcl 脚本语言的创建者,并且以在分布式操作系统和存储系统中的工作而闻名。Ousterhout 在耶鲁大学获得了物理学学士学位,并在卡内基梅隆大学获得了计算机科学博士学位。他是美国国家工程院院士,并获得了无数奖项,包括 ACM 软件系统奖、ACM Grace Murray Hopper 奖、美国国家科学基金会总统年轻研究者奖和 UC Berkeley 杰出教学奖。