文章目录
模块化与信息隐藏思想
动机
好的软件指的是什么?
Parnas 1972
- 可管理、灵活、 可理解
- 特征
模块之间关联少,模块不太依赖别的模块
模块的独立替换、装配,不会波及到整个系统
Stevens 1974
- 简洁性(Simplicity):易于调试,易于分解
- 可观察性(Observability):易于修改
Beohm 1976
可维护,可扩展,可理解,可重用
发展
概述
- 软件工程整体发展背景
1960年代:“软件不是硬件”的观点
1970年代:“软件 = 数据 + 算法”的观点,瀑布过程模型,形式化方法
1980年代:重用的概念,对象的概念,人件的概念 - 模块化与信息隐藏思想的历史发展
萌芽期:Wirth 1971年论文;Parnas 1972年论文
形成期:Stevens 1974年论文;Parnas 1978年论文;Parnas 1985年论文
发展期:Eder 1992年论文;Hitz 1995年论文
反思:McConnell 1996年论文;Demarco 2002年论文
注意:其中,萌芽期与形成期的成果主要是在结构化范式方面的思考;后面的主要是在面向对象方面的研究
Wirth 1971
- 程序的优化与数据结构并行
- 程序模块化:决定了程序可以应对未来的修改和扩展
- 每一步进化都意味着一些列新的设计决策
- 小心编程不容易做到
Parnas 1972
- 什么是模块化
模块化不仅仅是将程序分成各个子程序,是职责的分配(将系统分成相对独立的模块)
如何分配职责也是设计决策
模块化设计决策层次高于模块的内部实现 - 如何进行模块化
如何进行模块化(分配模块)在于要看模块隐藏了什么信息;根据要隐藏的信息来模块化是模块化的指导原则 - 模块或程序之间存在的关系(将模块联系起来的关系)主要是使用和依赖
好的封装将处理控制的逻辑藏在模块内,其他人并不需要知道,只知道如何调度即可
Stevens 1974
- 结构化设计的奠基文章
- 首次阐述了“耦合”:模块之间联系强度的度量
- 定义了模块和内聚,首次提出耦合
- 结构化设计的流程
Step 1: 描述问题功能

Step 2: 识别交互的数据流
Step 3: 识别哪里是输入、处理、输出(参考数据流图像结构图转化的过程)

Step 4: 将数据流图转化为结构图,确定各模块间的信息传递(出入)

A为控制模块,BCD分别为输入、处理、输出模块
Step 5: 具体地对每个模块做的事进行描述(如何调用、需要哪个模块),对模块之间的关系进行细化和描述

- 讨论了两个概念
模块的控制范围:模块们之间以树状结构的形式组装起来,每个模块的子树就是其控制范围;如果要改动什么东西,在其控制范围内的改动是可以的;超出控制范围则会有麻烦(如B,C下都有改动就超出了B的控制范围)
模块的影响范围:决策影响在控制范围之内的系统是更简单的
Parnas 1978
- 模块之间的使用关联:什么时候A用B
A 使用 B如果B的执行对A完成自己的任务来说是必要的话
当满足下列所有条件后,允许A使用B
A因为使用B本质上变得简单
B因为不使用A免于变得相对复杂
有包含B而不需要A的子集
没有包含A而不包含B的子集
Parnas 1985
- 这篇论文类似于做项目之后的报告
- 归功于Module Guide:是对每个模块的说明,包括了主要、次要秘密、角色、分配模块职责时的条件(当时系统设计是和硬件一起的)
- 不同层次的Module,分别论述每层要解决的问题:一层、二层、三层……分解
- 秘密
主要秘密:模块内隐藏的信息(如潜在变更)
次要秘密:实现模块的实现决策 - 最顶层分解
屏蔽硬件细节的模块
Behavior-Hiding Module
包含软件设计决策的模块 - 意义:1985年文章之后,对结构化中的内聚、耦合、如何做模块化和信息隐藏等问题有了充分阐述
Eder 1992
- 面向对象设计中的内聚和耦合
- 对内聚与耦合的定性分析
Hitz 1995
- 对内聚与耦合进行定量分析
- 两类耦合:类层次的耦合和对象层次的耦合
McConnell 1996
- 提醒大家一个被忽视的武器:信息隐藏
- 信息隐藏<

最低0.47元/天 解锁文章
977

被折叠的 条评论
为什么被折叠?



