第8章 · 播客 第4集

系统分析与设计方法 · 结构化设计与模块独立性

🎙️ 本集播客第4集:概要设计五步流程、结构图三成分、变换流与事务流的分辨(第 12 题)、四种详细设计工具的优缺点对比,以及模块设计的两大原则——信息隐蔽与模块独立,高内聚低耦合(第 4 题)。 语音由微软 Edge 神经网络语音预生成(女声·晓伊,男声·云希)。点击下方任意对话可直接从该句开始播,当前句朗读时下一句已预先加载,无缝衔接。
🎙️ 第8章播客 第4集
⬇ 下载本集 点击播放
阿明
上集的衔接我记得,这集是结构化设计的半边。
小雅
对。结构化设计包括架构设计、接口设计、数据设计和过程设计等任务。它是一种面向数据流的设计方法,是以结构化分析阶段所产生的成果为基础,进一步自顶而下、逐步求精和模块化的过程。四个任务、三个过程特征,先记总纲。
阿明
概要设计的任务上集提过一句,这里展开讲吧。
小雅
概要设计阶段的主要任务是设计软件的结构、确定系统是由哪些模块组成,以及每个模块之间的关系。它采用结构图来描述程序的结构,此外还可以使用层次图和 HIPO,也就是层次图加输入处理输出图。整个设计过程主要包括五步:复查基本系统模型;复查并精化数据流图;确定数据流图的信息流类型,包括变换流和事务流;根据流类型分别实施变换分析或事务分析;根据软件设计原则对得到的软件结构图进一步优化。五步顺序别乱,尤其第三步和第四步是绑定的。
小雅
详细设计阶段的主要任务则是确定应该如何具体地实现所要求的系统,得出对目标系统的精确描述。它采用自顶向下、逐步求精的设计方式和单入口单出口的控制结构。常使用的工具包括程序流程图、盒图、PAD 问题分析图、PDL 程序设计语言。四种工具后面逐个辨。
阿明
结构图是概要设计的主图?
小雅
对。结构图的基本成分包括三个:模块、调用,即模块之间的调用关系、数据,即模块间传递及处理数据信息。结构图是在需求分析阶段产生的数据流图的基础上进行进一步的设计。它将 DFD 图中的信息流分为两种类型,这就是变换流和事务流。
小雅
变换流的定义:信息首先沿着输入通路进入系统,并将其转换为内部表示,然后通过变换中心,也就是加工的处理,再沿着输出转换为外部形式离开系统。具有这种特性的加工流就是变换流。三个环节——输入、变换中心、输出,像一条直线穿过系统。
小雅
事务流的定义:信息首先沿着输入通路进入系统,事务中心根据输入信息的类型在若干个动作序列,也叫活动流,中选择一个执行,这种信息流称为事务流。关键词是「事务中心」和「在若干个动作序列中选择一个执行」,像铁路道岔,来什么类型的车就扳向哪条岔道。
阿明
练习题第 12 题考的就是这个,问事务流的特点。
小雅
正确选项是:事务中心根据输入信息的类型在若干个动作序列中选择一个执行。干扰项逐个拆:A 选项「信息沿输入通路进入系统,经过变换中心处理后沿输出通路离开」——这是变换流的定义,对象张冠李戴;C 选项「所有处理步骤顺序执行,数据以整体方式传递」——原文没有这种说法;D 选项「信息以递增方式处理,数据结果延迟小」——同样是编造的。这两种流的辨析是必考题,记住道岔和直线的画面就不会错。
阿明
直线是变换流,道岔是事务流。详细设计的四种工具怎么辨?
小雅
先说程序流程图和盒图,它们都是用来描述程序的细节逻辑的。程序流程图的特点是简单、直观、易学,但它的缺点也正是由于其随意性而使得画出来的流程图容易成为非结构化的流程图。而盒图正是为了解决这一问题设计的,它是一种符合结构化程序设计原则的图形描述工具。
小雅
盒图的主要特点是:功能域明确、无法任意转移控制、容易确定全局数据和局部数据的作用域、容易表示嵌套关系、可以表示模块的层次结构。但它也带来一个副作用,那就是修改相对比较困难。问「哪种图无法任意转移控制」,答盒图;问「盒图的缺点」,答修改相对困难。
小雅
再说 PAD 和 PDL。PAD 是问题分析图的缩写,它符合自顶向下、逐步求精的原则,也符合结构化程序设计的思想,最大的特点在于能够很方便地转换为程序语言的源程序代码。PDL 则是语言描述工具,它和高级程序语言很相似,也包括数据说明部分和过程部分,还可以带注解等成分,但它是不可执行的。PDL 是一种形式化语言,其控制结构的描述是确定的,但内部的描述语法是不确定的。PDL 通常也被称为伪码。
阿明
PAD 的招牌是「方便转换成源代码」,PDL 的招牌是「不可执行、也叫伪码」。
阿明
接下来是这集的重头戏,模块设计吧?
小雅
对,8.3.3 模块设计。在结构化方法中,模块化是一个很重要的概念,它是将一个待开发的软件分解成为若干个小的简单部分——模块,每个模块可以独立地开发、测试。这是一种复杂问题的分而治之原则,其目的是使程序的结构清晰、易于测试与修改。
小雅
模块的准确定义:模块是指执行某一特定任务的数据结构和程序代码。通常将模块的接口和功能定义为其外部特性,将模块的局部数据和实现该模块的程序代码称为内部特性。模块经常具有连续性,也就意味着作用于系统的小变动将导致行为上的小变化,同时规模说明的小变动也将影响到一小部分模块。在模块设计时,最重要的原则就是实现信息隐蔽和模块独立。两大原则,先说信息隐蔽。
小雅
信息隐蔽是开发整体程序结构时使用的法则,即将每个程序的成分隐蔽或封装在一个单一的设计模块中,并且尽可能少地暴露其内部的处理。通常将难的决策、可能修改的决策、数据结构的内部连接以及对它所做的操作细节、内部特征码、与计算机硬件有关的细节等隐蔽起来。通过信息隐蔽可以提高软件的可修改性、可测试性和可移植性,它也是现代软件设计的一个关键性原则。注意提高的是可修改性、可测试性、可移植性这三性,不是性能。
阿明
那模块独立呢?练习题第 4 题好像就在这儿。
小雅
对。模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系最简单。通常用耦合和内聚两个标准来衡量。两个定义抠准:耦合是模块之间联系的紧密程度;内聚是模块内部各元素之间联系的紧密程度。设计的目标是高内聚、低耦合。练习题第 4 题问「衡量模块独立性的两个标准是耦合和内聚,设计的目标是什么」,答案就是高内聚、低耦合。四个选项低内聚低耦合、高内聚高耦合、低内聚高耦合都是干扰,方向记死:内聚往高走,耦合往低走。
小雅
数量的细节也要记:模块的内聚类型通常可以分为 7 种,根据内聚度从高到低排序;与此相对应,模块的耦合性类型通常也分为 7 种,根据耦合度从低到高排序。两个 7 种,一个内聚从高到低、一个耦合从低到高,排序方向相反,这个方向本身就是考题——问「内聚类型的排序」答从高到低,问「耦合类型的排序」答从低到高。
阿明
七种内聚、七种耦合具体是哪些?考试会不会让我排序具体某两个?
小雅
这一版教材原文只给出了数量和排序方向,具体七级的名称没有列出,所以以原文为纲的考试不会考到具体级名的排序细节。你把三句拿稳就够:第一,内聚和耦合是衡量模块独立性的两个标准;第二,目标是高内聚、低耦合;第三,内聚七种按内聚度从高到低排,耦合七种按耦合度从低到高排。这也呼应上集设计总纲里那句优秀的系统设计要做到高内聚、低耦合。
阿明
行,以原文为纲。除了两大原则,模块分解还有什么讲究?
小雅
还有一串注意事项,原文一口气列了六条:保持模块的大小适中;尽可能减少调用的深度;直接调用该模块的个数应该尽量大,但调用其他模块的个数则不宜过大;保证模块是单入口、单出口的;模块的作用域应该在控制域之内;功能应该是可预测的。这里面「单入口单出口」和详细设计的控制结构那句是同一个精神,「作用域应在控制域之内」也是判断题常客。
阿明
六条里「直接调用它的越多越好、它调用别人的不宜过多」这条有点反直觉,我标一下。
小雅
可以标,但别改原文口径:扇入大说明这个模块复用度高,扇出大说明它管得太宽。本集必背:结构化设计包括架构设计、接口设计、数据设计、过程设计四任务;概要设计用结构图,过程五步——复查基本系统模型、复查并精化数据流图、确定信息流类型、实施变换分析或事务分析、优化软件结构图;变换流是输入、变换中心、输出的直线,事务流是事务中心按类型选一个动作序列执行的道岔;程序流程图简单直观但随意性强,盒图符合结构化原则、无法任意转移控制、缺点是修改困难;
小雅
PAD 最大特点是方便转换为源代码,PDL 不可执行、也称伪码;模块外部特性是接口和功能,内部特性是局部数据和程序代码;信息隐蔽提高可修改性、可测试性、可移植性;耦合是模块间联系、内聚是模块内元素间联系,目标是高内聚低耦合,各七种,内聚从高到低、耦合从低到高;分解注意模块大小适中、减少调用深度、扇入宜大扇出不宜大、单入口单出口、作用域在控制域内、功能可预测。
阿明
结构化这半座山翻过去了。
小雅
下一集开始本章第二座大山:面向对象的分析与设计。对象三要素、实体类边界类控制类的辨析(练习题第 11 题)、继承泛化、多态四形式、重载与改写的本质区别(第 6 题),还有 OOA/OOD、Booch、OMT、OOSE 四大方法。