《代码大全》笔记 05 - 软件构建中的设计

豆瓣:https://book.douban.com/subject/1477390/

《Code Complete》2d ed,CC2

设计中的挑战

  • 设计是一个险恶的问题
    • 你必须首先把这个问题“解决”一遍以便能够明确地定义它,然后再次解决该问题,从而形成一个可行的方案。
  • 设计是个了无章法的过程
  • 设计就是确定取舍和调整顺序的过程
  • 设计受到诸多限制
  • 设计是不确定的
  • 设计是一个启发式过程
  • 设计是自然而然形成的

关键的设计概念

  • 软件的首要技术革命:管理复杂度
    • 把任何人在同一时间需要处理的本质复杂度的量减到最少。
    • 不要让偶然性的复杂度无谓地快速增长。
  • 理想的设计特征
    • 最小的复杂度
    • 易于维护。设计自明的(self-explanatory)系统
    • 松散耦合
    • 可扩展性
    • 可重用性
    • 高扇入。让大量的类使用某个基础的工具类。
    • 低扇出。一个类尽量少地使用其他多个类。
    • 可移植性
    • 精简性。删除所有可以删除的代码。
    • 层次性。在一个层次观察代码时不需要牵扯到其它层。
    • 标准技术。不轻易创造新的东西增加理解、学习成本。
  • 设计的层次
    • 软件系统
    • 分解为子系统或包
    • 分解为类
    • 分解成子程序

设计构造块:启发式方法

  • 启发式方法,也即是一些思考问题的方法。类似于数学领域的《怎样解题》。
  • 找出现实世界中的对象。也即是面向对象设计方法。
  • 形成一致的抽象。使用抽象层次处理问题复杂度。
  • 封装实现细节。抽象是以更高层次的细节来看待对象,而封装是着重实现不能看到不该看的细节的效果。
  • 当继承能简化设计时就继承。
  • 隐藏秘密(信息隐藏)。这是比封装更大范围的设计方法。包括隐藏复杂度和变化源。
  • 找出容易改变的区域。并隔离限定起来。
  • 保持松散耦合。特别注意不容易觉察的“语义上的耦合”。
  • 查阅常用的设计模式。

设计实践

  • 分而治之。分解,各个击破。
  • 自上而下和自下而上的设计方法。分别对应从高层次抽象开始和从细节向一般性延伸。
  • 建立试验性原型。试验性意味着,当完成了回答特定设计问题后,代码可以扔掉。
  • 合作设计。

对流行的设计方法的评论

  • 请把设计看成是一个险恶的、杂乱的和启发式的过程。不要停留于你所想到的第一套解决方案,而是去寻求合作,探求简洁性,在需要的时候做出原型,迭代,并进一步迭代。

《代码大全》笔记 05 - 软件构建中的设计

《代码大全》笔记 05 - 软件构建中的设计

2019-12-15 - 廖杰良