七. 软件工程
1. 软件工程概述
(1)软件生存周期
(2)软件过程
软件开发中所遵循的路线图称为 "软件过程"。
针对管理软件开发的整个过程,提出了两个模型:能力成熟度模型(CMM)和能力成熟度模型集成(CMMI)。
能力成熟度模型(CMM):
对软件组织进化阶段的描述,随着软件组织定义、实施、测量、控制和改进其软件过程,软件组织的能力经过这些阶段逐步提高。
- 一级:初始级
杂乱无章,甚至混乱,几乎没有明确定义的步骤,项目的成功完全依赖个人的努力和英雄式核心人物的作用。
- 二级:可重复级
建立了基本的项目管理过程和实践来跟踪项目费用、进度和功能特性,有必要的过程准则来重复以前在同类项目中的成功。
- 三级:已定义级
管理和工程两方面的软件过程已经文档化、标准化,并综合成整个软件开发组织的标准过程。
- 四级:已管理级
制定了软件过程和产品质量的详细度量标准。
- 五级:优化级
加强了定量分析,通过来自过程质量反馈和来自新观念、新技术的反馈使过程能不断持续地改进。
CMM 的五个级别由浅入深,逐渐成熟,使得整个过程不断改进,循序渐进。
能力成熟度模型集成(CMMI):
CMMI 是若干过程模型的综合和改进,是支持多个工程学科和领域的、系统的、一致的过程改进框架,能适应现代工程的特点和需要,提高过程质量和效率。
CMMI 提供了两种表示方法,阶段式模型和连续式模型。
阶段式模型:
结构类似于 CMM,关注组织的成熟度,有五个成熟度等级。
- 初始级:过程不可预测且缺乏控制。
- 已管理级:过程为项目服务。
- 已定义级:过程为组织服务。
- 定量管理级: 过程已度量和控制。
- 优化级:集中于过程改进。
连续式模型:
关注每个过程域的能力,有六个等级。
- CL0(未完成的):未执行或未得到目标。
- CL1(已执行的):可标识的输入工作产品转换成可标识的输出工作产品。
- CL2(已管理的):已管理的过程的制度化。
- CL3(已定义的):已定义的过程的制度化。
- CL4(定量管理的):可定量管理的过程的制度化。
- CL5(优化的):量化(统计学)手段改变和优化过程域。
例题1:
以下关于 CMM 的叙述中,不正确的是()。
A.CMM 是指软件过程能力成熟度模型。
B.CMM 根据软件过程的不同成熟度划分了 5 个等级,其中,1 级被认为成熟度最高,5 级最低。
C.CMMI 的任务是将已有的几个 CMM 模型结合在一起,使之构成集成模型。
D.采用更成熟的 CMM 模型,一般来说可以提高最终产品的质量。
解析1:
根据 CMM 模型和 CMMI 模型的定义可知,B 项错误,一级最低,五级最高。
例题2:
CMMI 模型是若干过程模型的综合和改进。连续式模型和阶段式模型是 CMMI 提供的两种表示方法,而连续式模型包括六个过程域能力等级,其中()使用量化(统计学)手段改变和优化过程域,以应对客户要求的改变和持续改进计划中的过程域的功效。
A.CL2(已管理的) B.CL3(已定义的) C.CL4(定量管理的) D.CL5(优化的)
解析2:
根据六个等级的描述可知,CL5(优化的)采用量化统计学手段改变和优化过程域。
2. 软件开发方法
结构化方法:面向过程,适用于需求明确的项目。
- 用户至上
- 严格区分工作阶段,每阶段有任务和结果
- 强调系统开发过程的整体性和全局性
- 系统开发过程工程化,文档资料标准化
- 自顶向下,逐步分解(求精)
原型法:适用于需求不明确的项目。
面向对象方法:适用于复杂的大项目。
- 更好的复用性
- 关键在于建立一个全面、合理、统一的模型
- 分析、设计、实现三个阶段,界限不明确
面向服务的方法
例题:
若用户需求不清晰且经常发生变化,但系统规模不大且不太复杂,则最适宜采用()开发方法,对于数据处理领域的问题,若系统规模不太大且不太复杂,需求变化也不大,则最适宜采用()开发方法。
A.结构化 B.Jackson C.原型化 D.面向对象
A.结构化 B.Jackson C.原型化 D.面向对象
解析:
用户需求经常变化适合采用原型化方法,需求变化不大则适合结构化方法,因此选 CA。
3. 软件开发模型
(1)瀑布模型与 V 模型
瀑布模型
瀑布模型是将软件生存周期中的各个活动规定为依线性顺序连接的若干阶段的模型,规定了由前至后、互相衔接的固定次序,如同瀑布流水逐级下落。
以文档为驱动,适用于软件需求很明确的项目。
瀑布模型的优点:
- 容易理解,管理成本低。
- 强调开发的阶段性早期计划及需求调查和产品测试。
瀑布模型的缺点:
- 客户必须能够完整、正确和清晰地表达需求。
- 进度状态评估困难。
- 测试工作全都集中于项目结束。
- 项目风险把控能力弱。
V 模型
V 模型是瀑布模型的一个变体。描述了质量保证活动和沟通、建模相关活动以及早期构建相关的活动之间的关系。
V 模型将验证确认活动应用于早期软件工程工作中,测试贯彻始终。
例题:
某开发小组欲为一公司开发一个产品控制软件,监控产品的生产和销售过程,从购买各种材料开始,到产品的加工和销售进行全程跟踪。购买材料的流程、产品的加工过程以及销售过程可能会发生变化。该软件的开发最不适宜采用()模型,主要是因为这种模型()。
A.瀑布 B.原型 C.增量 D.喷泉
A.不能解决风险
B.不能快速提交软件
C.难以适应变化的需求
D.不能理解用户的需求
解析:
看到变化的需求首先可以排除瀑布模型,瀑布模型需要用户具有相对明确的需求,所以选 AC。
(2)演化模型(原型模型和螺旋模型)
演化模型是迭代的过程模型,使得软件开发人员能逐步开发出更完整的软件版本。演化模型特别适用于对软件需求缺乏准确认识的情况。
典型的演化模型有原型模型和螺旋模型。
原型模型
原型模型也叫快速原型,适用于用户需求不清、需求经常变化的情况,当系统规模不是很大也不太复杂时,采用该方法较好。
根据使用原型的目的不同,原型可以分为:
- 探索型原型:目的是弄清目标的要求,确定所希望的特性,并探讨多种方案的可行性。
- 实验型原型:目的是验证方案或算法的合理性,用于考查方案是否合适、规格是否可靠等。
- 演化型原型:目的是将原型作为目标系统的一部分,通过对原型的多次改进,逐步将原型演化成最终的目标系统。
螺旋模型
螺旋模型将瀑布模型和演化模型结合,并加入了风险分析模块。适用于庞大、复杂且具有高风险的系统。
螺旋模式支持用户需求的动态变化,并且降低了软件开发的风险,但开发人员需要具备相对丰度的风险评估经验和专门知识。此外,过多次的迭代会增加开发成本,延长提交时间。
例题1:
以下关于系统原型的叙述中,不正确的是()。
A.可以帮助导出系统需求并验证需求的有效性。
B.可以用来探索特殊的软件解决方案。
C.可以用来指导代码优化。
D.可以用来支持用户界面设计。
解析1:
导出系统需求并验证其有效性,是探索型原型的目的。探索特殊的解决方案是实验型原型的功能。演化型原型是将原型作为目标系统的一部分,所以可以支持用户界面设计,并加以应用。因此选项 ABD 正确,C 项错误,原型无法指导代码优化,它的所有功能与目的都与需求相关。
例题2:
以下关于螺旋模型的叙述中,不正确的是()。
A.它是风险驱动的,要求开发人员必须具有丰富的风险评估知识和经验。
B.它可以降低过多测试或测试不足带来的风险。
C.它包含维护周期,因此维护和开发之间没有本质区别。
D.它不适用于大型软件开发。
解析2:
螺旋模型适用于庞大、复杂且具有高风险的系统,因此 D 项错误。
例题3:
某企业拟开发一个企业信息管理系统,系统功能与多个部门的业务相关。现希望该系统能够尽快投入使用,系统功能可以在使用过程中不断改善。则最适宜采用的软件过程模型为()。
A.瀑布模型 B.原型模型 C.演化(迭代)模型 D.螺旋模型
解析3:
该系统希望尽快投入使用,并且使用过程中不断完善,首先可以排除 A 项。而原型模型强调的是需求的变化,且系统规模不大,不太适合尽快投入使用,螺旋模型强调风险分析,题干中并未提出,因此选项 C 更符合。演化模型强调逐步完善软件的过程。虽然原型和螺旋模型都属于演化模型,但要注意各类模型的侧重点。
(3)增量模型
增量模型假设可以将需求分段为一系列增量产品,每一增量可以分别开发。当使用增量模型时,第一个增量往往是核心的产品,客户对每个增量的使用和评估都作为下一个增量发布的新特征和功能,不断迭代,直至产生最终的产品。
例题:
以下关于增量开发模型的叙述中,不正确的是()。
A.不必等到整个系统开发完成就可以使用。
B.可以使用较早的增量构件作为原型,从而获得稍后的增量构件需求。
C.优先级最高的服务先交付,这样最重要的服务接受最多的测试。
D.有利于进行好的模块划分。
解析:
增量模型中第一个增量就能够产生可用的产品,所以不必等到整个系统开发完成就可以使用,A 项正确。用户对每一个增量的使用体验可以作为下一个增量发布的新特征和功能的需求,因此 B 项正确。优先级最高的服务即核心增量先交付,可以进行多轮迭代测试,C 项正确。增量模型中,最困难的工作就是模块划分,因此 D 项错误。
(4)喷泉模型
喷泉模型是一种以用户需求为动力,以对象作为驱动的模型,适合于面向对象的开发方法。喷泉模型使开发过程具有迭代性和无间隙性,也就是各阶段可以重复多次且不存在明显的边界。允许各开发活动交叉、迭代地进行。
例题:
喷泉模型是一种适合于面向()开发方法的软件过程模型。该过程模型的特点不包括()。
A.对象 B.数据 C.数据流 D.事件
A.以用户需求为动力
B.支持软件重用
C.具有迭代性
D.开发活动之间存在明显的界限
解析:
喷泉模型是适合于面向对象的开发方法,根据其特点可知,开发活动之间无间隙,因此选 AD。
(5)统一过程(UP)模型
统一过程模型是一种用例和风险驱动,以架构为中心,迭代且增量的开发过程。将整个软件开发项目划分为多个小项目,每个小项目都包含正常软件项目的所有元素:计划、分析和设计、构造、集成和测试等。
初始
- 确定项目范围和边界
- 识别系统的关键用例
- 展示系统的候选架构
- 估计项目费用和时间
- 评估项目风险
细化
- 分析系统问题领域
- 建立软件架构基础
- 淘汰最高风险元素
构建
- 开发剩余组件
- 构件组装与测试(通常是 α 测试,开发环境)
交付
- 进行 β 测试(用户环境)
- 制作发布版本
- 用户文档定稿
- 确认新系统
- 培训、调整产品
(6)敏捷方法
敏捷方法的基本原则:短平快的会议、小型版本发布、较少的文档、合作为重、客户直接参与、自动化测试、适应性计划调整、结对编程、测试驱动开发、持续集成、重构。
敏捷方法的总体目标是通过 "尽可能早地、持续地对有价值的软件的交付" 使客户满意。适用于小项目小团队。
敏捷方法的典型方法:
极限编程(XP)
4 大价值观:沟通、简单、反馈、勇气。
5 大原则:快速反馈、简单性假设、逐步修改、提倡更改、优质工作。
12 大最佳实践:
- 计划游戏:快速制定计划、随着细节的不断变化而完善。
- 小型发布:系统的设计要能够尽可能早地交付。
- 隐喻:找到合适的比喻传达信息。
- 简单设计:只处理当前的需求,使设计保持简单。
- 测试先行:先写测试代码,然后再编写程序。
- 重构:重新审视需求和设计,重新明确地描述它们以符合新的和现有的需求。
- 结对编程。
- 集体代码所有制。
- 持续集成:可以按日甚至小时为客户提供可运行的版本。
- 每周工作 40 小时。
- 现场顾客:系统最终用户代表应该全程配合 XP 团队。
- 编码标准。
其它敏捷发开方法
敏捷方法 | 特点 |
极限编程XP | 4 大价值观、5 个原则、12 个最佳实践 |
水晶法(Crystal) | 认为每个不同的项目都需要一套不同的策略、约定和方法论,认为人对软件质量有重要的影响(以人为本),因此随着项目质量和开发人员素质的提高,项目和过程的质量也随之提高。通过更好地交流和经常性交付,软件生产力得到提高。 |
开放式源码 | 程序开发人员在地狱上分布很广 |
并列争求法(SCRUM) | 把每 30 天一次的迭代称为一个 "冲刺",并按需求的优先级来实现产品。多个自组织和自治的小组并行地递增实现产品。协调是通过简短的日常情况会议来进行,像橄榄球中的 "并列争球"。 |
功用驱动开发方法FDD | 首席程序员和类程序员。 |
自适应软件开发ASD | ASD有六个基本原则:有一个使命作为指导;特征被视为客户价值的关键点;过程中等待是很重要的,因此 "重做" 与 "做" 同样关键;变化不被视为改正,而是被视为对软件开发实际情况的调整;确定的交付时间被迫开发人员认真考虑每一个生产的版本的关键需求;风险也包含其中。 |
例题1:
在敏捷过程的开发方法中,()使用了迭代的方法,其中,把每段时间(30天)一次的迭代称为一个"冲刺",并按需求的优先级别来实现产品,多个自组织和自治的小组并行地递增实现产品。
A.极限编程XP
B.水晶法
C.并列争求法
D.自适应软件开发
解析1:
根据各敏捷方法的定义可知,题干中提到的是并列争求法,选 C。
例题2:
以下关于极限编程(XP)的最佳实践的叙述中,不正确的是()。
A.只处理当前的需求,使设计保持简单。
B.编写完程序后编写测试代码。
C.可以按日甚至按小时为客户提供可运行的版本。
D.系统最终用户代表应该全程配合 XP 团队。
解析2:
根据 12 个最佳实践可知,A 项是简单设计,C 项是持续集成,D 项是现场顾客,B 项违反了测试先行,所以选 B。
4. 需求分析
(1)需求分析的概念
需求的任务:也就是要做什么。
需求的过程:
- 问题识别
- 分析与综合
- 编制需求分析文档(需求规格说明书 SRS)
- 需求分析与评审
需求分析(结构化分析)的结果(产物):一套分层的数据流图、一本数据字典、一组小说明(也称加工逻辑说明)、补充材料。
例题:
软件开发过程中,需求分析阶段的输出不包括()。
A.数据流图
B.实体联系图
C.数据字典
D.软件体系结构图
解析:
数据流图与数据字典是两个典型产物,排除 AC。其中,实体联系图会在数据库设计的概要结构设计阶段产生,但与系统的需求分析是两个维度,在需求分析阶段也会产生实体数据之间的联系图,B 项正确。不会产生软件体系结构图,这属于架构层面,通常在概要设计阶段产生,因此选 D。
(2)需求的分类
在进行需求获取之前,首先要明确需要获取什么,也就是需求包含哪些内容。软件需求是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。
分类:
- 业务需求(整体全局)
- 用户需求(用户视角)
- 系统需求(计算机化):包括功能需求、非功能需求、设计约束。其中,非功能需求也就是性能需求,通常有响应速度、并发度、存储容量等指标,具有明显的数字化。
质量功能扩展(QFD):
- 基本需求(明示,常规需求)
- 期望需求(隐含)
- 兴奋需求(多余,不做)
其中,基本需求与期望需求是需要完成的,而兴奋需求属于额外的开销,增加成本,不需要完成。
例题:
某企业财务系统的需求中,属于功能需求的是()。
A.每个月特定的时间发放员工工资
B.系统的响应时间不超过 3 秒
C.系统的计算精度符合财务规则的要求
D.系统可以允许 100 个用户同时查询自己的工资
解析:
BD 两项均属于性能需求,分别是响应时间和并发度,C 项属于设计约束,只有 A 项是功能需求,选 A。
(3)需求分析的工具
应用的工具:
- 数据流图(DFD)
- 数据字典(DD)
- 判定表
- 判定树
此处作为基础知识先行了解,会有专门的章节介绍数据流图、数据字典等概念。
数据流图
元素 | 说明 | 图元 |
数据流 | 由一组固定成分的数据组成,表示数据的流向,每个数据流通常有一个合适的名词,反映数据流的含义。(数据流必须和加工相关,即从加工流向加工、数据源流向加工或加工流向数据源。) | |
加工 | 加工描述了输入数据流到输出数据流之间的变换,也就是输入数据流做了什么处理后变成了输出数据流。 | |
数据存储(文件) | 用来表示暂时存储的数据,每个文件都有名字。流向文件的数据流表示写文件,流出的表示读文件。 | |
外部实体 | 指存在于软件系统外的人员或组织 |
示例:
数据流图是典型的结构化开发方法,具有自顶向下、从抽象到具体的特点。
数据字典
符号 | 含义 | 举例说明 |
= | 被定义为 | |
+ | 与 | x = a + b,表示 x 由 a 和 b组成 |
[..., ...]或[...|...] | 或 | x = [a,b],x = [a|b],表示 x 由 a 或由 b 组成 |
{...} | 重复 | x = {a},表示 x 由 0 个或多个 a 组成 |
(...) | 可选 | x = (a),表示 a 可在 x 中出现,也可以不出现 |
数据字典有四类条目:数据流、数据项、数据存储和基本加工。(源点和终点不在系统内,因此不在字典中说明)
示例:
机票 = 姓名 + 日期 + 航班号 + 起点 + 终点 + 费用
航班号 = "Y7100" .. "Y8100"
终点 = [长沙 | 上海 | 北京 | 西安]
加工逻辑的描述
常用的加工逻辑描述方法有结构化语言、判定表和判定树 3 种。
结构化语言
结构化语言是一种介于自然语言和形式化语言之间的半形式化语言,是自然语言的一个受限子集。
外层:用来描述控制结构,采用顺序、选择和重复 3 种基本结构。
顺序结构,一组祈使语句、选择语句、重复语句的顺序排列。
选择结构,一般用 IF-THEN-ELSE-ENDIF、CASE-OF-ENDCASE 等关键词。
重复结构,一般用 DO-WHILE-ENDDO、REPEATE-UNTIL 等关键词。
内层:一般采用祈使语句的自然语言短语,使用数据字典中的名词和游戏的自定义词,其动词含义要具体,尽量不用形容词和副词来修饰,还可使用一些简单的算法运算和逻辑运算符号。
示例:
借书,图书管理员接收到读者的借书请求后,根据读者信息和借书信息,检查读者是否合法,如果合法,检查该读者是否已经超出借阅图书数目的最大限制,若都合法,则通知读者借书成功,将借书信息写入借书文件中,同时更新图书目录文件。
判定表
某些情况下,数据流图中某个加工的一组动作依赖于多个逻辑条件的取值,此时用判定表能够清楚地表示复杂的条件组合与应做的动作之间的关系。
判定表由 4 个部分组成,用双线分割成如下的 4 个区域:
示例:
判定树
判定树是判定表的变形,一般情况下比判定表更直观,且易于理解和适用。
示例:
例题1:
数据流图建模应遵循()的原则。
A.自顶向下、从具体到抽象
B.自顶向下、从抽象到具体
C.自底向上、从具体到抽象
D.自底向上、从抽象到具体
解析1:
根据数据流图的特点以及图示可知,应遵循自顶向下、从抽象到具体的原则,选 B。
例题2:
在结构化分析中,用数据流图描述()。当采用数据流图对一个图书馆管理系统进行分析时,()是一个外部实体。
A.数据对象之间的关系,用于对数据建模
B.数据在系统中如何被传送或变换,以及如何对数据流进行变换的功能或子功能,用于对功能建模
C.系统对外部事件如何响应,如何动作,用于对行为建模
D.数据流图中的各个组成部分
A.读者 B.图书 C.借书证 D.借阅
解析2:
通过数据流图的概念和定义可知,数据流图是对功能建模,描述了数据之间的变换关系,B 项描述更贴切。 此外,外部实体指存在于软件系统外的人员或组织,所以读者是外部实体,选 A。
例题3:
数据字典是结构化分析的一个重要输出。数据字典的条目不包括()。
A.外部实体 B.数据流 C.数据项 D.基本加工
解析3:
数据字典有四类条目:数据流、数据项、数据存储和基本加工。数据字典是对系统内部对象的描述,所以不包括外部对象,如外部实体,所以选 A。
5. 系统设计
(1)系统设计概述
系统设计包含概要设计和详细设计,具有抽象化,自顶向下、逐步求精,信息隐蔽,模块独立(高内聚、低耦合)的特点。
概要设计是划分子模块的过程,将一个复杂的系统按功能划分成多个模块或子系统;详细设计是针对每个模块内部进行设计,如算法描述、处理过程等。
概要设计
- 体系结构设计:定义软件系统各主要部件之间的关系。
- 数据设计:基于 E-R 图确定软件涉及的文件系统的结构及数据库的表结构。
详细设计
- 接口设计(人机界面设计):软件内部,软件和操作系统间以及软件和人之间如何通信。
- 过程设计:系统结构部件转换成软件的过程描述。确定软件各个组成部分内的算法及内部数据结构,并选定某种过程的表达形式来描述各种算法。
系统设计过程中应用的工具:IPO 图、PDL、PAD、程序流程图、N/S 盒图等。
例题1:
概要设计文档的内容不包括()。
A.体系结构设计
B.数据库设计
C.模块内算法设计
D.逻辑数据结构设计
解析1:
概要设计主要是将系统划分成多个子模块,对体系结构、逻辑数据结构、全局数据库进行规划设计, 不涉及到模块内部的设计,所以选项 C 错误。
例题2:
结构化开发方法中,()主要包含对数据结构和算法的设计。
A.体系结构设计
B.数据设计
C.接口设计
D.过程设计
解析2:
根据各个设计阶段的描述与定义,对数据结构和算法的设计主要在过程设计阶段,选 D。
例题3:
在采用结构化开发方法进行软件开发时,设计阶段接口设计主要依据需求分析阶段的()。接口设计的任务主要是()。
A.数据流图 B.E-R图 C.状态-迁移图 D.加工规格说明
A.定义软件的主要结构元素及其之间的关系
B.确定软件涉及的文件系统的结构及数据库的表结构
C.描述软件与外部环境之间的交互关系,软件内模块之间的调用关系
D.确定软件各个模块内部的算法和数据结构
解析3:
接口设计侧重于软件内部之间的调用与通信过程,因此依据需求分析阶段的数据流图,同时接口设计还针对软件与外部环境的交互进行设计,因此选择 AC。其中,第二个空的 A 项是体系结构设计,B 项是数据设计,D 项是过程设计。
(2)模块设计
模块设计的原则:
- 保持模块的大小适中
- 尽可能减少调用的深度
- 多扇入,少扇出(数量适中)
- 单入口,单出口
- 模块的作用域应该在模块之内
- 功能应该是可预测的
其中,调用深度指的是一个父函数可调用的子函数的层级;扇出指的是主函数调用其它函数,扇入则是某些函数被其它函数调用,也应当保持数量的适中;模块的作用域是指模块起判定作用的范围,控制域是指模块可调用的函数范围,通常作用域小于控制域。此外,一般认为高层依赖于底层。
模块设计中最重要的原则:高内聚,低耦合
内聚性
内聚类型 | 描述 |
功能内聚 | 完成一个单一功能,各个部分协同工作,缺一不可 |
顺序内聚 | 处理元素相关,而且必须顺序执行 |
通信内聚 | 所有处理元素集中在一个数据结构的区域上 |
过程内聚 | 处理元素相关,而且必须按特定的次序执行 |
时间内聚 | 所包含的任务必须在同一时间间隔内执行 |
逻辑内聚 | 完成逻辑上相关的一组任务 |
巧合内聚 | 完成一组没有关系或松散关系的任务 |
所谓功能内聚,并非单纯的功能,而是某个功能内部各部分紧密协作。
耦合性
耦合类型 | 描述 |
非直接耦合 | 两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的 |
数据耦合 | 一组模块借助参数表传递简单数据 |
标记耦合 | 一组模块通过参数表传递记录信息(数据结构) |
控制耦合 | 模块之间传递的信息中包含用于控制模块内部逻辑的信息 |
外部耦合 | 一组模块都访问同一全局简单变量,而且不是通过参数表传递该全局变量的信息 |
公共耦合 | 多个模块都访问同一个公共数据环境 |
内容耦合 | 一个模块直接访问另一个模块的内部数据;一个模块不通过正常入口转到另一个模块的内部;两个模块有一部分程序代码重叠;一个模块有多个入口 |
其中,标记耦合是一组模块通过参数表传递记录信息(数据结构) ,或称为传递复杂数据,是一组相关数据,被封装在结构体中。
例题1:
某模块中各个处理元素都密切相关于同一功能且必须顺序执行,前一处理元素的输出是下一处理元素的输入,则该模块的内聚类型为()内聚。
A.过程 B.时间 C.顺序 D.逻辑
解析1:
根据各类内聚类型的定义可知,此处为顺序内聚,选 C。过程内聚是处理元素按特定次序执行,时间内聚是任务在同一时间间隔内执行,逻辑内聚是处理逻辑上一组相关的任务。
例题2:
模块 A 将学生信息,即姓名、学号、手机号等放到一个结构体中,传递给模块 B。模块 A 和 B 之间的耦合类型为()耦合。
A.数据 B.标记 C.控制 D.内容
解析2:
将信息封装放到一个结构体中进行传输,是典型的标记耦合,选 B。数据耦合是传递简单数据,控制耦合是传递相关控制信息,内容耦合是一个模块直接访问另一个模块内的数据。
例题3:
良好的启发式设计原则上不包括()。
A.提高模块独立性
B.模块规模越小越好
C.模块作用域在其控制域之内
D.降低模块接口复杂性
解析3:
提高模块独立性就是提高内聚性,降低模块接口复杂性就是降低耦合性,符合高内聚低耦合的原则,并且模块作用域小于控制域,因此 B 项错误,规模应该适中。
(3)人机界面设计
人机界面设计也称为接口设计,它遵循黄金三原则:
- 置于用户控制之下
- 减少用户的记忆负担
- 保持界面的一致性
例题:
Theo Mandel 在其关于界面设计所提出的三条黄金准则中,不包括()。
A.用户操纵控制
B.界面美观整洁
C.减轻用户的记忆负担
D.保持界面一致
解析:
ACD 就是三条黄金准则,B 项也是界面设计的原则,但不属于黄金三原则,选 B。
(4)架构设计
软件架构风格:定义了用于描述系统的术语表和一组指导构建系统的规则。
- 数据流风格:批处理序列、管道-过滤器
- 调用/返回风格:主程序/子程序、面向对象、层次结构(MVC、C/S、B/S)
- 独立构件风格:进程通信、事件驱动系统(隐式调用)
- 虚拟机风格:解释器、基于规则的系统
- 仓库风格:数据库系统、超文本系统、黑板系统
数据流风格
- 批处理序列:构件为一系列固定顺序的计算单元,构件之间只通过数据传递交互。每个处理步骤是一个独立的程序,每一步必须在其前一步结束后才能开始,数据必须是完整的,以整体的方式传递。
- 管道-过滤器:每个构件都有一组输入和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流。
调用/返回风格
- 主程序/子程序:单线程控制,把问题划分为若干个处理步骤,构件即为主程序和子程序,子程序通过可合成为模块。
- 面向对象:构件是对象,对象是抽象数据类型的实例。也称为显式调用。
- 层次结构:构件组织成一个层级结构,连接件通过决定层间如何交互的协议来定义。
层次结构的优点:
- 支持基于可增加抽象层的设计,允许将一个复杂问题分解成一个增量步骤序列的实现。
- 不同的层次处于不同的抽象级别,越靠近底层,抽象级别越高,反之,越低。
- 由于每一层最多只影响两层,同时只要给相邻层提供相同的接口,允许每层用不同的方法。
缺点:
- 并不是每个系统都可以很容易地划分为分层的模式。
- 很难找到一个合适的、正确的层次抽象方法。
层次结构的扩展:
MVC 层次结构:
- Model(模型):应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
- View(视图):应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
- Controller(控制器):应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
独立构件风格
- 进程通信:构件是独立的过程,连接件是消息传递。构件通常是命名过程,消息传递的方式可以是点对点、异步或同步方式,以及远程过程调用等。
- 事件驱动系统(隐式调用):构件不直接调用一个过程,而是触发或者广播一个或多个事件。
虚拟机风格
- 解释器:具有解释器风格的软件中含有一个虚拟机,可以仿真硬件的执行过程和一些关键应用,缺点是执行效率较低。
- 基于规则的系统:常用于人工智能领域和决策支持系统(DSS) 中。
仓库风格
- 数据库系统
- 黑板系统:包括知识源、黑板和控制三部分。知识源包括若干独立计算的不同单元,提供解决问题的知识,知识源响应黑板的变化。通常用在对于解决问题没有确定性算法的软件中(信号处理、问题规划和编译器优化等)。
- 超文本系统:通常应用于互联网领域,现代集成编译环境一般采用此风格。
例题1:
数据仓库位于该体系结构的中心,其它构件访问该数据仓库并对其中的数据进行增删改等操作。以下关于该风格的叙述中,不正确的是()。()不属于仓库风格。
A.支持可更改性和可维护性
B.具有可复用的知识源
C.支持容错性和健壮性
D.测试简单
A.数据库系统 B.超文本系统 C.黑板系统 D.编译器
解析1:
题干中明显是对仓库风格的描述,可以将其想象为一个数据库,对一个数据库而言,是支持可更改性和可维护性的,并且有可复用的知识源,也支持容错性和健壮性,选项 ABC 正确,但不容易测试,第一个空选 D。仓库风格不包括编译器,编译器是一个系统软件,选 D。
例题2:
以下关于 C/S(客户机/服务器)体系结构的优点的叙述中,不正确的是()。
A.允许合理地划分三层的功能,使之在逻辑上保持相对独立性
B.允许各层灵活地选用平台和软件
C.各层可以选择不同的开发语言进行并行开发
D.系统安装、修改和维护均只在服务器端进行
解析2:
可以将 C/S 结构划分成三层 C/S,A 项正确。每一层可以根据自己的特点选择开发语言或软件等,BC 正确。系统的安装、修改和维护等要具体到某一层,选项 D 错误。
后续会持续更新整理。