代码大全读书笔记(第二部分)——创建高质量的代码

目录

 

第五章:软件构建中的设计

设计是一个险恶的问题

关键的设计概念

理想的设计应有的特征

设计的层次

第一层:软件系统

第二层:子系统

第三层:类

第四层:分解成子程序

第五层:子程序内部的设计

设计的方法

找出现实世界中的对象

形成一致的抽象

封装实现细节

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

信息隐藏

找出容易改变的区域

保持松散耦合

耦合的种类:

常用设计模式(略)

设计模式的好处

其他的设计思想

高内聚

构造分层结构

分配职责

为测试而设计

避免失误

画一个图

保持设计的模块化


第五章:软件构建中的设计

设计就是把需求分析和编码调试连接在一起的一个活动。

设计是一个险恶的问题

  • 只有解决了一个问题才能更好的明确问题,但是通过对设计模式的学习,在开始解决问题之前也可以问题分析,选择合理的设计方式,使得设计出的代码结构更加可扩展易维护。
  • 设计的过程中进行合理性分析,部分测试,以保证设计的正确合理。设计阶段
  • 设计就是确定取舍以及调整顺序
  • 设计也要受到需求的约束(平台,工期,成本)
  • 设计是一个启发式的过程,并不是一个重复性的工作
  • 设计是自然而然的,在一个软件构建的过程中自然需要设计的存在

关键的设计概念

  • 软件的首要技术使命就是管理软件的复杂度
  • 所有软件设计技术的目标都是把复杂问题分解成简单的部分
  • 写出能让自己的容易理解,也能让别人看懂,并且很少有错误的代码

理想的设计应有的特征

  • 最小的复杂度:如果设计方案不能让自己专注于程序的某一部分的时候安心忽视其他部分的话这一设计就没什么用了
  • 易于维护:结构清晰,符合人类习惯的代码,做到自明(self-explanatory)
  • 松散耦合:类与类之间的关联尽可能少
  • 可扩展性:新增系统功能时无需破坏现有结构
  • hight fan-in:让大量的类能够利用某个给定的类,利用好工具类
  • low fan-out:一个类中尽量少的引用多个类,减少关联
  • 可移植性:复用方面的考虑,尽量避免与业务逻辑混杂
  • 精简性:设计的完备在于不能在这个设计中删减任何东西,而不在于这个设计现在已经包含了足够多的东西
  • 标准技术:尽量用标准的常用的方法,库,不给自己挖坑也让后来者能更好的理解运用
  • 层次性:保持系统各个层次分离但是有联系,从任何一个层次关注系统的时,不需要关注其他层也能很好的理解并且运用这一层

设计的层次

第一层:软件系统

第二层:子系统

  • 这一层的设计主要目标是为了把系统分解,降低复杂度,并且定义清楚各个子系统如何使用其他子系统。
  • 不同子系统之间的通信规则要划分清楚,规定一种合理的数据流向,减少各个子系统之间通信的必要性。
  • 尽量简化子系统之间的交互关系,程序中不应该有任何环形关系。
  • 常见的子系统 :MVC三层+S层

第三层:类

  • 这一层的主要设计任务是把所有的子系统进行适当的分解,并确保分解的粒度恰到好处,每个细节都能用单个的类实现
  • 类与对象的区别:类是静态的,对象是动态的,类是对象的模型,对象是类的实例。

第四层:分解成子程序

  • 这一层的设计包括把每个类细分为子程序
  • 完整地定义类内部的子程序,有助于更好地理解类的接口。反过来也有助于对接口进行更好的设计,完善检查类的设计是否合理

第五层:子程序内部的设计

  • 选择合适的算法,做到一个子程序的职责单一

设计的方法

找出现实世界中的对象

  • 首先辨识对象以及对象的属性包括这个对象包含的方法和数据

计算机程序通常都是基于现实世界的实体,而同时这些实体又都有一些与计算机程序相关的特征。把软件中的对象一一映射为现实世界中的对象,有利于对问题的理解。

  • 确定各个对象进行的操作

对象要满足什么操作需求

  • 确定各个对象能对其他对象进行的操作

理清各个对象之间的关系,最常见的俩种就是包含和继承

  • 确定可见性(共有私有)

明确对象哪些部分是公开的,哪些部分是不公开的。

形成一致的抽象

抽象是一种能让你在关注某一概念的同时可以放心地忽略其中一些细节的能力——在不同的层次处理不同的细节。

基类,接口等都是抽象的体现。

抽象的好处在于可以让设计者忽略无关的细节。

优秀的程序员会在子程序接口的层次上,在类接口的层次上以及包接口的层次上——换句话说,在门把手的层次上,门的层次上以及房屋的层次上一一进行抽象,这样才能更快更稳妥的进行开发。

封装实现细节

抽象可以让你从高层的细节来看待一个对象,而封装择是,除此之外你不能看到对象的任何其他细节

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

信息隐藏

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

“这里的信息隐藏包含属性方法的共有私有的设计以及代码封装的概念”

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

这个类需要隐藏些什么?——如果你能在类的公开接口中增加函数或者数据而不牺牲该类的隐秘性,那么就做下去,否则停止

找出容易改变的区域

设计的目标应该是把不稳定的区域隔离出来,从而把变化带来的影响限制在一个子程序,类内部。

  • 类的接口应该肩负起保护类隐私的职责,要做到对潜在的变化不敏感。
  • 不用布尔变量做状态变量
  • 使用访问器子程序取代对变量的直接访问
  • 预料不同程度的变化做出不同程度的应对

保持松散耦合

尽量使设计出来的模块不依赖或者很少依赖其他模块。

  •  规模越小越好,也就是说模块之间的连接数越少越好。
  • 可见性:模块之间的连接是通过显示的传递数据来进行改变,而不是通过修改某个全局变量进行联系。
  • 灵活性:模块之间的连接要容易改动。

耦合的种类:

  1. 简单参数耦合:俩个模块之间通过简单数据类型进行传递数据。
  2. 简单对象耦合:module1 包含一个module2的实例
  3. 对象参数耦合:object1要求object2传递object3,这需要o1了解o3的信息。
  4. 语义耦合:一个模块用到了另一个模块的内部工作细节的语义。类似控制标志,全局数据影响,调用时序影响,部分初始化等。

如果对一个模块的使用要求你同时关注好几件事,其内部的工作细节,对全局数据的修改,不确定的功能点。那么就失去了抽象的能力

常用设计模式(略)

通过《大话设计模式》去学习相关的设计模式。

设计模式的好处

  • 设计模式通过提供现成的抽象来减少复杂度
  • 设计模式通过把常见解决方案的细节予以制度化来减少出错
  • 设计模式通过提供多种设计方案而带来启发性的价值
  • 设计模式可以把设计之间的对话提升到一个更高的层次,以此简化交流
  • 设计模式是一个强大的管理复杂度的工具

其他的设计思想

高内聚

内聚性指的是类内部的子程序或者子程序内的所有代码在支持一个中心目标的紧密程度

构造分层结构

把一个系统进行分层,有助于降低复杂度。

分配职责

为测试而设计

避免失误

画一个图

保持设计的模块化

你在引用磨口设计方法时越教条化,你所能解决的现实问题就越少,请把设计看成是一个险恶的,杂乱的和启发式的过程。

不要停留于你所想到的第一套解决方案,而是去寻求合作,探求简洁性,在需要的时候做出原型,迭代,并且进一步迭代,你将对自己的设计成果感到满意。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值