13005 软件工程 第二章 结构化软件开发方法

1 阅读4分钟

hello 大家好,由于作者25年10月份考期去参加习思想考试了,所以没有更新现在已经通过了《习思想》开始13005 软件工程的资料更新,献给每一位拥有梦想的"带专人",

每一章节中的练习部分中的标有 2504 的题是25年4月考期的真题希望可以帮到大家~

ps:有不正确的地方麻烦更新在评论区,我会一一修复 😅

第二章 结构化软件开发方法

需求分析

需求分析是软件生命周期中软件开发的第一个阶段,也是关系到软件开发成败的关键步骤

需求分析的任务在于弄清用户对系统软件的确切要求,并用需求规格说明书的形式表达出来

需求分析阶段应该遵守的原则

  1. 需求说明应该具有准确性和一致性
  2. 需求说明应该清晰、准确且没有二义性

需求分析的步骤:

  1. 通过对现实环境的调查研究,获得当前系统的具体模型

    image.png

  2. 去掉具体模型中的非本质因素,抽象出当前系统的逻辑模型

    image.png

  3. 分析当前系统与目标系统的差别,建立目标系统的逻辑模型

    image.png

  4. 目标系统进行完善和补充,并写出完整的需求说明

  5. 对需求说明进行复审,直到确认文档齐全,并且符合用户的全部需求

需求规格说明书

需求规格说明书又称软件需求说明书(SRS),主要包括以下内容:

  1. 引言:问题定义阶段确定软件的目标与范围

  2. 数据描述:

    1. 数据流图(DFD):表达目标系统的逻辑模型

      1. O 代表加工
      2. \rightarrow 代表数据流方向
      3. □ 数据的源点与终点
      4. === 或 — 表示数据文件,或其他数据存储

    image.png

    1. 数据字典(DD):汇集系统中使用的一切数据定义(对数据进行描述)

      数据字典对软件开发非常重要。作用是对数据流图中每个数据规定一个定义条目,以保持数据在系统中的一致性

      1. =:等于、定义为
      2. ++:加
      3. [ ]:选择符,表示对 [ ] 中列举的值可以任取其一
      4. { }:重复符,表示对 { } 中的内容可以重复使用
      5. ( ):可选符,表示对 ( ) 中的内容设计员可以决定取舍
      6. *……*:注释符,两个星号之间的内容为对条目的注释
      7. 用标在花括号前后的数字表示重复次数的上下限

      例: 数据流发票可以描述为

      发票 = (学号) + 姓名 + {书号 + 单价 + 数量 + 总价} + 书费合计

      1. 数据项:只含有一个数据的数据项(数据元素)

        image.png

      2. 数据文件或数据库

        image.png

      3. 数据结构图

        在含有数据库的软件系统中,可以用数据结构图说明文件之间的联系,这种表示的优势在于直观、方便

        image.png

      4. 加工说明:通常采用3种形式来描述,即结构化语言、判定表、判定树

        1. 结构化语言:顺序、选择、循环等结构化程序中的控制结构来描述加工

        2. 判定表:采用表格化的形式表达含有复杂判断(多分支)的加工逻辑

          image.png

        3. 判定树:是判定表的图形表示,其运用场合与判定表相同

          image.png

  3. 功能描述:对软件功能要求说明

  4. 性能描述:对软件性能说明,处理速度、响应时间、安全限制

  5. 质量保证:软件交付前需要进行功能测试与性能测试

结构化分析方法

使用数据流图、数据结构图、结构化英语、判定表、判定树等工具,来建立一种新的、称为结构化说明书的目标文档(软件需求规格说明书)

需求分析工具

  1. 需求描述语言

    方便描述系统中各个目标的性质以及目标存在的联系

  2. 需求描述数据库

    需求中的所有信息要集中在同一个数据库中,当对信息增、删、改的时候保持信息的一致性

  3. 处理和分析系统

    有语言处理器和数据库管理系统的功能,语言处理器可以进行语法和词法分析,数据库可以对数据进行检索查询

软件设计

把一个软件需求转化成软件表示的过程

从软件设计的工作顺序和管理上可以把设计分为概要设计和详细设计两个阶段

