code2读书笔记-第五章 软件构建中的设计

1.设计中的挑战

设计的过程

  1. 确定取舍和调整顺序
    要去衡量彼此冲突的各项设计特性,寻求平衡。如果快速的反应开发比快速开发时间更重要,就需要设计者选取一套方案,但是如果相反,就需要另一套方案。

  2. 受到诸多限制
    有限的资源限制才会促使产生简单的方案。

  3. 不确定的
    不同的人有不同的设计方案

  4. 启发式的过程
    设计过程总会有试验和犯错

  5. 自然而然形成的
    它是在不断的设计评估、非正式讨论、写试验代码以及修改试验代码中演化和完善的。

2.关键设计的概念

软件的首要技术使命:管理复杂度

  试着以某种方式组织程序,以便在一个时刻可以专注与一个特定的部分。这么做的目的是尽量减少在任一事件所要思考的程序量。

理想的设计特征

交互关系的复杂度

  1. 最简单的交互关系是让一个子系统去调用另一个子系统的子程序。
  2. 复杂一点的交互关系是在一个子系统中包含另一个子系统中的类。
  3. 最复杂的交互关系是让一个子系统中的类继承另一个子系统中的类。

类与对象的比较

  对象是指运行期间在程序中实际存在的具体实体(enity),而类是指在程序源码中存在的静态事物。对象是动态的,它拥有你在程序运行期间能得到的具体的值和属性。

3.设计构造块

找出对象

使用对象进行设计的步骤:

形成一致的抽象

  任何时候当你在对一个聚合物品工作时,你就是在使用抽象了。比如称呼一个东西为房子而不是材料和钉子。以复杂度的观点看,抽象的主要好处就在于它使你能忽略无关的细节。

封装实现细节

  抽象是可以让你从高层的细节来看待一个对象。而封装则是除此之外,你不能看到对象的任何其他细节层次。封装不只是让你能用简化的视图来看复杂的概念,同时还不能让你看到复杂概念的任何细节。你能看到的就是你能全部得到的。

当继承能简化设计时就继承

定义对象之间的相同点和不同点就叫继承。

信息隐藏

  信息隐藏式技术使命中格外重要的一种启发方式,因为它强调的就是隐藏复杂度。在设计一个类的时候,一项关键的决策就是确定类的哪些特性应该对外可见,而哪些特性应该隐藏起来。
  好的类接口就像是冰山尖儿一样,让类的大部分内容不会暴露出来。
信息隐藏主要分为两大类:

信息隐藏的障碍

  大多数让信息无法隐藏的障碍都是由于惯用某些技术而导致的心理障碍

找出容易改变的区域

  好的程序所面临的最重要的挑战之一就是适应变化。目标应该是把不稳定的区域隔离出来。下边就是应对变动措施:

  1. 找出看起来容易变化的项目
  2. 把容易变化的项目分离出来 把容易变化的组件单独划分为类
  3. 把看起来容易变化的项目隔离出来

如何定位容易变化的区域:

在使用状态变量时增加至少两层的灵活性和可读性:

预料不同程度的变化

  让变化的影响或范围与发生该变化的可能性成反比。办法:从程序的核心开始,增量扩展,不断扩充系统,同时考虑质的变化,比如让程序变成线程安全,这些潜在的改进的区域就是系统中潜在的变化。

保持松散耦合

  耦合度设计的目标是创建出小的、直接的、清晰的类或子程序,使它们的与其他类或子程序之间关系尽可能的灵活。耦合的标准如下:

耦合的种类:

  1. 简单数据参数耦合
  2. 简单对象耦合
  3. 对象参数耦合
  4. 语义上的耦合(使用了另一个模块的工作细节的语义知识)。比如module1向module2传递一个控制标志,这样就需要了解module2对控制标志的使用

要点


其它
二分查找算法很优雅,可往往一个蛮力的,顺序的查找算法就可以了
自上而下策略和自下而上策略的最关键区别在于,前者是一种分解策略而后者是一种合成策略
最大的设计问题通常不是来自于那些我认为是很困难的,并且在其中做出了不好的设计的区域;而是来自于那些我认为是简单的,而没有做出任何设计的区域
你在应用某种设计方法越教条化,你所能解决的现实问题就会越少 软件开发更多地是由理论指导还是由实践指导?软件开发从根本上而言是创造性还是确定性的?《software creativity》

目录