Skip to content
🗂️ 文章分类: 考试  
🏷️ 文章标签: 软考  
📝 文章创建时间: 2025-04-02
🔥 文章最后更新时间:2025-10-27

[toc]

软件设计师笔记06_结构化开发方法

下面的内容参考自《软件设计师教程(第5版)》 这本书的第6章 结构化开发方法。

知识点结构图如下 ruankao_20250402173656.png

什么是结构化方法?

结构化方法由结构化分析、结构化设计、结构化程序设计构成,它是一种面向数据流的开发方法。

  • 结构化分析:是根据分解与抽象的原则,按照系统中数据处理的流程,用数据流图来建立系统的功能模型,从而完成需求分析工作。
  • 结构化设计:是根据模块独立性准则、软件结构优化准则将数据流图转换为软件的体系结构,用软件结构图来建立系统的物理模型,实现系统的概要设计。
  • 结构化程序设计:是使用3种基本控制结构构造程序。任何程序都可以由顺序、选择和重复3种基本控制结构构造。

结构化方法总的指导思想是自顶向下、逐层分解,它的基本原则是功能的分解与抽象。它是软件工程中最早出现的开发方法,特别适合于数据处理领域的问题,但是不适合解决大规模的、特别复杂的项目,且难以适应需求的变化。

系统分析与设计概述

系统分析概述

系统分析是一种问题求解技术,它将一个系统分解成各个组成部分,目的是研究各个部分如何工作、交互,以实现其系统目标。

系统分析的目的和任务

系统分析的目的是为项目团队提供对项目的问题和需求的更全面的理解。

系统分析的主要任务是对现行系统进一步详细调查,将调查中所得到的文档资料集中,对组织内部整体管理状况和信息处理过程进行分析,为系统开发提供所需的资料,并提交系统方案说明书。

简而言之,系统分析就是调查,收集资料,分析,并给出系统分析报告(系统方案说明书)。

系统分析的主要步骤

系统分析的主要分为以下五步:

  1. 对当前系统进行详细的调查,收集数据。
  2. 建立当前系统的逻辑模型。
  3. 对现状进行分析,提出改进意见和新系统应达到的目标。
  4. 建立新系统的逻辑模型。
  5. 编写系统方案说明书

系统设计的基本原理

系统设计的基本原理如下所示。

抽象

抽象是一种重要的工具,用来将复杂的现象简化到可以分析、实验或者可以理解的程度。

即重点说明一个实体的本质方面,而忽略或者掩盖不太重要或非本质的方面。

模块化

模块化是指将一个待开发的软件分解成若干个小的简单部分(模块),每个模块可独立地开发、测试,最后组装成完整的程序。

这是一种复杂问题“分而治之”的原则。模块化的目的是使程序的结构清晰,容易阅读、理解、测试和修改。

信息隐蔽

信息隐蔽是指将每个程序的成分隐蔽或封装在一个单一的设计模块中,使模块的内部结构对其他模块是不可见的。

信息隐蔽原则对提高软件的可修改性、可测试性和可移植性都有重要的作用。

模块独立

模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系简单。

衡量模块独立程度的标准有两个:耦合性和内聚性。在将软件系统划分模块时,应尽量做到高内聚、低耦合,提高模块的独立性。

耦合性

耦合性是指模块与模块之间的联系紧密程度。一般模块之间的耦合性有7种类型。

耦合种类如图所示 ruankao_2025-10-27_151406_794.png

每种耦合类型介绍如图所示 ruankao_20241023101904.png

内聚性

内聚性是指模块内部元素之间联系的紧密程度。一个内聚程度高的模块应该只完成一个相对独立的特定子功能,而不是完成多个不同的功能。

内聚种类如图所示 ruankao_2025-10-27_152232_028.png

每种内聚类型介绍如图所示 ruankao_20241023104941.pngruankao_20241023104915.png

系统总体结构设计

系统总体结构设计是要根据系统分析的要求和组织的实际情况对新系统的总体结构形式和可利用的资源进行大致设计,这是一种宏观、总体上的设计和规划。

系统结构设计原则

