软件工程第二篇,也是收官篇。三块考点:
-
耦合与内聚:两个七级家族,考排序和"给描述认归属";
-
软件维护四类型:给场景认类型,外加一个"谁占比最大";
-
关键路径:活动网络图里找最长的路,上午题的计算常客。
一、耦合与内聚:好设计的八字方针------高内聚、低耦合
耦合 是模块之间的联系紧密程度,越低越好,七个等级从优到劣:
| 耦合(低→高) | 判别要点 |
|---|---|
| 无直接耦合 | 两个模块毫不相干 |
| 数据耦合 | 通过参数传递简单数据 |
| 标记耦合 | 通过参数传递整个数据结构(只用其中一部分) |
| 控制耦合 | 传递标志/开关,控制对方内部逻辑 |
| 外部耦合 | 通过外部环境(简单全局变量)联系 |
| 公共耦合 | 共享公共数据区(全局数据结构) |
| 内容耦合 | 直接动对方内部数据/代码(最差) |
内聚 是模块内部成分的团结程度,越高越好,七个等级从劣到优:
| 内聚(低→高) | 判别要点 |
|---|---|
| 偶然内聚 | 成分间没关系,凑巧放一起 |
| 逻辑内聚 | 逻辑上同类(如"所有输入操作") |
| 时间内聚 | 同一时刻要执行(如初始化模块) |
| 过程内聚 | 按固定流程顺序执行 |
| 通信内聚 | 成分使用相同的数据 |
| 顺序内聚 | 前一个的输出是后一个的输入 |
| 功能内聚 | 所有成分只为一个功能服务(最好) |
两个排序口诀:耦合"无数标控外公内",内聚"偶逻时过通顺功"。考排序题时把口诀默在草稿纸上,对号入座。
两个高频坑 :传标志位控制对方逻辑,看着像"传数据",其实是控制耦合 ;"共享数据"是通信内聚 ,"前者的输出是后者的输入"才是顺序内聚------这两个的界线就在"数据流向"上。
二、软件维护四类型:看动机认类型
-
改正性维护:软件有 bug,诊断并改正;
-
适应性维护 :环境变了------操作系统升级、硬件更换、数据库迁移,软件被迫跟着改;
-
完善性维护 :用户提新需求------加功能、扩报表、改进性能;
-
预防性维护:为将来打基础------重构、补文档,提高可维护性。
判别口诀:错了修是改正,环境变是适应,要新功能是完善,防将来是预防。
外加一个考点彩蛋:完善性维护占比最大(约一半以上)。软件交付后,用户没完没了的"能不能再加个功能",才是维护工作的主流。
三、关键路径:最长的路,决定最短的工期
先消化一个反直觉的点:
关键路径 = 活动网络图中最长的路径,它决定的是项目的最短工期。
为什么最长反而决定"最短"?因为所有活动都得干完项目才算完,工期被最慢的那条线拖住------其他线干得再快,也只能等它。
计算方法(三步):
-
正推 求最早时间:每个活动的最早开始 ES = 紧前活动最早完成 EF 的最大值;EF = ES + 时长;
-
逆推 求最晚时间:每个活动的最晚完成 LF = 紧后活动最晚开始 LS 的最小值;LS = LF − 时长;
-
松弛时间 = LS − ES (最晚开始 − 最早开始),松弛为 0 的活动连起来就是关键路径。
例题:某项目活动如下,A(2天) 先行;之后分两路:B(6)→D(2) 与 C(3)→E(4),两路汇合后 F(1) 收尾。
两条路径一目了然:
路径①:A → B → D → F = 2+6+2+1 = 11 天
路径②:A → C → E → F = 2+3+4+1 = 10 天
最长的是路径① → 关键路径 A-B-D-F ,最短工期 11 天。
完整算一遍松弛(考试常追问某个活动的机动时间):
| 活动 | 时长 | ES | EF | LS | LF | 松弛 |
|---|---|---|---|---|---|---|
| A | 2 | 0 | 2 | 0 | 2 | 0 |
| B | 6 | 2 | 8 | 2 | 8 | 0 |
| C | 3 | 2 | 5 | 3 | 6 | 1 |
| D | 2 | 8 | 10 | 8 | 10 | 0 |
| E | 4 | 5 | 9 | 6 | 10 | 1 |
| F | 1 | 10 | 11 | 10 | 11 | 0 |
解读 C 的松弛 = 1:C 最早第 2 天能开工,但最晚第 3 天开工也不耽误------因为 C-E 这条路总共只要 10 天,比关键路径少 1 天,这 1 天就是 C 可以"摸鱼"的机动时间。松弛 0 的 A、B、D、F 一天都拖不得,一拖全项目延期。
四、10 道练习题
基础题(1~5)
1. 下列耦合类型中,耦合程度最低(设计最优)的是( )。
A. 内容耦合 B. 公共耦合 C. 数据耦合 D. 控制耦合
2. 下列内聚类型中,内聚程度最高(设计最优)的是( )。
A. 偶然内聚 B. 时间内聚 C. 逻辑内聚 D. 功能内聚
3. 各类软件维护工作中,占比最大的是( )。
A. 改正性维护 B. 适应性维护 C. 完善性维护 D. 预防性维护
4. 为使软件能在新版本操作系统上正常运行而对其进行的修改,属于( )。
A. 改正性维护 B. 适应性维护 C. 完善性维护 D. 预防性维护
5. 在活动网络图中,关键路径是指( )。
A. 最长的路径,决定项目的最短工期 B. 最短的路径 C. 包含活动最多的路径 D. 消耗资源最多的路径
进阶题(6~10,带坑)
6. 某模块通过参数向另一模块传递一个标志位,该标志位用于控制接收模块的内部逻辑,这种耦合属于( )。
A. 数据耦合 B. 标记耦合 C. 控制耦合 D. 内容耦合
7. 某模块内部各成分都使用同一组输入数据(对该组数据做多种处理),该模块的内聚属于( )。
A. 过程内聚 B. 通信内聚 C. 顺序内聚 D. 功能内聚
8. 某项目活动网络中,活动 A(2 天)完成后分两路并行:B(6 天)→D(2 天)与 C(3 天)→E(4 天),两路汇合后经 F(1 天)结束。该项目的最短工期为( )。
A. 10 天 B. 12 天 C. 9 天 D. 11 天
9. 同上题的活动网络,活动 C 的松弛时间(总时差)为( )。
A. 0 天 B. 1 天 C. 2 天 D. 3 天
10. 用户认为现有系统的统计报表不够丰富,要求增加几种新的统计报表,此类维护属于( )。
A. 完善性维护 B. 改正性维护 C. 适应性维护 D. 预防性维护
五、答案与详解
1. C 默口诀"无数标控外公内":数据耦合排第二(仅次于无直接耦合),四个选项里最低。内容耦合垫底最差。
2. D 默口诀"偶逻时过通顺功":功能内聚登顶------全模块只为一件事服务,是内聚的最高境界。
3. C 记住这个"反常"数据:维护工作量的半壁江山是完善性维护------不是修 bug,而是用户不断要新功能。
4. B 关键词"新版本操作系统"------环境变了 → 适应性维护。软件本身没错(不是改正),用户也没要新功能(不是完善)。
5. A 最长路径决定最短工期------所有活动都完工项目才结束,工期被最慢的一条线拖住。选 B 的恰恰记反,这是本考点的第一直觉坑。
6. C 大坑 :传递的虽然是个"数据",但它的用途是控制对方内部逻辑 (开关/标志)→ 控制耦合 。判耦合别看传的是什么形式,看传的用途:传数据用 → 数据耦合;传整个结构 → 标记耦合;传开关指挥对方 → 控制耦合。
7. B 判别内聚看成分间的粘合剂 :"用同一组数据"粘在一起 → 通信内聚;"前者的输出喂给后者"才是顺序内聚------本题只说共用输入,没说加工链,别自动脑补成顺序。
8. D 两条路径:A-B-D-F = 2+6+2+1 = 11 ;A-C-E-F = 2+3+4+1 = 10。取最长 → 最短工期 11 天。选 A 的拿了较短路径当工期------较短的那条干完只能干等,决定不了工期。
9. B C 所在路径比关键路径短 1 天,这 1 天就是机动量:C 最晚可推迟 1 天开工(LS=3)而不影响总工期 → 松弛 1 天。选 A 的是默认"C 也在关键路径上"------先找最长路径,松弛为 0 的才在关键路径上。
10. A "增加几种新报表" = 用户要新功能 → 完善性维护。软件没出错(非改正)、环境没变(非适应)、也不是防患未然(非预防)。判别口诀:错了修是改正,环境变是适应,要新功能是完善,防将来是预防。
六、五句话带走
-
目标:高内聚、低耦合;耦合"无数标控外公内",内聚"偶逻时过通顺功";
-
判耦合看用途 (传开关 = 控制耦合),判内聚看粘合剂(共享数据 = 通信,前出后入 = 顺序);
-
维护四类型:改正修 bug、适应跟环境、完善加功能(占比最大)、预防为将来;
-
关键路径 = 最长路径 = 最短工期 ;正推取大、逆推取小、松弛 0 即关键;
-
非关键活动的松弛时间 = 它与关键路径的"时长差",就是它合法摸鱼的天数。
下一篇预告 :转进面向对象------UML 类图六种关系:泛化、实现、关联、聚合、组合、依赖,箭头傻傻分不清?空心三角、空心菱形、实心菱形各自朝向谁,一篇讲透。这正好接你之前写过的设计模式系列------UML 类图是所有设计模式的通用语言,也是下午面向对象大题的必备武器。