无论是以何种方式来进行设计,小型项目也能和大型项目一样从精心的设计之中获益,而如果能认识到设计是一项明确的活动,你就更会获益匪浅。

设计过程充满了不确定性,因此设计技术也趋于探索性质、

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

设计特征:

  • 最小复杂度
  • 易于维护
  • 松散耦合
  • 可扩展性
  • 可重用性
  • 高扇入:大量的类使用某个给定的类
  • 低扇出:一个类里少量/适量地使用其他的类
  • 可移植性
  • 精简性
  • 层次性
  • 标准技术:尽量少依赖外来的,尽量使用标准的、常用的

系统层设计图应该是无环图

抽象是一种能让你在关注某一概念的同事可以放心地忽略其中一些细节的能力——在不同的层次处理不同的细节。抽象的主要好处就在于它使得你能忽略无关的细节,抽象是我们用来得以处理显示世界中 复杂度的原著中重要手段

在设计一个类的时候,一项关键性的决策就是确定类的哪些特性应该对外可见,而哪些特性应该隐藏起来

信息隐藏中所说的秘密主要分为两大类:

  • 隐藏复杂度,
  • 隐藏变化源

把容易变化的地方隔离开来

  • 业务规则
  • 对硬件的依赖性
  • 输入和输出
  • 非标准的语言特性
  • 困难的设计区域和构建区域
  • 状态变量

常用的设计模式

  • 抽象工厂(Absctruct Factory):通过制定对象组的种类而非对单个对象的类型来支持创建一组相关的对象
  • 适配器(Adapter):把一个类的接口转变成另一个接口
  • 桥接(Bridge):把接口和实现分离开来,使他们可以独立变化
  • 组合(Composite):创建一个包含其他同类对象的对象,使得客户端代码可以与最上层对象交互而无需考虑所有的细节对象
  • 装饰器(Deractor):给一个对象动态的添加职责,而无需为了每一种可能的职责配置情况去创建特定的子类(派生类)
  • 外观(Facade):为没有提供一直接口的代码提供一个一致的接口
  • 工厂方法(Factory Method):做特定基类的派生类的实例化时,除了在Factory Method内部之外均无需了解各派生对象的具体类型
  • 观察者(Observer):使一组相关对象相互同步,方法是让另一个对象负责:在这组对象中的任何一个发生改变时,由它把这种变化通知给这个组里的所有对象
  • 单例模式(Singleton):为有且仅有一个实例的类提供一种全局访问的可能
  • 策略(Strategy):定义一组算法或者行为,使得他们可以动态地相互替换
  • 迭代方法(Iterator):提供一个服务对象来顺序的访问一组元素中的各个元素
  • 模板方法(Template Method):定义一个操作的算法结构,但是把部分实现的细节留给子类(派生类)

设计模式的益处

  • 设计模式通过提供县城的抽象来减少复杂度
  • 设计模式通过把常见解决方案的细节予以制度化来减少出错
  • 设计模式通过提供多种设计方案而带来启发性价值
  • 设计模式通过把设计对话提升到一个更高的层次上来简化交流

设计模式的陷阱

  • 强迫让代码适用于某个模式
  • 为了模式而模式

设计中启发式方法的总结:

  • 寻找显示世界的对象
  • 形成一致的抽象
  • 封装实现细节
  • 在可能的情况下继承
  • 信息隐藏
  • 找出容易改变的区域
  • 找出容易改变的区域
  • 保持松散的耦合
  • 探寻通用的设计模式

  • 高内聚性
  • 构造分层结构
  • 严格描述这类契约
  • 分配职责
  • 为测试而设计
  • 避免失误
  • 有意识地选择绑定时间
  • 创建中央控制点
  • 考虑蛮力
  • 画一个图
  • 保持设计模块化

解决问题的方法

  1. 理解问题
  2. 设计一个计划,找出现有数据和未知量之间的关系
  3. 执行计划
    4.回顾

实际上,如果你尝试了一些设计方案,但没有很好的解决问题的时候,更自然的方式是让那些问题留在未解决的状态,等到你拥有更多信息之后再去做

迭代、分而治之、自上而下(分解)、自下而上(合成)

记录你的设计成果

  • 把设计文档插入到代码
  • 用wiki来记录设计讨论和决策
  • 写总结邮件
  • 使用数码相机
  • 保留设计挂图
  • 使用CRC卡片
  • 在适当的细节层创建UML图

核对表:软件构造中的设计

设计实践

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

设计目标

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

要点

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