为保证总体结构设计顺利完成,应遵循以下几条原则。

  • (1)分解-协调原则。 整个系统是一个整体,具有整体目的和功能,但这些目的和功能的实现又是由相互联系的各个组成部分共同工作的结果。解决复杂问题的一个很重要的原则就是把它分解成多个小问题分别处理,在处理过程中根据系统总体要求协调各部门的关系。
  • (2)自顶向下的原则。 首先抓住系统总的功能目的,然后逐层分解,即先确定上层模块的功能,再确定下层模块的功能。
  • (3)信息隐蔽、抽象的原则。 上层模块只规定下层模块做什么和所属模块间的协调关系,但不规定怎么做,以保证各模块的相对独立性和内部结构的合理性,使得模块与模块之间层次分明,易于理解、实施和维护。
  • (4)一致性原则。 要保证整个软件设计过程中具有统一的规范、统一的标准和统一的文件模式等。
  • (5)明确性原则。 每个模块必须功能明确、接口明确,消除多重功能和无用接口。
  • (6)模块之间的耦合尽可能小,模块的内聚度尽可能高。
  • (7)模块的扇入系数和扇出系数要合理。 一个模块直接调用其他模块的个数称为模块的扇出系数;反之,一个模块被其他模块调用时,直接调用它的模块个数称为模块的扇入系数。模块的扇入、扇出系数必须适当。经验表明,一个设计得好的系统的平均扇入、扇出系数通常是3 或 4,一般不应超过7,否则会引起出错概率的增大。但菜单调用型模块的扇入与扇出系数可以大一些,公用模块的扇入系数可以大一些。
  • (8)模块的规模适当。 过大的模块常常使系统分解得不充分,其内部可能包含了若干部分的功能,因此有必要进一步把原有的模块分解成若干功能尽可能单一的模块。但分解也必须适度,因为过小的模块有可能降低模块的独立性,造成系统接口的复杂性。

子系统的划分

子系统划分的原则

  • (1)子系统要具有相对独立性。 子系统的划分,必须使得子系统的内部功能、信息等各方面的凝聚性较好。子系统独立可以减少子系统间的相互影响,有利于多人分工开发不同的模块,从而提高软件产品的生产率,保证软件产品的质量,同时也增强了系统的可维护性和适应性。
  • (2)子系统之间数据的依赖性尽量小。 子系统之间的联系要尽量减少,接口要简单明确。一个内部联系强的子系统对外部的联系必然很少,所以在划分的时候,应将联系较多者列入子系统内部,而剩余的一些分散、跨度比较大的联系,就成为这些子系统间的联系和接口。这样划分的子系统,将来调试、维护和运行都是非常方便的。
  • (3)子系统划分的结果应使数据冗余较小。 如果把相关的功能数据分布到各个不同的子系统中,则会有大量的原始数据需要调用,大量的中间结果需要保存和传递,大量的计算工作将要重复进行,从而使得程序结构紊乱,数据余,不仅给编码带来很大的困难,而且系统的工作效率也大大降低。
  • (4)子系统的设置应考虑今后管理发展的需要。 子系统的设置仅依靠上述系统分析的结构是不够的,因为现存的系统由于各种原因,很可能没有考虑到一些高层次管理决策的要求。
  • (5)子系统的划分应便于系统分阶段实现。 信息系统的开发是一项较大的工程,它的实现一般要分批进行,所以子系统的划分应能适应这种分期分批的实施。另外,子系统的划分还必须兼顾组织结构的要求。
  • (6)子系统的划分应考虑到各类资源的充分利用。 一个适当的子系统划分应该既考虑有利于各种设备资源在开发过程中的搭配使用,又考虑到各类信息资源的合理分布和充分使用,以减少系统对网络资源的过分依赖,减少输入、输出和通信等设备压力。

子系统结构设计

子系统结构设计的任务是确定划分后的子系统模块结构,并画出模块结构图。在这个过程中必须考虑以下几个问题。

  • (1)每个子系统如何划分成多个模块。
  • (2)如何确定子系统之间、模块之间传送的数据及其调用关系,
  • (3)如何评价并改进模块结构的质量。
  • (4)如何从数据流图导出模块结构图。

系统文档

信息系统的文档是系统建设过程的“痕迹”,是系统维护人员的指南,是开发人员与用户交流的工具。

规范的文档意味着系统是按照工程化开发的,意味着信息系统的质量有了形式上的保障。文档的欠缺、文档的随意性和文档的不规范,极有可能导致原来的开发人员流动以后,系统不可维护、不可升级,变成了一个没有扩展性、没有生命力的系统。

信息系统的文档不仅包括应用软件开发过程中产生的文档,还包括硬件采购和网络设计中形成的文档;不仅包括上述有一定格式要求的规范文档,也包括系统建设过程中的各种来往文件、会议纪要、会计单据等资料形成的不规范文档,后者是建设各方谈判甚至索赔的重要依据;不仅包括系统实施记录,也包括程序资料和培训教程等。

结构化分析方法

结构化分析与设计方法是一种面向数据流的传统软件开发方法,它以数据流为中心构建软件的分析模型和设计模型。

结构化分析、结构化设计和结构化程序设计构成了完整的结构化开发方法。

结构化分析方法概述

对于一个复杂的问题,人们很难一下子考虑问题的所有方面和全部细节,通常可以把一个大问题分解成若干个小问题,将每个小问题再分解成若干个更小的问题,经过多次逐层分解,每个最底层的问题都是足够简单、容易解决的,于是复杂的问题也就迎刃而解了。

结构化方法就是采用这种自顶向下逐层分解的思想进行分析建模的。自顶向下的过程是分解的过程,自底向上的过程是抽象的过程。