在概要设计阶段,将软件需求转化为数据结构和软件的体系结构

在详细设计阶段,通过对结构表示进行细化,得到软件的详细数据结构和算法

从软件设计的技术内容上划分,软件设计的任务包括数据设计、体系结构设计和过程设计

软件设计的方法

  1. 面向数据流的设计:结构化设计方法
  2. 面向数据结构的设计:Jackson设计方法
  3. 原型设计:两步设计法

概要设计和详细设计

概要设计

  1. 制定规范:

    先读懂软件需求说明书,评估哪些需求可以实现;若不可行,列出所需条件,明确设计目标与优先级。

    围绕已定目标选择最合适的设计方法。

    统一设计文档格式

    约定编码阶段的信息表达

  2. 软件体系结构的总体设计:

    按功能层次把复杂系统拆成模块。

    明确各模块功能,与需求逐条对应。

    确定模块之间的调用关系。

    设计模块接口:要传的信息、结构、格式。

    评估模块划分是否清晰、高内聚低耦合,并形成模块规划。

  3. 处理方式设计:

    明晰实现功能所需的算法,并评估其性能。

    针对性能需求选择算法与模块控制策略,重点关注周转时间、响应时间、吞吐量、精度等指标。

    规定外部信号的收发方式,确保接口一致。

  4. 数据结构设计:

    明确输入与输出文件的详细数据结构。

    配合算法,确定所需的逻辑数据结构及操作方式。

    为这些操作设计对应的程序模块,同时界定各数据设计决策的影响范围。

    若需操作系统或调度程序的控制表等数据,需定义其结构与使用规则。

    做好数据保护性设计:包括防卫性、一致性与冗余性策略。

  5. 可靠性设计:

    使软件问题少,易于修改与维护

  6. 编写概要设计阶段的文档

  7. 概要设计评审

    对概要设计成果组织评审,重点核对可追溯性、模块接口、实现风险、实用性、技术清晰度、可维护性与整体质量,确保设计可落地且后续易维护。

详细设计

  1. 明确每个组成部分内部要用的算法和数据组织方式,确保逻辑一致。
  2. 为算法选择合适的过程表达形式(如流程图、伪代码等),让实现细节可视化。
  3. 对详细设计成果开展评审,重点检查算法正确性、数据组织合理性及可实现性。

模块化设计

image.png

把大型软件按照原则划分为小的、独立的又彼此相关的模块。分解、信息隐藏、模块独立性是模块化设计的重要指导思想,还是软件设计的基本策略

分解:存在一个模块数M,它使总开发成本最小

信息隐藏:每个模块的实现细节对于其他模块来说是隐藏的

模块独立性:下一节

模块的独立性

模块化设计降低了系统复杂性,使系统容易修改

模块化设计推动了系统各个部分的并行开发,从而提高了软件生产效率

模块:用一个名字就可以调用的一段程序(function)

  1. 功能:该模块实现了什么功能
  2. 逻辑:模块内部如何实现
  3. 状态:模块的使用条件

模块独立性:每个模块只负责对应的具体子功能,并通过简洁接口与其他模块交互。评价时常用两个准则:

  • 模块间耦合:描述不同模块之间依赖/交互的紧密程度,越低越好。
  • 模块内聚:衡量模块内部各元素为实现单一功能的关联度,越高越好。

耦合性

  • 衡量模块之间依赖程度的标准:接口复杂、调用方式紧密、传递的数据多,耦合就强。
  • 控制耦合:保持接口简单、调用方式清晰、信息传递有界,降低模块间牵连。

核心:低耦合