《代码大全》阅读笔记-5-软件构建中的设计相关推荐

  1. 读书笔记:《代码大全第2版》 02.创建高质量的代码之软件构建中的设计

    文章目录 软件构建中的设计 1.软件设计的特征与挑战 2.管理复杂度 3.好的设计所具有的特征 4.软件设计的层次 5.软件设计方法 5.1 找出现实世界中的对象 5.2 形成一致的抽象 5.3 封装 ...

  2. 《代码大全2》第5章 软件构建中的设计

    目录 前言 本章主题 5.1 设计中的挑战 5.1.1 设计在软件构建中所处的角色 5.1.2 设计是一个险恶的问题 5.2 关键的设计概念 5.2.1 软件的首要技术使命:管理复杂度 1. 管理复杂 ...

  3. 代码大全阅读笔记01

    软件开发过程中的不同活动:定义问题.需求分析.规划构造.软件架构(或高层设计).详细设计. 编程与调试.单元调试.集成测试.集成.系统测试.保障测试.构建活动主要是编码与调试,但也有其他 的活动. 构 ...

  4. 代码大全阅读笔记02

    第二部分:创建高质量的代码 第一部分主要介绍了开发过程和需求分析,强调了构建的重要性,可以说十介绍了技术层面的一些东西.第二部分把目光放到了更加细节的地方,也开始看到了一些代码.内容十分全面,也写了很 ...

  5. 【读书笔记】代码大全34章:软件工艺主题

    这本书大部分讲的都是软件开发的细节,本章节讲的主要是从宏观角度讲解软件工艺. 控制复杂度 软件开发的精髓就是控制复杂度 降低复杂度的方法 将系统拆分成子系统 精心设计接口,尽量隐藏设计细节 避免使用全 ...

  6. 《梦断代码》阅读笔记01

    这几天阅读了老师推荐的<梦断代码>前几章,通过本书简介可以知道本书大概主要讲的是做软件过程中的困难. 第一章软件时间,主要讲的是从事软件制作行业的艰辛,需要没日没夜的加班工作,书中有这样一 ...

  7. 《梦断代码》阅读笔记之第8章至最后

    以下是我读了梦断代码第八章之后的读书笔记: 1.自己做的软件自己一定要用,即"吃你自己的狗食",自己的软件开发出来后自己都不会用那么还要指望别人用不成? 2.在软件开发编写代码的时 ...

  8. onvif学习笔记7:一个C++封装的onvif代码的阅读笔记

    在前面的文章<onvif学习笔记4:Windows环境使用gsoap生成onvif框架代码>.<onvif学习笔记5:onvif框架代码初步了解>中,我们了解了如何生成不同的版 ...

  9. 用计算机设计软件,平面设计中计算机设计软件的作用

    摘要:计算机平面设计在整个平面作品的设计中扮演着十分重要的角色,通过有效的计算机平面设计能够为人们提供更多的平面设计作品.为此,文章在阐述平面设计中计算机设计软件应用意义的基础上,为如何将计算机设计软 ...

最新文章

  1. R语言sub函数和gsub函数替换(replace)匹配的字符串实战
  2. Redis+Nginx+设计模式+Spring全家桶+Dubbo+阿里P7技术精选文档
  3. Spring Boot集成CKEditor
  4. 全球及中国血铅检测服务行业应用动态及未来产销需求预测报告2022版
  5. LibreOj 6279数列分块入门 3 练习了一下set
  6. Angular2 - [innerHTML] pipe(把字符串里的 /n 替换成 <br/>)
  7. 【驱动】使用结构体 file_operations封装驱动设备的操作 | 结构体初始化
  8. python中的@property(get与set作用
  9. 用SQL实现记录上下移动的思路
  10. Gartner预测2019年全球IT支出将达到3.8万亿美元
  11. 一次清空所有数据方法
  12. MySQL数据库导入SQL[ERR]Unknown collation: ‘utf8mb4_0900_ai_ci‘的解决办法
  13. python 阿里云短信接口_python 之阿里云短信服务接入流程短信接口
  14. 企业数据防泄漏解决方案的介绍!
  15. 绘制地图其实并不难!如何绘制地图?看看Smartbi的制作方法
  16. 《颠覆我认知的30篇文章 》阅读笔记(一)
  17. 记录一个关于oracle数据库us7ascii字符集解决的方法
  18. 英特尔2018年处理器一览
  19. U盘启动盘装系统Win10教程
  20. java金花_炸金花绝对大小计算、比较及排序算法(Java),包含花色参与和不参与大小比较...

热门文章

  1. event-config.h指明所在系统的环境
  2. sqlmap 注入方式、使用总结
  3. C#MessageBox.Show报错,无法识别函数
  4. 浅谈ORB-SLAM3
  5. C++:C++中public protected private关键字用法
  6. php中的Register Globals
  7. 最易懂的layui分页
  8. Poj_1325 Machine Schedule -最大匹配性质题目
  9. 博文写作——摘要摘要图标
  10. virtualbox+oracle linux 6.3 下安装oracle 11.2.3.0