结构化方法的分析结果由以下几部分组成:一套数据流图、一本数据词典、一组加工逻辑说明、补充材料。

数据流图(DFD)

数据流图用于描述数据在系统中如何被传送或变换,以及如何对数据流进行变换的功能或子功能,主要用于对功能建模。

数据流图的基本图形元素

数据流图中的基本图形元素包括数据流、加工、数据存储和外部实体。

数据流图的基本图形元素如图所示。 ruankao_2025-10-27_165500_159.png

数据流

数据流表示数据的流向。

  • 输入数据流:是指从外部实体流向加工的数据流。
  • 输出数据流:是指从加工流向外部实体的数据流。
加工

加工表示数据的处理。

加工描述了输入数据流到输出数据流之间的变换,也就是输入数据流经过什么处理后变成了输出数据流。

一个加工可以有多个输入数据流和多个输出数据流,但至少有一个输入数据流和一个输出数据流。

加工错误的情况

  • 当一个加工有输入数据流但是没有输出数据流时,称之为“黑洞”加工。
  • 当一个加工输入数据流不足以产生输出数据流时,称之为“灰洞”加工。
数据存储

数据存储用来存储数据。

每个数据存储都有一个定义明确的名字标识。

  • 可以有数据流流入数据存储,表示数据的写入操作;
  • 也可以有数据流从数据存储流出,表示数据的读操作;
  • 还可以用双向箭头的数据流指向数据存储,表示对数据的修改。
外部实体(外部主体)

外部实体是指存在于软件系统之外的人员或组织,它指出系统所需数据的发源地(源)和系统所产生的数据的归宿地(宿)。

在许多系统中,某个源和某个宿可以是同一个人员或组织,此时,在DFD中可以用同一个符号表示。

源和宿采用相同的图形符号表示,当数据流从该符号流出时,表示它是源;当数据流流向该符号时,表示它是宿;当两者皆有时,表示它既是源又是宿。

数据流图的扩充符号

在DFD中,一个加工可以有多个输入数据流和多个输出数据流,此时可以加上一些扩充符号来描述多个数据流之间的关系。

  • 星号(*) 星号表示数据流之间存在“与”关系。表示所有数据流全部到达后才能进行加工处理;
  • 加号(+) 加号表示数据流之间存在“或”关系。表示其中任何一个数据流到达后就能进行加工处理;
  • 异或(⊕) 异或表示数据流之间存在“互斥”关系。如果是输入流则表示当且仅当其中一个输入流到达后才能进行加工处理;如果是输出流则表示加工处理的结果是仅产生这些输出数据流中的一个。

数据流图基本设计原则

  1. 数据守恒原则:对任何一个加工来说,其所有输出数据流中的数据必须能从该加工的输入数据流中直接获得,或者说是通过该加工能产生的数据
  2. 守恒加工原则:对同一个加工来说,输入与输出的名字必须不相同,即使它们的组成成分相同。
  3. 对于每个加工,必须既有输入数据流,又有输出数据流
  4. 外部实体与外部实体之间不存在数据流
  5. 外部实体与数据存储之间不存在数据流
  6. 数据存储与数据存储之间不存在数据流
  7. 父图与子图的平衡原则:子图的输入输出数据流同父图相应加工的输入输出数据流必须一致,此即父图与子图的平衡。父图与子图之间的平衡原则不存在于单张图
  8. 数据流与加工有关,且必须经过加工

数据字典(DD)

数据流图描述了系统的分解,但没有对图中各成分进行说明。

数据字典就是为数据流图中的每个数据流、文件、加工,以及组成数据流或文件的数据项做出说明。

结构化设计方法

结构化设计方法的基本思想是将系统设计成由相对独立、功能单一的模块组成的结构。通过用结构图来描述软件系统的体系结构,指出一个软件系统由哪些模块组成,以及模块之间的调用关系。

结构化设计的步骤

结构化设计大致步骤如下

第一步 建立初始结构图

在结构化设计时,可以将整个软件看作一个大的功能模块(结构图中的模块),通过功能分解将其分解成若干个较小的功能模块。每个较小的功能模块还可以进一步分解,直到得到一组不必再分解的模块(结构图中的底层模块)。

当一个功能模块分解成若干个子功能模块时,该功能模块实际上就是根据业务流程调用相应的子功能模块,并根据其功能要求对子功能的结果进行处理,最终实现其功能要求。

第二步 对结构图的改进

初始结构图往往存在一些不合理的设计(包括不合理的模块分解),因此,可根据设计准则对其进行改进。

第三步 书写设计文档

在概要设计完成之后应书写设计规格说明,特别要为每个模块书写模块的功能、接口、约束和限制等,必要时可建立模块开发卷宗。

第四步 设计评审

对设计结果及文档进行评审

Released under the MIT License.