本专栏是博主个人笔记,主要目的是利用碎片化的时间来记忆软工知识点,特此声明!
文章目录
1.总体设计的基本目的?
总体设计又称为概要设计或初步设计,主要回答“概括地说,系统应该如何实现”这个问题
2.总体设计的任务?
- 通过这个阶段的工作,划分出组成系统的物理元素
- 设计软件的结构,确定系统中每个程序是由哪些模块组成的,以及模块之间的关系
3.总体设计过程由哪两个阶段组成?
系统设计阶段、结构设计阶段
4.总体设计的步骤?
- 设想供选择的方案
- 选取合理的方案
- 推荐最佳方案
- 功能分解
- 设计软件结构
- 设计数据库
- 制定测试计划
- 书写文档
- 复查和审查
5.书写文档记录总体设计的结果,文档的内容有哪些?
- 系统说明
- 用户手册
- 测试计划
- 详细的实现计划
- 数据库设计结果
6.面向数据流的设计方法是什么?
需求分析阶段得到的数据流图是总体设计的极好出发点,如果数据流图已经细化到适当的层次,则可以直接从数据流图映射出软件结构,这就是面向数据流的设计方法。
7.总体设计遵循哪些原理?
- 模块化
- 抽象
- 逐步求精
- 信息隐藏和局部化
- 模块独立
8.什么是模块化?
模块化就是将程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。
9.模块化的好处?
- 采用模块化原理可以使软件结构更加清晰,不仅容易设计也容易阅读和理解
- 使软件容易测试与调试
- 有助于提高软件的可靠性
- 有助于提高软件的可修改性
- 有助于开发工程的组织管理
10.什么是抽象?与软件工程过程有什么关系?
抽象是指抽出事物的本质特性而暂时不考虑他们的细节
软件工程过程的每一步都是对软件解法的抽象层次的一次精化
11.什么是逐步求精?
逐步求精是指“为了能够集中精力解决主要问题而尽量推迟对问题细节的考虑”,它是人类解决复杂问题时采用的基本方法,也是许多软件工程技术的基础。求精实际上是细化过程,抽象与求精是一对互补的概念。
【注】可以把逐步求解看作是一项把一个时期内必须解决的种种问题按优先级排序的技术
12.什么是模块独立?
模块独立的概念是模块化、抽象、信息隐藏和局部化概念的直接结果
13.为什么模块的独立性很重要?
- 有效的模块化软件比较容易开发出来
- 独立的模块比较容易测试和维护
14.什么是耦合?
耦合是衡量不同模块彼此间互相依赖的紧密程度。耦合的强弱取决于模块间接口的复杂程度,进入或访问一个模块的点,以及通过接口的数据。
15.什么是内聚?
内聚是衡量一个模块内部各个元素彼此结合的紧密程度
16.开发软件对耦合与内聚追求的准则是什么?
开发软件追求“低耦合、高内聚”的准则,实践表明内聚更重要
17.耦合程度由低到高排序?并分别举例
- 数据耦合:两个模块间通过参数交换信息,而且交换的信息仅仅是数据。比如:两个模块,A模块的运算结果作为参数传入B模块中参与计算
- 控制耦合:传递信息中有控制信息,控制耦合把模块适当分解可以用数据耦合来代替。比如:空调遥控器模块和空调外机模块之间的耦合
- 特征耦合:把整个数据结构作为参数进行传递,而被调用模块只用其中一部分元素。比如:一个系统需要身份证信息,另一个只需要姓名信息,但把整个用户信息传入就会出现特征耦合
- 公共环境耦合:两个或多个模块通过一个公共数据环境相互作用。比如:多个模块共同使用一个全局数组,不同模块可以读、写该数组
- 内容耦合:指如果一个模块与另一个模块的内部属性有关,不经过调用而直接使用另一个模块的程序代码或者内部数据就叫做内容耦合。要坚决避免,比如GOTO语句等。
【注1】无连接耦合的耦合程度最低,但是几乎不可能实现
【注2】设计原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公告环境耦合的范围,完全不用内容耦合
18.内聚程度由高到低排序?并分别举例?
- 功能内聚:模块内所有处理元素属于一个整体,完成单一的功能。比如:一个模块中所有的操作都是为了计算出一个人的年龄
- 顺序内聚:模块内处理元素和同一个功能密切相关,且处理必须顺序执行。比如:计算成绩平均分,先要输入全部的成绩,计算总分之后再做除法计算平均分。计算总分的输出作为计算平均分的输入,有必须的数据传递,限制了先后关系。
- 通信内聚:模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据。比如:有一个子程序负责将输入的信息处理生产报告,同时利用输入数据更新已有的数据,两个操作使用同一个数据源。
- 过程内聚:模块内的处理元素相关,且必须以特定次序执行。比如:计算各班同学的平均成绩,要求以先后顺序输出123班的成绩。
- 时间内聚:一个模块内包含的任务必须在同一段时间内执行。比如:将多个变量的初始化放在同一个模块中实现。
- 逻辑内聚:一个模块完成的任务在逻辑上属于相同或相似的一类。比如:一个模块产生各种类型的输出,打印数字,打印姓名,打印数组等等,他们的功能都是打印输出信息,功能相同。
- 偶然内聚:一个模块完成一组任务,完成任务彼此之间即使有关系,关系也很松散。比如:A模块中有n条语句,但是这些语句彼此之间没有关系。
19.启发式规则有哪些?
- 改进软件结构,提高模块独立性
- 模块规模应该适中
- 深度、宽度、扇入、扇出都应该适当
- 模块作用域应该在控制域之内
- 力争降低模块接口的复杂程度
- 设计单入口和单出口的模块
- 模块功能应该可以预测
20.模块的作用域和控制域分别是什么?
作用域:受该模块内一个判定影响的所有模块的集合
控制域:这个模块本身以及所有直接或从属于它的模块的集合
【注】以上图为例,A模块的控制域就是A、B、C、D、E、F
21.深度、宽度、扇入、扇出分别是什么?
- 深度:表示软件结构中控制的层数,它往往能粗略地表明一个系统的大小和复杂程度
- 宽度:表示软件结构内同一个层次上的模块总数的最大值。一般来说,宽度越大系统越复杂。对宽度影响最大的因素是模块的扇出
- 扇出:表示一个模块直接控制(调用)的模块数目。好的系统平均扇出是3~4个
- 扇入:表示有多少个上级模块调用它,扇入多表面该模块被调用的次数多,比较好
22.层次图与层次方框图中连线所代表的含义有什么区别?
层次图的连线表示调用关系,而层次方框图中连线表示组成关系
【注】第2张图是层次方框图,它是以实体的角度出发进行分析,而层次图是以功能的角度
23.层次图适用于哪种设计软件的过程中使用?
自顶向下
24.结构图中符号含义?
结构图是进行软件设计的另一个有力工具
一个方框代表一个模块,之间的箭头表示模块调用关系,带注释的箭头代表模块调用过程中来回传递的消息
25.层次图和结构图能表示模块间的调用次序吗?
层次图和结构图不能严格表示模块间的调用次序,他们并不指明什么时候调用下层模块,而只是表明一个模块调用哪些模块
26.面向数据流的设计方法目标是什么?信息流包括什么?
面向数据流的设计方法目标是给出设计软件结构的一个系统化的途径
信息流包括变换流与事物流
27.制定测试计划和设计测试用例一样吗?为什么
二者不一样,因为在总体设计阶段制定测试计划,但此时还没有具体的代码实现,所以无法具体的写出每条测试用例。
28.总体设计的必要性?
可以站在全局高度上,花较少的成本,从比较抽象的层次上分析对比多种可能的系统实现方案和软件结构,从中选出最佳方案和最合理的软件结构,从而用较低成本开发出较高质量的软件系统。
章末小结
总体设计阶段的基本目的是用比较抽象概括的方式确定系统如何完成预定的任务,也就是说:应该确定系统的物理配置方案,并且进而确定组成系统的每个程序的结构。因此,总体设计阶段主要由两个小阶段组成。首先需要进行系统设计,从数据流图出发设想完成系统功能的若干种合理的物理方案,分析员应该仔细分析比较这些方案,并且和用户共同选定一个最佳方案。然后进行软件结构设计,确定软件由哪些模块组成以及这些模块之间的动态调用关系。层次图和结构图是描绘软件结构的常用工具。
在进行软件结构设计时应该遵循的最主要的原理是模块独立原理,也就是说,软件应该由一组完成相对独立的子功能的模块组成这此模块彼此之间的接口关系应该尽量简单。
抽象和求精是一对互补的概念,也是人类解决复杂问题时最常用、最有效的方法。在进行软件结构设计时一种有效的方法就是,由抽象到县体地构造出软件的层次结构。软件工程师在开发软件的长期实践中积累了丰富的经验,总结这些经验得出一些很有参考价值的启发式规则,它们往往能对如何改进软件设计给出宝贵的提示。在软件开发过程中既要充分重视和利用这些启发式规则,又要从实际情况出发避免生搬硬套。
自顶向下逐步求精是进行软件结构设计的常用途径;但是,如果已经有了详细的数据流图,也可以使用面向数据流的设计方法,用形式化的方法由数据流图映射出软件结构。应该记住这样映射出来的只是软件的初步结构 ,还必须根据设计原理并且参考启发式规则,认真分析和改进软件的初步结构以得到质量更高的模块和更合理的软件结构。
在进行详细的过程设计和编写程序之前,首先进行结构设计,其好处正在于可以在软件开发的早期站在全局高度对软件结构进行优化。在这个时期进行优化付出的代价不高,却可以使软件质量得到重大改进。
反反复复,扎扎实实;念念不忘,必有回响!