读代码大全2——第五章 软件构建中的设计

设计是一个险恶的问题
你必须首先把问题“解决”一遍以便能够明确地定义它,然后再次解决该问题,从而形成一个可行的方案。这一过程已经如影随形地在软件开发中存在数十年了。

关键的设计概念
软件的首要技术使命:管理复杂度

如何应对复杂度
  • 把任何人在同一时间需要处理的本质复杂度减到最少;
  • 不要让偶然性的复杂度无谓地快速增长。

理想的设计特征
     高质量的设计具有很多常见的特征,这些目标之间有时会相互抵触,需要在一系列相互竞争的目标之中做出一套最好的折中方案。
  • 最小的复杂度
  • 易于维护 为做维护工作的程序员着想
  • 松散耦合
  • 可扩展性
  • 可重用性
  • 高扇入 让大量的类使用某个特定的类(工具类)
  • 低扇出 让一个类里少量或者适中地使用其他的类,超过约7个为高扇出
  • 可移植性
  • 精简性 伏尔泰曾说,一本书的完成,在它不能再删去任何内容的时候
  • 层次性
  • 标准技术

设计的层次
第一层 软件系统
第二层 分解为子系统或包
这一层的主要设计活动就是确定如何把程序分为主要的子系统,并定义清楚允许各子系统如何使用其他子系统。
常用的子系统
业务规则、用户界面、数据库访问、对系统的依赖性
第三层 分解为类
第四层 分解成子程序
第五层 子程序内部的设计

设计构造块:启发式方法
找出现实世界中的对象,使用对象进行设计的步骤是:
  • 辨识对象及其属性
  • 确定可以对各个对象进行的操作
  • 确定各个对象能对其他对象进行的操作:包含、继承
  • 确定对象的哪些部分对其他对象可见
  • 定义每个对象的接口

信息隐藏在设计的所有层次上都有很大的作用——从用具名常量代替字面量(literal),到创建数据类型,再到类的设计、子程序的设计以及子系统的设计等等。
养成“我该隐藏些什么?”的习惯会使得很多很棘手的设计难题化解。

关于设计启发的总结:
  • 寻找现实世界的对象(object,物体)
  • 形成一致的抽象
  • 封装实现细节
  • 在可能的情况下继承
  • 藏住秘密(信息隐藏)
  • 找出容易改变的区域
  • 保持松散耦合
  • 探寻通用的设计模式
  • 下列的启发式方法有时也很有用:
  • 高内聚性
  • 构造分层结构
  • 严格描述类契约
  • 分配职责
  • 为测试而设计
  • 避免失误
  • 有意识地选择绑定时间
  • 创建中央控制点
  • 考虑使用蛮力
  • 画一个图
  • 保持设计模块化

设计实践
迭代:设计是一种迭代过程
分而治之
自上而下和自下而上的设计方法
建立试验性原型:写出用于回答特定设计问题的、量最少且能够随时扔掉的代码
合作设计

推荐书籍:
软件设计
面向对象的思考过程(第二版)
OOD启思录
☐Programming on Purpose: Essays on software design

软件设计理论


设计模式
Design Patterns 设计模式 四人组
Design Patterns Explained 设计模式精解

广义的设计
Conceptual Blockbusting:A Guide to better Ideas
How to solve it:A New Aspect of Mathematical Method Polya
如何求解问题——现代启发式方法


核对表:软件构造中的设计
设计实践:
  • 你已经做过多次迭代,并且从众多尝试结果中选择最佳的一种,而不是简单选择第一次尝试的结果吗
  • 你尝试用多种方案来分解系统,以确定最佳方案吗
  • 你同时用自下而上和自上而下的方法来解决设计问题吗
  • 为了解决某些特定问题,你对系统中的风险部分或者不熟悉的部分创建过原型、写出数量最少的可抛弃的代码吗
  • 你的设计方案被其他人检查了吗(无论正式与否)?
  • 你一直在展开设计,直到实施细节跃然纸上了吗
  • 你用某种适当的技术——比如说Wiki、电子邮件、挂图、数码照片、UML、CRC卡或者在代码写注释——来保留设计成果吗

设计目标
  • 你的设计是否充分地处理了由系统架构层定义出并且推迟确定的事项?
  • 你的设计被划分为层次吗
  • 你对把这一程序分解成为子程序、包和类的方式感到满意吗?
  • 类与类之间的交互关系是否已设计为最小化了
  • 类和子程序是否被设计为能够在其他的系统中重用
  • 程序是不是易于维护
  • 设计是否精简?设计出来的每一部分都绝对必要吗
  • 设计中是否采用了标准的技术,是否避免使用怪异且难以理解的元素
  • 整体而言,你的设计是否有助于最小化偶然性的河本质性的复杂度吗

要点
  • 软件的首要技术使命就是管理复杂度。以简单性作为努力目标的设计方案对此最有帮助
  • 简单性可以通过两种方式来获取:一是减少在同一时间所关注的本质性复杂度的量,而是避免生成不必要的偶然的复杂度
  • 设计是一种启发式的过程。固执于某一种单一方法会损害创新能力,从而损害你的设计
  • 好的设计都是迭代的。你尝试设计的可能性越多,你的设计最终方案就会变得越好
  • 信息隐藏是个非常有价值的概念,通过询问“我该隐藏什么”能够解决很多困难的设计问题
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值