结构化设计目的????
主要任务:
1、定义满足需求所需要的结构
2、确定“怎么做”的问题
3、划分两个阶段:
总体设计:整 个系统为研究对象
详细设计:系统当中的某个模块为研究对象,来设计这个模块的详细处理流程。
什么是总体设计???
任务:
把系统的功能需求分配到一个特定的软件系统结构中。
如何分配呢?
模块:软件中具有特定标注的独立的成分。
模块调用:描述模块之间的关系,模块之间的一种使用关系。
如何表达模块和模块调用??
Yourdon提出的模块结构图,比较重要。
是对软件总体结构的一种图形描述,它显示了软件的层次结构、组织和通讯。
如下图所示:
层次图
一个矩形框代表一个模块,框间的连线表示调用关系。
IBM提出的 HIPO图:
H:层次图 IPO:输入、处理、输出图
注:HIPO与层次图最大不同的是:编号。
总体设计步骤??
将DFD图映射为设计层面的模块及模块调用。
- 将DFD图转换为初始的模块结构图
- 基于“高内聚、低耦合”的软件设计原理通过模块化,将初始的模块结构图转化为最终的模块结构图。
如何实现DFD映射??
两种映射方法:
变换设计(变换流)
基于变换流的数据流程图是一个线性的顺序结构,由输入臂、输出臂和变换中心三部分组成。其中变换中心使系统数据发生本质的变化,输入臂将物理输入变换成逻辑输入,而输出臂则将逻辑输出变换成物理输出。
如下图所示:
事务设计(事务流)
基于事务的DFD图中有一个事务处理中心,它将输入分为许多相互平行的加工路径,然后根据输入的属性,选择某一加工路径。
如下图:
模块化及其启发式规则??
模块是执行一个特殊任务的一个过程以及相关的数据结构,包含模块接口和模块体。
如何实现?
1、分而治之和抽象 2、自顶向下,逐步求精 3、形成模块层次结构
分解原则?
高内聚,低耦合:软考也有涉及,详见软考考点之耦合与内聚类型区分
耦合是对两个模块之间的相互依赖程度的一种度量。
内容耦合:一个模块直接修改或操作另一模块数据,最差,不允许出现
公共耦合:两个模块共同引用一个全局数据项
控制耦合:一个模块向另一个模块传递控制信号,分解不全面,还可以再分解
标记耦合:一个模块向两个模块传递一个公共参数。
数据耦合:模块之间通过参数来传递数据。
耦合使用原则
尽量用数据耦合,少用控制耦合,限制公共耦合的范围,避免使用内容耦合。
内聚:指模块内部成分之间相互关联程度的度量。
偶然内聚:各成分没有任何关系
逻辑内聚:逻辑上相关处理放在一起
时间内聚:模块内的功能在同一时间完成
过程内聚:模块内处理以特定的次序执行
通信内聚:操作同一数据集
顺序内聚:一个成分的输出作为另一成分的输入
功能内聚:模块的所有成分完成单一的功能。
启发式规则:
不论是变换设计还是事务设计,都涉及到,对初始模块结构图进行精化,形成最终的模块结构图。总结出实现“高内聚低耦合的”启发式规则。
改进软件结构
提高软件独立性,模块分解
模块规模适中
一个模块的语句最好能写在一页纸内(通常不超过60行)
力求深度、宽度、扇出、扇入适中
深度:表示其控制的层数
宽度:同一层次上的模块总数的最大值
扇出:一个模块直接控制或调用下级模块的数目。
扇入:有多个上级模块直接调用它。
如2021年4月真题:
深度:指s控制的层数,往下有4层,所以深度为4,如果问的是体系结构的深度,那么再加上s本身,那就是5层。
宽度:看哪个层上,模块数量最多,很明显是第3层,有7个,所以宽度为7
扇出:看问的具体是哪个模块,如k的话,下面有四条线,所以是直接控制着o,p,q,r四个模块,所以扇出是4.
扇入:看有多少个模块直接调用它,也就是看上面有几条线,def,所以k的扇入是3.
控制域:包含模块本身,所以k的控制域是k o p q r.5个
作用域,上图是不没有判定存在,所以不存在作用域,判定一般是模块后面加个*,假设k后面有个*的话,那它的作用域就是opqr 4个。
原则
顶层模块扇出比较大,中间层模块扇出较小,底层模块具有较大的扇入。
尽量使模块的作用域在其控制域内
控制域:指这个模块本身以及所有的直接或间接从属它的模块的集合
作用域;受该模块内一个判断所影响的所有模块的集合。
控制域 > 作用域
软考考点:软考考点之模块设计
降低模块接口的复杂度
力求模块功能可以预测
详细设计??
给出划分模块的实施机制。描述的是模块结构图中的每一个模块。包括一组例程和数据结构。
目的
是将总体设计阶段产生的系统高层结构映射为以相关术语表达的低层结构。
方法:
结构化程序设计,模块化,基于结构的编程方法,三种结构:顺序、选择、重复结构,只允许一个入口和一个出口。
结构化本质:
使程序的执行控制线性化,实现程序动态执行顺序符合静态书写结构,提高程序的可读性。
详细设计工具??
程序流程图:
又称为程序框图,历史最悠久使用最广泛的描述过程设计的方法,也是用得最混乱的一种方法。
盒图(N-S图):
出于要有一种不允许违背结构程序设计精神的图形工具的考虑。Nassi和Shneiderman两个人提出
包括结构:
- 顺序
- if…then…else型分支
- case型多分支
- 循环
- 调用子程序
PAD图(问题分析图)
二维树形结构表达程序控制流。将图翻译成程序代码非常容易。
基本符号,参考下图:
软考相关部分:PAD图初认识
类程序设计语言(PDL,伪码)
它是用正文形式表示数据和处理过程的设计工具。
具有严格关键字外部语法,用于定义控制结构和数据结构另一方面PDL表示实际操作和条件的内部语法通常又是灵活自由的,以便可以适应各种工程项目的需要。因此,pdl是一种混杂语言,它使用一种语言(一般是某种自然语言)的词汇,同时却使用另一种语言(某种结构化的程序设计语言)的语法。
可以作为注释工具直接插在源程序中间。
设计规约?用标准化文档表达出模块
把总体设计和详细设计的内容用规范化的图表正式的文档,形成一份书面材料。描述满足所有功能模块,以及伴随功能模块而出现的非功能机制。
概要设计规约:
指明高层软件体系结构包括:系统环境、软件模块结构、模块描述、文件结构和全局数据文件的逻辑结构、测试需求
详细设计规约:
作为软件设计人员与程序员交流的媒体。包括:各处理过程的算法,算法所涉及全部数据结构的描述。