image.png

  1. 非直接耦合

    image.png 两个模块间没有直接关系,它们之间的通信只能通过主模块的控制和调用来实现的、

  2. 数据耦合

    一个模块访问另一个模块时,彼此之间是通过数据参数(一个变量)来通信

  3. 标记耦合

    image.png

    一组模块通过参数表(一组变量)来实现通信,这组模块共享了这个记录,它是某一数据结构的子结构,而不是简单变量

    开发中尽量避免,可以通过信息屏蔽来消除标记耦合

  4. 控制耦合

    image.png

    一个模块通过开关、标志、名字等控制信息,明显地控制了另一个模块

  5. 外部耦合

    一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息

    人话:外部耦合可以想象成两个模块都要去同一个“公共柜台”办事(比如操作系统、设备驱动)。它们不直接聊天,只是各自跟柜台打交道:柜台换了规定,两边 都得跟着改。所以外部耦合的核心就是一起依赖了外部的统一接口。

  6. 公共耦合

    image.png

    一组模块都访问同一个公共数据环境(可以是全局数据结构、共享的通信区、内存的公共覆盖区)

    人话:公共耦合就是多个模块共同使用同一块共享数据(比如全局变量或公共数据区)。这些模块就像一起写同一本共享日志:谁改了内容,其他人都受到影响; 如果格式或内容规则改变,所有模块都得跟着调整。

  7. 内容耦合

    image.png

    一个模块直接访问另一个模块的内部数据

    一个模块不通过正常入口进入另一个模块内部

    两个模块有一部分代码发生重叠(只可能出现在汇编语言中)

    一个模块有多个入口

聚合性

内聚性是程序结构中模块内部相互关联的度量,高内聚意味着模块内元素为单一目标协同工作,关联性强,职责明确

核心:高内聚

image.png

  1. 巧合内聚:内聚程度最低

    也称偶然内聚,模块内各部分没有联系或联系很松散

    ABC三个模块都有相同的语句,将其抽象为一个模块

    image.png

  2. 逻辑内聚

    把几种相关功能组合到一起,每次调用通过传递给模块的判断参数来决定执行哪一种功能

    image.png

  3. 时间内聚

    又称经典内聚,基本为功能模块,模块中各功能执行与时间相关,通常要求所有功能必须在同一时间段内执行

    例如:定时任务

  4. 过程内聚

    模块内的处理是相关的,而且必须以特定次序执行

    A \rightarrow B \rightarrow C 必须按照ABC的顺序调用

  5. 通信内聚

    一个模块内个功能部分都使用了输入数据,或产生了相同的输出数据 (虚线部分表示两个模块)

    image.png

  6. 顺序内聚

    A[输出] \rightarrow [输入]B \rightarrow C

    模块内部处理的元素与同一功能密切相关,而且必须执行,前一个功能的输出作为下一个功能的输入,通常共用一个数据结构

  7. 信息内聚

    一个模块完成多个功能,每个功能都操作同一个数据结构,每一个功能有一个唯一的入口点

    image.png

  8. 功能内聚:内聚程度最高

    模块中每个部分都是完成某一个功能必须的部分

    模块中的所有部分都是为了完成一项具体功能而协同工作,互相紧密联系,不可分割

设计文档

  1. 概要设计说明书
    1. 以图表形式表示软件的总体结构
    2. 模块的外部设计,包括关于各模块的功能,性能与接口的简要描述
    3. 数据结构设计,包括数据模式,访问方法和存储要求
  2. 详细设计说明书
    1. 表示软件结构的图表
    2. 对逐个模块程序的描述,包括标注和逻辑流程、输入/输出项、外部接口等

文档的表达形式

  1. 图形表达工具:程序流程图、N-S图
  2. 文字表达工具:伪代码
  3. 表格表达工具

HIPO图= HC + IPO 图

HC表示软件的分层结构,HC中的每一个模块,均可用一张IPO图来描述

image.png

软件结构的典型形式

软件结构的典型形式分为变换型结构和事务型结构

  1. 变换型结构

    image.png

    由三部分组成,传入路径、变换中心、传出路径。流经这3部分的数据流分别为传入流、变换流、传出流

  2. 事务型结构

    image.png

    具有多种事务中选择某类事务执行的能力。由接收路径(至少一条)、事务中心和动作路径(若干条)组成

结构图

SC(Structured Chart,结构图):描述软件系统的模块结构

在SC中用矩形表示模块,用带箭头的连线表示模块间的调用关系。在调用线的两旁,应标出传入和传出模块的数据流

SC中的模块有4种类型,即传入模块,传出模块,变换模块和协调模块

