2019独角兽企业重金招聘Python工程师标准>>>
1. 软件的总体结构主要要回答的问题
- 软件的组成部分
- 软件的层次关系
- 模块的内部处理逻辑
- 模块之间的界面
2. 软件设计方法
- 结构化设计方法(SD)
- 面向数据结构的设计方法(JSD)
- 面向对象的设计方法(OOD)
3. 软件设计分为两个阶段
- 概要设计(总体设计)
确定软件的结构以及各组成成分(子系统或模块) - 详细设计
确定模块内部的算法和数据结构,产生描述各模块程序过程的详细文档
软件设计的基本概念
- 模块化
- 抽象与细化
- 信息隐蔽
- 软件复用
1. 模块化
模块化: 把程序划分成若干个模块, 每个模块完成一个子功能, 把这些模块集总起来组成一个整体,可以完成指定的功能,满足问题的功能.
模块: 一个拥有明确定义的输入、输出和特性的程序实体。
- 将系统划分成模块
- 决定每个模块的功能
- 决定模块的调用关系
- 决定模块的界面, 即模块间传递的数据
2. 抽象(Abstraction)与细化
抽象:解决问题时只考虑与问题有关的方面,不考虑与问题无关的方法。即抽出事物的本质特性而不考虑细节。
细化:即分解。在逐步细化中,特别强调这种分解的“逐步”性质,即每一部分仅较其前一步增加“少量”的细节。这样,在相信的两步之间就只有变化, 不难验证它们的内容是否等效。
3. 信息隐蔽
信息隐蔽的含义: 有效的模块化可以通过定义一级独立的模块来实现,这些模块相互之间只交流软件功能必需的信息。
换句话说:模块所包含的信息,不允许 其它不需要这些信息的模块访问,独立的模块间仅仅交换为完成系统功能而必须交换的信息。
信息隐蔽的基本原则:功能独立,高内聚且低耦合
模块化设计
模块化是好的软件设计的一个基本准则,可减小钥匙所需要的总工作
分解 分解
高层模块 =======> 分解复杂问题 ========> 较小问题
1. 分解
若C(p1) > C(p2), 则E(p1) > E(p2)
其中p1和p2是两个问题,C(x)是由X问题决定的复杂性, E(X)是解决X问题所需要的工作量。
试验发现:
C(p1 + p2) > C(p1) + C(p2)
E(p1 + p2) > E(p1) + E(p2)
越小成本越低,但是集成成本却随着越小成功越高。如何确定模块划分的最小成本区,并保证模块的最佳性能,量设计活动中的主要任务之一。
2. 模块独立 性
1)模块独立性的概念:
- 模块完成独立的功能
- 符合信息隐蔽和信息局部化原则
- 模块间卷边和依赖程度尽量小
2)模块独立性的度量
模块独立性取决于模块的内部和外部特征。
SD方法提出的定性的度量标准:
- 模块自身的内聚性
- 模块之间的耦合性
模块独立性的度量之一:内聚性
一个模块内部各成分之间相互关联的强度。
设计目标:高内聚(一个模块的所有成分都直接参与 并县城对于完成同一功能来说都是最基本的)
内聚性越高,模块独立性越强,由低向高的内聚方式为:
- 巧合内聚
- 逻辑内聚
- 时间内聚
- 过程内聚
- 通信内聚
- 信息内聚
- 功能内聚
(1)巧合内聚
模块内各分部间无联系, 例:
MOVE O TO R
READ FILE F
MOVE S TO T
模块中的三个语句没有任何联系,
缺点:可理解性差, 可修改性差。
(2)逻辑内聚
把几种相关功能(逻辑上相似的功能)组合在一模块内, 每次调用由传给模块的参数确定执行哪种功能。
缺点:增强了耦合程序(控制耦合),不易修改,效率低
(3)时间内聚
模块完成的功能必须在同一时间内执行,这些功能只因时间因素关联在一起。如
- 初始化系统模块
- 系统结束模块
- 紧急故障处理模块
(4)过程内聚
模块内各处理成分相关,且必须以特定次序执行
(5)通信内聚
模块内各部分使用相同的输入数据,或产生相同的输出结果
(6)信息内聚
信息内聚指模块写成多个功能,各个功能都在同一数据结构上操作,每个功能有唯一入口。如对同一个数据库的查找-添加-删除-修改模块
(7)功能内聚
模块仅包括为完成某个功能所必须的所有成分(模块所有成分共同完成一个功能,缺一不可)
模块独立性的度量之二
耦合性是模块间相互依赖程度的度量,耦合的强弱取决于模块间接口的复杂程度,进入或访问一个模块的点,以及通过接口的数据
耦合性越高,模块独立性越弱, 耦合强度依赖的因素:
- 一模块对另一模块的引用
- 一模块向另一模块传递的数据量
- 一模块施加到另一模块的控制数量
- 模块间接口的复杂度
(1)非直接耦合
两个模块没有直接关系,模块独立性最强。
(2)数据耦合
一个模块调用另一模块时,被调用模块的输入输出都是简单的数据,性松散耦合
(3)标记耦合
如两个模块通过传递数据结构(不是简单的数据,而是记录,数组等)加以联系,或都与一个数据结构有关系,则称这两个模块间存在标记耦合
信息情况是一个数据结构,图中模块都与此数据结构产生依赖关系,它们之间也是标记耦合
(4)控制耦合
一模块通过开关量、标志、名字等控制信息,明显地控制另一模块
控制耦合增加了理解和编程的复杂性,调用模块必须知道被调用模块的内部逻辑,增加了相互依赖
去除模块间控制耦合的方法:
1)将被调用模块内的判定上移到调用模块中进行
2)被调用模块分解成若干单一功能模块。
(5)外部耦合
一组模块均与同一外部环境关联(例如: I/O模块与特定的设备、模式和通信 协议关联),它们之间便存在外部耦合。
外部耦合必不可少,但是这种模块数目应尽量少。
(6)公共耦合
一组模块引用同一个共用数据区(也称全局数据区,公共数据环境)
公共数据区指:
- 全局数据结构
- 共享通讯区
- 内存公共覆盖区等
公共耦合存在的问题:
- 软件可理解性降低: 模块间存在错综复杂的联系
- 软件可维护性差: 修改变量名或属性困难
- 软件可靠性差: 公共数据区及全程变量无保护措施
慎用公共数据区和全程变量
(7)内容耦合
一模块直接访问另一模块的内部信息(程序代码或数据),最不好的内容耦合形式
发生内容耦合的情形:
- 一模块直接访问另一模块的内部数据
- 一模块不通过正常入口转到另一模块内
- 两模块有一部分代码重叠
- 一模块有多个入口
如何降低耦合度?
1)如模块必须存在耦合,选择适当的耦合类型
原则:
尽量使用数据耦合
少用控制耦合
限制公共耦合的范围
坚决避免使用内容耦合
2)降低模块间接口的复杂性