《代码大全》笔记 05 - 软件构建中的设计
豆瓣:https://book.douban.com/subject/1477390/
《Code Complete》2d ed,CC2
设计中的挑战
- 设计是一个险恶的问题
- 你必须首先把这个问题“解决”一遍以便能够明确地定义它,然后再次解决该问题,从而形成一个可行的方案。
- 设计是个了无章法的过程
- 设计就是确定取舍和调整顺序的过程
- 设计受到诸多限制
- 设计是不确定的
- 设计是一个启发式过程
- 设计是自然而然形成的
关键的设计概念
- 软件的首要技术革命:管理复杂度
- 把任何人在同一时间需要处理的本质复杂度的量减到最少。
- 不要让偶然性的复杂度无谓地快速增长。
- 理想的设计特征
- 最小的复杂度
- 易于维护。设计自明的(self-explanatory)系统
- 松散耦合
- 可扩展性
- 可重用性
- 高扇入。让大量的类使用某个基础的工具类。
- 低扇出。一个类尽量少地使用其他多个类。
- 可移植性
- 精简性。删除所有可以删除的代码。
- 层次性。在一个层次观察代码时不需要牵扯到其它层。
- 标准技术。不轻易创造新的东西增加理解、学习成本。
- 设计的层次
- 软件系统
- 分解为子系统或包
- 分解为类
- 分解成子程序
设计构造块:启发式方法
- 启发式方法,也即是一些思考问题的方法。类似于数学领域的《怎样解题》。
- 找出现实世界中的对象。也即是面向对象设计方法。
- 形成一致的抽象。使用抽象层次处理问题复杂度。
- 封装实现细节。抽象是以更高层次的细节来看待对象,而封装是着重实现不能看到不该看的细节的效果。
- 当继承能简化设计时就继承。
- 隐藏秘密(信息隐藏)。这是比封装更大范围的设计方法。包括隐藏复杂度和变化源。
- 找出容易改变的区域。并隔离限定起来。
- 保持松散耦合。特别注意不容易觉察的“语义上的耦合”。
- 查阅常用的设计模式。
设计实践
- 分而治之。分解,各个击破。
- 自上而下和自下而上的设计方法。分别对应从高层次抽象开始和从细节向一般性延伸。
- 建立试验性原型。试验性意味着,当完成了回答特定设计问题后,代码可以扔掉。
- 合作设计。
对流行的设计方法的评论
- 请把设计看成是一个险恶的、杂乱的和启发式的过程。不要停留于你所想到的第一套解决方案,而是去寻求合作,探求简洁性,在需要的时候做出原型,迭代,并进一步迭代。
2019-12-15 - 廖杰良