SC的组成

  1. 模块的表示符号

  2. 简单调用

    image.png

    表示模块A调用模块B和C,调用模块B时的传入参数是x,y,模块B向模块A返回的参数是z,调用模块C的时候传入参数是z,没有返回值

  3. 选择调用:菱形表示选择

    image.png

  4. 循环调用:环形箭头表示循环

    image.png

软件模块结构的改进

  1. 模块功能的完善化
    1. 执行规定功能部分
    2. 出错向调用者返回标志与原因
    3. 返回多数据时,附加成败标志
  2. 消除重复功能,改善软件结构
    1. 结构上完全相似,数据类型上不一致,合并模块,适配数据类型
    2. 局部相似,抽离公共部分为子模块,供原模块共享
    3. 设计功能可预测的模块,但要避免过分受限制的模块
    4. 模块的作用范围应该在控制范围之内
    5. 扇入和扇出。扇入 = 被调模块数,扇出 = 调用子模块数;减高扇出,随深度增扇入。高扇出 = 控制模块过多,高扇入 = 模块功能冗余。
    6. 模块的大小要适中

详细设计的目的与任务

详细设计的目的,是为软件结构图(SC或HC)中的每一个模块确定实现功能所采用的算法和数据结构,用某种工具给出清晰描述

设计人员的任务

  1. 选算法、写模块详细过程描述
  2. 确定每个模块使用的数据结构
  3. 定接口细节:含内外接口、输入输出及局部数据详情;
  4. 设计测试用例:为编码后模块测试做准备。

模块的逻辑设计

在详细设计阶段的原则

  1. 权衡效率与清晰,禁用 goto;

  2. 结构化设计:用顺序 / 选择 / 循环,单入口单出口;

  3. 逐步细化。逐步细化产生的程序逻辑一般错误较少,可靠性也比较高。

    1. 由粗到细,同步细化数据描述;
    2. 统一结构化语言,最终用伪代码;

    优点:聚焦重点、易验证正确性

常用的表达工具

  1. 程序流程图 大题

    是软件开发者最熟悉的一种算法表达工具,独立于任何一种程序设计语言

    优点:直观、清晰、易于学习

    缺点:符号不够规范

    1. 顺序型

      image.png

    2. 选择型

      image.png

    3. 先判定型循环(while)

      image.png

    4. 后判定型循环(do-while)

      image.png

    5. 多情况型选择

      image.png

    标准符号

    image.png

  2. N - S 图 大题

    1. 顺序型

      image.png

    2. 选择型

      image.png

    3. 先判定型循环

      image.png

      P 判定条件

      S 循环体

    4. 后判定型循环

      image.png

      P 判定条件

      S 循环体

    5. 多情况型选择

      image.png

  3. PAD

    1. 顺序型

      image.png

    2. 选择型

      image.png

    3. 先判定型循环

      image.png

    4. 后判定型循环

      image.png

    5. 多情况型选择

      image.png

  4. 伪代码和PDL

    PDL是一种用于描述功能模块的算法设计和加工细节的语言,是一种伪代码。PDL作为一种伪代码,其语法分为内语法和外语法,内语法描述实际操作和条件,外语法描述控制结构和数据结构

    1. 数据说明

      image.png

    2. 程序块

      image.png

    3. 子程序结构

      image.png

    4. 基本控制结构

      1. 顺序型结构

      2. 选择型结构

        image.png

      3. 重复型结构

        image.png

      4. 多路选择型结构

        image.png

      5. 输入/输出结构

        image.png

结构复杂度的度量

  1. 核心:衡量程序清晰度与非结构化程度;

  2. 度量方式:程序图、环域复杂度、交叉点复杂度;

  3. 程序图:有向图 G=(N,E),N = 结点,E = 有向边;

  4. 环域复杂度 V (G):

    V(G)=判定节点数+1=nenv+2P(ne为有向图的边数,nv为有向图的结点数,P=1)V(G) = 判定节点数 + 1 \\ = n_e - n_v + 2P\\ (n_e 为有向图的边数,n_v 为有向图的结点数,P = 1)
  5. 应用:

    1. 度量测试难度;
    2. 限制模块规模:V (G)≥10 测试极难,建议上限为 10。

