ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

软件工程详细设计核心考点:耦合内聚与流程图、N-S图解析

软件工程详细设计核心考点:耦合内聚与流程图、N-S图解析 期末复习那会儿最怕的就是翻开第九章——内容看起来全懂概念名词也眼熟但一到章节测验就发懵耦合和内聚到底是强好还是弱好流程图和结构图的箭头哪个能带拐弯更别提那些“画N-S图”“写伪代码”的设计题光看题目就觉得无从下手。这篇文章我就把软件工程这门课第九章最常考的题目类型、答案依据和解题思路一次说清楚。内容不会原样照搬题库而是把高频考点拿出来逐条解析顺带附上我在实际复习和做课设时验证过的答题模板适合正在准备章节测验、期末考或者做课程设计时被“详细设计”卡住的同学。1. 第九章到底在考什么先给整章知识画个地图1.1 不同教材下第九章的“角色定位”先说明一个很多同学容易困惑的问题不同学校、不同教材的《软件工程》第九章章节内容并不完全一致。张海藩版本、吕云翔版本、还有一些国外翻译教材章节划分差异挺大。有的第九章讲“详细设计”有的讲“面向对象设计”还有的讲“软件测试基础”。不过从吉林大学软件工程课程常见的教学安排和测验题型来看第九章绝大多数指向的是软件设计阶段尤其是详细设计这部分内容。热词里反复出现“软件工程流程图”和“floyed算法类似的算法软件工程”也印证了第九章的核心是围绕“流程描述”“算法描述”“模块设计”展开的。所以这篇文章以设计阶段为主轴先讲模块化设计的基本原则再拆解耦合与内聚这对核心概念接着处理流程图、N-S图、PAD图等详细设计工具的考题最后补充算法描述类题目的作答套路。这样不管是章节测验还是期末考试你在第九章碰到的题目基本都能框在这个范围内。1.2 高频考点分布与分值判断根据我对历年章节测验和软工课设题目的观察第九章的知识点大致可以分成四类考试频率和典型题型如下表考点模块核心知识点常见题型出题概率模块独立性内聚类型、耦合类型、模块化原则选择题、判断题、简答题极高详细设计工具流程图、N-S图、PAD图、判定表、伪代码画图题、设计题高结构化设计方法数据流图导出结构图、变换分析与事务分析简答题、设计题中高算法描述与逻辑表达结构化三种基本结构、算法实现伪代码题、综合应用题中从分值上看选择题判断题约占30分简答题约占30分画图和算法设计题约占40分。很多同学在选择题上凭借“印象”能蒙对几个但一到画图题和算法描述题就大面积失分。原因是背概念不等于会运用——第九章的考察核心是“能不能把一个处理过程清晰无误地表达出来”。2. 章节测验典型选择题与判断题答案与解析2.1 高频选择题模块化与耦合内聚选择题最喜欢考的就是“给一个场景判断属于哪种耦合或内聚”。这种题光背定义不够得抓住关键特征词。题目一两个模块之间通过传递一个数据结构来完成通信但接收方只需要使用其中部分字段。这两个模块之间的耦合类型是A. 数据耦合 B. 标记耦合 C. 控制耦合 D. 内容耦合答案B。解析数据耦合是模块间只通过参数传递普通数据项比如传递一个整数标记耦合也叫特征耦合是传递整个数据结构。虽然接收方只用了其中两个字段但它必须知道整个数据结构的内部组织因此模块间的依赖程度比数据耦合更深一层。这道题的错误选项集中在A很多同学看到“传参数”就选了数据耦合忽略了“整个结构体”这个关键信息。题目二一个模块内部的各个处理动作之间没有直接联系但都受同一个判定条件控制选择某个动作执行。这种内聚类型是A. 逻辑内聚 B. 时间内聚 C. 过程内聚 D. 功能内聚答案A。解析逻辑内聚的典型特征就是“把逻辑上相似、处理方式相近的功能凑在一个模块里通过条件选择执行哪个”。最经典的例子是把“读磁带”“读卡片”“读磁盘”放在一个模块里按输入设备类型来决定执行哪个分支。而过程内聚强调各处理动作按特定顺序执行时间内聚强调的是在同一时间段内执行。逻辑内聚和时间内聚是两种容易被混淆的低内聚类型考试时看到“同一个条件下选择执行”这类描述优先判断逻辑内聚。题目三软件设计阶段的任务是A. 确定“做什么”产出需求规格说明 B. 确定“怎么做”把需求转换为软件表示 C. 编写代码 D. 设计测试用例答案B。解析这个问题看着简单但错误率不低。需求分析阶段回答“系统必须做什么”设计阶段回答“系统应该怎么做”。设计阶段的产出包括数据设计、体系结构设计、接口设计和部件级设计。至于“编写代码”那是编码实现阶段的事情。有些同学分不清设计和实现的边界一看到“怎么做”就联想到写代码实际上设计是写代码之前的抽象方案设计。题目四模块的作用域和控制域的关系应当是A. 作用域是控制域的子集 B. 控制域是作用域的子集 C. 二者互不相关 D. 二者必须完全相等答案A。解析作用域也称影响域是指“受该模块内判定影响的所有模块的集合”控制域是“该模块本身及其所有下属模块的集合”。为了保证模块的独立性一个模块的“作用域”最好就在它自己的“控制域”范围之内换句话说做判断的模块尽量要让受影响的模块在自己的管理范围内。这条原则在实际设计中的体现是如果某个判定影响了离自己很远的模块说明模块划分不够合理。2.2 高频判断题易混概念辨析判断题没有选项兜底完全看概念是否精确。以下四道是测验里的“回头客”。题目一模块之间耦合度越低越好模块内部内聚度越高越好。答案正确。解析这是模块独立性的核心表达。耦合是模块之间的相互依赖程度依赖越强改动一个模块时影响面越大维护成本越高内聚是模块内部各元素结合的紧密程度结合越紧密模块职责越单一越好理解、修改和测试。这两个指标一个管“模块之间”一个管“模块内部”是衡量软件设计质量的核心标准。题目二信息隐蔽原则是面向对象设计独有的设计原则。答案错误。解析信息隐蔽最早是Parnas在1972年提出的属于软件设计阶段的通用原则适用于结构化设计也适用于面向对象设计。它的核心思想是“模块内部的数据和实现细节对外不可见”模块之间只通过接口通信。面向对象里的“封装”实际上就是信息隐蔽原则的一种实现形式但不能反过来说信息隐蔽只属于面向对象。题目三在进行软件设计时应该尽量提高模块的扇入数并控制模块的扇出数。答案正确。解析扇入指的是直接调用该模块的上级模块个数扇出指该模块直接调用的下级模块个数。扇入高说明模块被复用得多功能抽象得好扇出太高则说明模块承担的协调职责过重、层次不清晰。一般经验是扇出控制在3到4个左右最好不超过7个。这个“7”来源于人类短期记忆的容量限制符合“7±2法则”属于设计经验范畴。题目四数据流图既可以用于需求分析阶段也可以用于软件设计阶段。答案正确。解析数据流图在需求分析阶段用来建立功能模型描述数据从输入到输出的流动和变换过程在设计阶段则可以通过变换分析和事务分析把数据流图转换为软件结构图。这点很多同学理解不到位总认为数据流图“只是需求分析的图表”忽略了它作为设计输入的重要作用。3. 简答题与设计题拿满分的答题模板3.1 简答题内聚与耦合的关系标准答题结构简答题常见的设问方式是“什么是模块独立性用什么指标度量内聚和耦合有什么关系”这种题看着基础但丢分往往是因为答得不完整。我推荐的满分结构是“总定义 分项解释 关系表述 设计原则”。参考答案可以这样组织模块独立性指每个模块只完成系统要求的独立子功能并且与其他模块的联系最少、接口最简单。度量模块独立性的两个定性指标是内聚和耦合。内聚是一个模块内部各元素之间紧密程度的度量耦合是模块之间相互依赖程度的度量。内聚和耦合是相互关联的模块内聚度越高模块间的耦合度往往越低反之模块内聚度越低模块间需要传递的信息和相互协调就越多耦合度就可能偏高。因此设计时应力求做到“高内聚、低耦合”这有助于降低系统的复杂度提高可维护性、可复用性和可测试性。答题时要注意把“高内聚低耦合”和它的好处都写出来。很多同学只写定义不写意义结果被扣掉一点“设计原则”的分。另外如果题目明确问了“用什么指标度量”一定把内聚、耦合分别展开最好能带一两个例子说明比如“一个模块只做一种功能属于功能内聚是内聚度最高的情况”。3.2 画图题流程图、N-S图、PAD图的操作要点画图题是第九章的“硬骨头”也是“软件工程流程图”这个热词指向的核心内容。很多同学画流程图只是凭印象画个大概结果判卷时被扣细节分。下面把三种工具的要点分开说。流程图传统程序流程图的画法规范起止框用圆角矩形或椭圆每个流程只能有一个开始可以有多个结束。处理框用矩形表示赋值、计算等操作。判断框用菱形必须有明确的出口条件即“真/假”或“是/否”的标注。每条箭头代表控制流方向箭头上通常标注条件。处理顺序从上到下循环结构要特别注意出口条件的判定位置。举一个最常考的“求1到n的累加和”例子开始后给累加器sum赋初值0给计数器i赋初值1进入判断i小于等于n吗真则执行sum加i然后i自增再回头重新判断假则输出sum程序结束。这里最容易画错的是循环出口——不少同学把判断放到累加之后导致多累加一次或者漏掉第一次。N-S图盒图的画法规范N-S图的全称叫Nassi-Shneiderman图最大特点是没有箭头所有算法逻辑都通过嵌套矩形框表达。顺序结构就是上下排列的矩形选择结构就是多分支嵌套的矩形循环结构用外框加循环条件表示。它最大的优势是“强制结构化”——因为没有箭头你没法在N-S图里随手画出非结构化的跳转所以考题里常要求“将下列流程图改画为N-S图”本质上就是考察你是否理解三种基本结构的嵌套组合。PAD图问题分析图的画法规范PAD图采用二维树形结构表达程序逻辑。顺序结构是纵向的线段条件结构在横线上向右展开分支循环结构则用带箭头的环形符号区分“当型”和“直到型”。PAD图比流程图更适合表示层次化逻辑因为它可以直接从图上看出控制结构的嵌套层次所以也被很多软件设计工具用作自动生成代码的中间表示。画图题的高分技巧有两点。第一先搭骨架再补细节先确定三种基本结构再往里面填具体操作。第二标清所有分支条件漏标条件是最常见的扣分点。4. 进阶思考从Floyd算法聊聊详细设计里的算法描述4.1 为什么测验里会出现“类似Floyd的算法设计题”热搜词里有一条叫“floyed算法类似的算法软件工程”单独看有点奇怪但放在第九章语境下就很好理解。详细设计阶段除了要设计模块结构还要对模块内部的处理逻辑进行算法描述。于是老师们的出题思路就变成不给简单的“求累加和”而是找一个经典算法比如Floyd最短路径、Prim最小生成树、KMP模式匹配之类让你用伪代码或流程图把这个算法的执行过程描述出来。这种题型的真实用意不是考算法本身而是考“你有没有用软件工程的方式表达算法的能力”。同样一个Floyd算法代码人人都能写几行但要把三重循环的递推过程用流程图画清楚、在注释里说明每个变量的含义、把初始化和迭代条件写得无歧义这才是软件工程重点训练的工程化表达能力。我用Floyd算法举个例子。算法思想是通过逐步引入中间节点来更新任意两点之间的最短路径长度核心是三重循环// n为顶点个数dist[i][j]为i到j的当前最短路径长度 // path[i][j]记录从i到j的最短路径经过的中间节点 for (k 0; k n; k) { for (i 0; i n; i) { for (j 0; j n; j) { if (dist[i][k] dist[k][j] dist[i][j]) { dist[i][j] dist[i][k] dist[k][j]; path[i][j] k; } } } }如果在测验题里见到这类题答题的关键就是把这个“不断比大小、不断更新”的迭代逻辑清晰地分层表达出来。最外层的k表示“允许经过前k个中间节点”内层循环遍历所有点对最后判断是否通过k点可以缩短路径。4.2 算法设计题的通用作答流程面对这种“给定算法请用流程图/伪代码描述”的题目我总结了一套实战流程。第一步审题时先明确三个要素输入是什么、输出是什么、处理过程的主要数据结构是什么。以Floyd为例输入是带权邻接矩阵和顶点个数输出是最短距离矩阵和路径矩阵。第二步把算法切成三层初始化层、迭代层、输出层。初始化层设置dist矩阵的初值有直接边的填权重没有的填无穷大自己到自己填0迭代层用三重循环更新输出层按需要打印路径或返回距离矩阵。第三步用伪代码写主框架时只保留最核心的逻辑不要陷入语言的语法细节。伪代码可以混用中文和类C语法关键是让阅卷人一眼看出“这个循环在做什么”。第四步如果要画流程图先画最外层的循环判断再画内层循环和处理框。特别提示嵌套循环的流程图画起来非常容易乱建议在图中用文字标明每一层循环的变量名比如“k循环”“i循环”“j循环”这既是工程技术上的常用做法也能帮助判卷老师快速跟你建立“共识”分数自然更稳。此外还有一类“算法设计综合题”比如给一个“求最大公约数的辗转相除法”让你设计模块并画出对应流程图。这时你应该先用自然语言描述算法再转化为三结构的控制流程最后画框图。这种“由文到图”的转换能力恰恰是详细设计阶段最需要练的基本功。5. 高频易错点与避坑指南5.1 概念辨析耦合与内聚的强弱排序表概念排序题是选择题和判断题里的“送命题”因为教材里给的类型较多又没有口诀就容易混。我把常见的耦合度和内聚度的强弱排序整理如下建议直接背下来。耦合程度由低到高排列非直接耦合两个模块之间没有直接关系。数据耦合模块间通过参数传递普通数据项。标记耦合模块间传递数据结构。控制耦合模块间传递控制信号如标志值、开关量。外部耦合模块受同一外部数据格式或协议约束。公共耦合多个模块共享公共数据区。内容耦合一个模块直接访问另一个模块的内部数据或代码。内聚程度由低到高排列偶然内聚模块内各元素之间关系松散纯属偶然组合放在一起。逻辑内聚由逻辑相似的功能组合而成靠条件选择执行。时间内聚模块内各动作在同一时间段执行。过程内聚各处理元素按特定顺序执行但顺序是由业务规则决定的。通信内聚各处理元素使用相同的输入数据或产生相同的输出数据。顺序内聚一个元素的输出作为下一个元素的输入。功能内聚模块内所有元素共同完成一个单一功能。记忆技巧耦合记住“从无到有、从松到紧”内聚记住“从散到整、从乱到专”。考试时可以用这个顺口溜快速定位。5.2 画图规范与命名细节画图题中几个反复出现的扣分细节专门拿出来强调一下。第一判断框出口必须标条件。很多同学画菱形框时只画了两条线出去但线上不写字。这是不完整的设计表达——只有明确标注了“是/否”或“真/假”阅读者才知道哪条分支对应什么情况。第二循环结构要分清先判断后执行还是先执行后判断。先判断后执行是当型循环While型用流程图表示时判断框在上方先执行后判断是直到型循环Until型判断框在下方。这个差别在N-S图和PAD图中同样存在概念不清很容易在画图题里失分。第三模块命名要体现功能而非过程。比如模块名叫“计算工资”是功能式命名应该提倡如果叫“先读数据再算再打印”就是过程式命名不符合模块独立性思想。设计题里阅卷老师对命名规范比较看重一个动宾结构的命名方式能直接拉高印象分。5.3 时间安排与复习策略第九章的特点决定了死记硬背效率很低。概念部分可以靠整理表格背下来但画图和算法描述必须动手练。我在复习阶段的做法是先把课本上的例题流程图遮住自己重新画一遍再对照原文找差异然后找课程设计或往年题中的算法题用伪代码和流程图各写一遍最后把容易混淆的耦合内聚类型排列成表每天早上过一遍。另外一个小的实操技巧是练习用文字描述流程图。因为有些题目不要求你画图而是要求你“描述某个模块的处理流程”。这时候如果你能在纸上先用文字写清楚“输入什么→经过什么判断→执行什么→输出什么”阅卷人就能快速抓到你踩中了得分点。这个习惯在真正的机试或面试表达中也很有用。6. 写在实际操作后面的话我当年学这一章时最深的体会是画图题和算法描述题越怕越要动笔脑子里想一百遍不如在纸上画一遍。尤其是N-S图和PAD图初看觉得麻烦但画熟之后你会发现它们对“结构化思维”的训练很有效——一个流程如果不是用三种基本结构搭的在N-S图里根本画不出来。这也是软件工程课程把详细设计放在编码前面的原因设计图表达不清楚写出来的代码大概率也是东拼西凑。你把这章的选择题概念背熟再把画图题和算法题的套路练到位测验基本就稳了。
返回列表