练习

  1. 需求分析的任务是

    1. 确定客户需要目标系统实现的功能,并提供需求规格说明书
    2. 确定客户需要目标系统应该达到的时间性能,并提供需求规格说明书
    3. 确定客户需要系统提供什么样的用户界面,并提供需求规格说明书
    4. 确定目标系统的功能和非功能需求,并提供需求规格说明书 ✅
  2. 关于需求分析的步骤,下列选项中正确的是

    1. 先建立系统的业务模型,再建立系统的逻辑模型 ✅
    2. 先建立系统的逻辑模型,再建立系统的业务模型
    3. 对业务系统模型进行完善后,再建立系统的逻辑模型
    4. 先对系统的逻辑模型进行完善,再建立业务系统的模型
  3. 需求规格说明书中,用于对数据进行描述的工具是

    1. 数据流图
    2. 数据结构图
    3. 数据字典 ✅
    4. 数据加工图
  4. 下列关于 SC 的叙述,正确的是

    1. SC 通常用于描述模块的内部结构

    2. SC 通常用于描述软件系统的模块结构 ✅

    3. SC 由输入模块构成

    4. SC 由输出模块构成

  5. 在结构化设计中,其模块的耦合性越低,模块的独立性 2504 ✅

    1. 越低
    2. 越高 ✅
    3. 不变
    4. 无法确定
  6. 在软件设计中,信息隐藏的主要目的是 2504 ✅

    1. 提高模块的耦合度
    2. 降低模块的内聚性
    3. 隐藏模块的实现细节 ✅
    4. 提高系统的运行效率
  7. 数据流图中,圆圈 O 代表加工,箭头 \rightarrow 代表 数据流向 2504

  8. 如果一个模块内的处理过程是相关的,而且必须以特定次序执行,则称这个模块为过程内聚模块 2504

  9. 在程序流程图中,用于表示预定义处理的图表是 4 ✅

image.png

  1. 下列图表中,可用于详细设计的是

    1. SC
    2. N - S 图 ✅
    3. 数据流图
    4. 判定树

    解析:

    需求分析:数据流图、判定树、判定表

    概要设计:SC(结构图)

    详细设计:程序流程图、N - S 图、PAD、伪代码 PDL

  2. 软件需求分析的任务是什么?需求分析的步骤是什么

    完全弄清用户对软件系统的确切要求,并用需求规格说明书的形式表达出来

    需求分析的步骤:

    1. 对现实环境进行调查研究,获得系统的具体模型
    2. 去掉具体模型中的分本质因素,抽象出当前系统的逻辑模型
    3. 分析当前系统与目标系统的差别,建立目标系统的逻辑模型
    4. 对目标系统进行完善与补充,写出完整的需求说明
    5. 对需求说明进行评审,直到确认文档齐全,符合用户需求
  3. 需求规格说明书包括哪些内容?有哪些图、表可用于描述需求 2504

    需求规格说明书:引言、数据描述、功能描述、性能描述、质量保证

    可用于描述的图表:数据流图、数据结构图、数据字典、判定树、判定表

  4. 简述模块的耦合性并列举三种耦合类型 202504

    衡量模块间依赖程度的标准,接口复杂,调用方式紧密,传递数据多,耦合性就强

    非直接耦合、数据耦合、标记耦合、控制耦合、外部耦合、公共耦合

  5. 银行计算机储蓄系统的工作过程大致如下:储户填写的存款单或取款单由业务员输入系统,如果是存款,则系统记录存款人姓名、住址(或电话号码)、身份证号码、存款类型、存款日期、到期日期、利率及密码(可选)等信息,并打印出存款存单给储户;如果是取款而且存款时留有密码,则系统首先核对储户密码,若密码正确或存款时未留密码,则系统计算利息并打印出利息清单给储户。请用数据流图描绘本系统的功能

    记录信息时生成了存款信息,所以需要指出生成的文件

    image.png

  6. 画出下列伪代码程序的程序流程图和盒图 202504

    image.png

    image.png

  7. 画出下列伪代码程序的数据流程图和N-S图

    image.png

    image.png

笔者观看的课程是 B 站博主小飞学长Pro 课程,前四章是免费的如果需要看后面的建议大家去购买正版课程 😊😊

🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