北京理工大学
软件工程实践
汤铭端
中国航天科工集团公司 706所
第二讲
结构化方法
内容和目的
? 了解结构化方法的产生和有关概念
? 掌握结构化方法的基本原则
? 了解结构化分析、设计、编程方法的基
本内容
? 了解软件开发的一般原则
软件开发方法
? 软件开发方法是软件开发过程所遵循的
方法和步骤,其目的在于有效地得到一
些工作产品,既程序和文档,并且满足
质量要求
? 程序设计方法是软件开发方法的组成部
分
? 此外还有分析方法和设计方法
评价软件开发方法的四大特征
? 技术特征:支持各种技术概念的方法特色,如层次性、抽
象性、并行性、安全性、正确性等
? 使用特征:用于具体开发时的特色,如易理解性、易移植
性、易复用性、工具的支持、任务范围、使用的广度、活
动过渡的可行性、产品的易修改性、对正确性的支持等
? 管理特征:增强对软件开发活动管理的能力方面的特色,
如易管理性、支持或阻碍团队工作的程度、中间阶段的确
定、工作产品、配置管理、阶段结束准则、费用估计等
? 经济特征:给软件组织产生的在质量和生产力方面的可见
效益,如分析活动的局部效益、全生存周期效益、获得该
开发方法的代价、使用它的代价、管理的代价等
选用软件开发方法的考虑因素
1 对该开发方法是否已具有经验,或者已
有受过培训的人员
2 开发项目的进度、人员组成情况
3 为开发项目提供的资源如何
4 计划、组织、管理的可行性
5 开发项目的领域知识准备情况
航天的考虑
? 结构化方法较全面, 最成熟, 最基础,
使用最广泛, 有成功经验
? 结构化方法适合航天软件研制工作
? 结构化方法是基础性方法
? 结构化方法包括就形成了配套的软件结
构化分析方法, 结构化设计方法和结构
化编程方法, 其核心和基础是结构化程
序设计理论
为什么要讲这些所谓的, 方
法,?
“我只要满足需求就可以了,我自己开发使用什么方法你
管不着。”
“这些方法根本没有什么用处,我们那里高手很多,我
们不屑于使用这些方法。”
“结构化, 起源:对 GOTO的认
识
? 1968年 Dijkstra在 ACM通讯中发表了
,GOTO语句是有害的, 文章,认为:
GOTO语句是有害的,是造成程序混乱的
祸根,程序的质量与 GOTO语句的数量成
反比,应该在所有高级程序设计语言中
取消 GOTO语句
? 激起了强烈的反响和长期广泛的论战
论据
? 1966年,Boehm和 Jacopini证明了程序设
计语言只要上旬、选择和重复三种形式
的控制结构就足以表达出各种其他形式
的结构
? 1970年 McKeeman称其 XPL编译程序仅用
一个 GOTO语句
? 1972年 C.Strachey设计的操作系统只在
五处使用了标号和 GOTO语句
争辩
? 否定 GOTO
? 取消 GOTO后,程序
易理解、易排错、易
维护
? 没有其它好的结构代
替 GOTO的话,容易
滥用 GOTO
? 无 GOTO的程序容易
进行正确性证明
? 肯定 GOTO
? 在块和进程的非正常
出口处往往需要
? 使用 GOTO会使程序
执行效率较高
? 在合成程序目标时,
GOTO语句往往是有
用的,如返回语句用
GOTO
结论
? 1974年 Knuth发表了总结性文章:, 带有 GOTO的结构化
程序设计,
? 令人信服地总结和证实了以下三点,
? 滥用 GOTO语句确实有害,应尽量避免
? 完全避免使用 GOTO语句也并非是个明智的方法,有
些地方使用 GOTO语句,会使程序流程更清楚、效率
更高
? 争论的焦点不应该放在是否取消 GOTO语句,而应该
放在用什么样的程序结构上
? 最后一点使关键,肯定以提高程序清晰性为目标的结
构化方法
“方法, 的核心是模型
所谓的“方法”通常围绕一系列的模型展开,给出这些模
型的建立,校验和转换方法。
COMPUTER
MO
DE
L REAL
REAL
仿自,Cantwell Smith,Computers,Models and the Embedding World”
方法与模型
计算机
设
计
模
型
REAL 实际
分
析
模
型
分析 编码
设计
分析模型和设计模型
? 分析模型:对当前所处的环境,或者现
实情况建立的模型,用于分析和评估。
? 设计模型:对未来要建造的系统或者环
境建立的模型,用于系统实施,也用于
交流和评价。
? 建立模型有助于精确有效地表达和沟通。
结构化方法
? 结构化程序设计:一种良好定义的软件
开发技术,它采用自顶向下设计和实现
方法,并严格地采用结构化程序的控制
构造
结构化方法的原则
? 清晰第一效率第二
? 设计先于编码
? 自顶向下逐步细化
1 清晰第一效率第二
? 著名的, 清晰第一,效率第二, 已成为
当今主导的程序设计风格
?, 先求清楚后求快,
?, 保持程序简单以求快,
?, 写清楚 ——不要为 ‘ 效率 ’ 牺牲清晰,
2 设计先于编码
?,开始写程序越早,完成程序需要的时
间就越长。,
?, 设计先于编码, 已成为所有程序设计
必须遵守的一条原则。
? 设计一定要利用各种设计工具来进行。
3 逐步细化的设计方法 …
? 逐步细化方法是结构化程序设计的
心脏。
1)中心思想
a,程序设计是一个由粗到细的过程 ;
b,程序设计不仅包括对控制结构的设计,也
包括对数据结构的设计,两者都要一步步地
细化。
3 逐步细化的设计方法
2)指导原则
a,先分解主要问题,次要的问题可暂时搁置;
b,坚持渐进的原则,每一步的变化不要太大;
c,过程的细化与数据结构的细化宜并行、交叉地进
行;
d,选用适合于问题的设计工具;
e,最后一步应详细到所得结果可以直接翻译为源程
序。
3)优点
a,便于控制开发的复杂性 ;
b,便于验证程序的正确性。
结构化方法采用的原则
? 抽象
? 逐步求精
? 信息隐藏
? 模块化
? 模块独立
模块化原则
? 模块是由边界元素限定的相邻的程序元素 (例
如,数据说明,可执行的语句 )的序列,而且
有一个总体标识符来代表它。
? 模块是构成程序的基本构件。
? 模块化就是把程序划分成独立命名且可独立访
问的模块,每个模块完成一个子功能,把这些
模块集成起来构成一个整体,可以完成指定的
功能满足用户的需求。
模块化原则
? 主要思想是:将整个系统进行分解成为若干
功能独立的,能分别设计、编程和测试的模
块
? 程序员能单独地负责一个或几个模块的开发
? 开发一个模块不需要知道系统其它模块的内
部结构和编程细节
? 模块之间的接口尽可能简明,模块应尽可能
彼此隔离
模块化和软件成本
Meyer模块化五条标准 …
? (1)
? 如果一种设计方法提供了把问题分解为子问题的系
统化机制,它就能降低整个问题的复杂性,从而可
以实现一种有效的模块化解决方案。
? (2)
? 如果一种设计方法能把现有的 (可重用的 )设计构件
组装成新系统,它就能提供一种并非一切都从头开
始做的模块化解决方案。
Meyer模块化五条标准 …
? (3)
? 如果可以把一个模块作为一种独立单元 (无需参考
其他模块 )来理解,那么,这样的模块是易于构造
和易于修改的。
? (4)
? 如果对系统需求的微小修改只导致对个别模块,而
不是对整个系统的修改,则修改所引起 的副作用将
最小。
Meyer模块化五条标准 …
? (5)
? 如果在一个模块内出现异常情况时,它的影
响局限在该模块内部,则由错误引起的副作
用将最小。
模块化应达到的要求
? 具有可修改性,对整个系统的一次修改只涉及
少数几个模块,这种局部性的修改不仅能满足
系统修改的要求,而且不会影响系统已经具有
的良好质量
? 具有易读性,每个模块的含义和职责被明确,
模块之间的接口关系清楚,从而降低复杂性,
使得阅读和理解比较方便
? 具有易验证性,只有每个模块能实现正确,才
可能使整个系统的正确性有必要的前提
抽象
? 人类在认识复杂现象的过程中使用的最强有力的思维
工具是抽象。
? 人们在实践中认识到,在现实世界中一定事物、状态
或过程之间总存在着某些相似的方面 (共性 )。把这些
相似的方面集中和概括起来,暂时忽略它们之间的差
异,这就是抽象。
? 抽象就是抽出事物的 本质特性而暂时不考虑细节。
逐步求精
? 逐步求精是人类解决复杂问题时采用的基本技
术,也是许多软件工程技术的基础。
? 可以把逐步求精定义为:, 为了能集中精力解
决主要问题而尽量推迟对问题细节的考虑。,
? 求精实际上是细化过程。
抽象与求精
? 抽象与求精是一对互补的概念
? 抽象使得设计者能够说明过程和数据,同时却
忽略低层细节。
? 可以把抽象看作是一种通过忽略多余的细节同时强
调有关的细节,而实现逐步求精的方法。
? 求精则帮助设计者在设计过程中揭示出低层细
节。
? 这两个概念都有助于设计者在 设计演化过程中
创造出完整的设计模型。
信息隐藏
? 应用模块化原理时,自然会产生的一个问题,
?, 为了得到最好的一组模块,应该怎样分解软件,
? Parnas提出的信息隐藏是模块化程序设计的基
本方法
? 信息隐藏:为了实现部件的可见性控制,在分
层构造软件模块时,要求这些部件只在模块内
部可见,在模块外部不可见
?,模块独立, 概念是模块化、抽象、逐步
求精和信息隐藏等概念的直接结果,也
是完成有效的模块设计的基本标准。
? 模块的独立程度可以由两个定性标准来
度量,这两个标准分别称为内聚和耦合。
? 耦合衡量不同模块彼此间互相依赖 (连接 )
的紧密程度;内聚衡量一个模块内部各
个元素彼此结合的紧密程度。
耦合
? 耦合是对一个软件结构内不同模块之间互连程
度的度量。
? 耦合强弱取决于模块间接口的复杂程度,进入
或访问一个模块的点,以及通过接口的数据。
? 应该追求尽可能松散耦合的系统。
? 研究、测试或维护任何一个模块可以不需要对
系统的其他模块有很多了解。
? 发生在一处的错误传播到整个系统的可能性就
很小。
内聚
? 内聚标志一个模块内各个元素彼此结合
的紧密程度,它是信息隐蔽和局部化概
念的自然扩展。简单地说,理想内聚的
模块只做一件事情。
? 设计时应该力求做到高内聚,通常中等
程度的内聚也是可以采用的,而且效果
和高内聚相差不多;但是,低内聚很坏,
不要使用。
内聚和耦合
? 内聚和耦合是密切相关的,模块内的高内聚往
往意味着模块间的松耦合。内聚和耦合都是进
行模块化设计的有力工具,但是实践表明内聚
更重要,应该把更多注意力集中到提高模块 的
内聚程度上。
? 事实上,没有必要精确确定内聚的级别。重要
的是设计时力争做到高内聚,并且能够辨认出
低内聚的模块,有能力通过修改设计提高模块
的内聚程度降低模块间的耦合程度,从而获得
较高的模块独立性。
启发规则
? 以下的启发规则有助于模块化,
? 改进软件结构提高模块独立性
? 模块规模应该适中
? 深度、宽度、扇出和扇入都应适当
? 模块的作用域应该在控制域之内
? 力争降低模块接口的复杂程度
? 设计单入口单出口的模块
? 模块功能应该可以预测
结构化方法图示
数据字典
STD
控制规约
接口
设计
体系结构
设计
数据设计
过程设计
结构化分析方法
? 结构化分析 (SA)方法是结构化程序设计理论在
软件需求分析阶段的运用。它是七十年代中期
倡导的基于功能分解的分析方法,常用于基于
瀑布模型的软件研制过程的需求分析阶段,其
目的是帮助弄清用户对软件的需求。
? 按照 DeMarco的定义,,结构化分析就是使用
数据流图(DFD)、数据字典(DD)、结
构化英语、决策表和决策树等工具,来建立一
种新的、称为结构化规格说明的目标文档。,
结构化分析五个步骤
1) 通过对用户的调查,以软件的需求为线索,
获得当前系统的具体模型;
2) 去掉具体模型中非本质因素,抽象出当前系
统的逻辑模型;
3) 根据计算机的特点分析当前系统与目标系统
的差别,建立目标系统的逻辑模型;
4) 完善目标系统并补充细节,写出目标系统的
软件需求规格说明;
5) 评审直到确认完全符合用户对软件的需求。
八条指导原则
1) 请用户共同参与开发;
2) 编写用户资料,考虑他
们的专门技术水平和阅
读与使用资料的目的;
3) 使用画图工具做媒介,
减少与用户交流时发生
问题的可能性;
4) 进行系统设计之前建立
一个系统的逻辑模型;
5) 自顶向下进行分析设计;
6) 自顶向下的方法进行测
试;
7) 验收之前,就让用户看
到系统的某些主要输出,
使用户能够尽早地看到
结果,及时地提出意见;
8) 对系统的评价不仅是指
开发和运行费用的评价,
而是对整个生存过程中
的费用和收益的评价。
结构化分析方法四大特点
一是用画图的方法
二是自顶向下地分解
三是强调逻辑而不是物理
四是没有重复性
结构化分析的工具
1) 数据流图 (DFD);
2) 控制流图 (CFD);
3) 数据字典 (DD);
4) 控制逻辑表达方法,包括状态转换图 (STD)等;
5) 处理逻辑表达方法,包括结构化语言、判断
树和判断表;
6) 数据存储结构规范化;
7) 数据立即存取图 (DIAD)。
四句指导工作的准则
? 分层分片,均衡分解;父子平衡,推迟细节。
? 分层就是逐步细化;分片就是用一组数据流图
来代替一大张包罗万象的总图。
? 均衡分解是指自顶向下画分层数据流图时,各
个子系统的分解程度应大致均匀。
? 父子平衡是指数据流图的父图与子图在输入数
据和输出数据上应该分别保持一致。
? 推迟细节是指为了优先考虑重要问题,允许将
一些细节推迟到下层数据流图来处理 。
结构化设计方法
? 70年代提出的面向数据流、重点确定软件结构的
设计方法
?, 结构化设计就是采用最佳的可能方法设计系统
的各个组成部分以及各成分之间的内部联系的技
术。也就是说,结构化设计是这样一个过程,它
决定用哪些方法把哪些部分联系起来,才能解决
好某个具体有清楚定义的问题。,
? 基本思想是将软件设计成由相对独立、单一功能
的模块组成的结构。
? 评价模块结构质量的两个具体标准 ——内聚度和
耦合度
耦合度
? 耦合度:耦合度是各模块之间相互联系
的一种度量,它是对模块独立性的直接
衡量,耦合度越弱就意味着模块的独立
性越高,则模块间相互影响就越小。
? 耦合度的强弱可以由弱至强分为非直接
耦合、数据耦合、特征耦合、控制耦合、
外部耦合、公共耦合和内容耦合七个等
级。
内聚度
? 内聚度是指一个模块内部各成分(语句
或语句段)之间的联系程度,内聚度高,
则模块的相对独立性势必会提高。
? 内聚度由低到高可划分为偶然内聚、逻
辑内聚、时间内聚、过程内聚、通讯内
聚、顺序内聚和功能内聚七个等级。
结构化设计方法设计步骤
1) 建立初始结构图 ;
2) 改进初始结构图。
建立初始结构图
开始
细化 /修改软件需求
规格说明中的
数据流图
是变换
型吗?
变换
分析
事物
分析
将映射得来的初始结构图
改进为最终结构图
对最终结构图进行评审
结束
是 否
从数据流图过渡到结构图
传入
传入部分 变换中心 传出部分
( a)变换型结构
传出 变换
接受 事务
分析
动作
1
动作
2
动作
3
接受部分 事务中心
( b)事务型结构 DFD
主模块
输入模块 主加工模块 输出模块
(a)
事务控制模块
接受模块 动作发送模块
动作 1模块 动作 1模块 动作 1模块
(b) SC
改进初始结构图 …
1)减少块间联系,降低耦合度:可从方式、
作用、数量等方面着手,其中最常用的
是减少模块间传递的参数个数;
2)消除管道性模块,提高内聚度:管道性
模块的块内联系很弱,只是像管道一样
将一些参数从主模块传送到它的几个下
层模块,对这样的模块,应予以消除;
3)适当考虑系统将来可能发生的变化;
改进初始结构图
4)注意模块的大小:限制模块大小是降低
复杂性的手段之一;
5)适当调整调用和被调用的次数,即深度、
宽度、扇出和扇入都要适当。一个模块
调用或被调用过多,往往是设计不好的
迹象;
6)整体考虑问题:即尽可能研究整张结构
图,而不是只分别考虑一张结构图的各
个部分。
三条指导规则
1)对模块分割、合并和变动模块调用关系
的指导规则
2)保持高扇入 /低扇出的规则
3)把作用域保持在控制域之内的规则
对模块分割、合并和变动模块
调用关系的指导规则
? 分割或合并结构图中的模块,应以提高
模块独立性为首要的标准:力求提高内
聚,降低耦合,简化接口,少用全局性
和控制型信息
? 要适当考虑快的大小
? 对模块位置应否变更,视处理是否方便
来定,不必拘泥于数据流图
保持高扇入 /低扇出的规则
? 扇入数指调用该模块的模块个数
? 扇出数指该模块调用的模块个数
? 扇入高则上级模块多,能增加利用率
? 扇出低则下级模块少,能减少复杂度
? 扇出数以3-4为宜,最好不超过 5-7
? 软件结构通常具有, 瓮, 形或, 清真寺,
形的形状
把作用域保持在控制域之内的规则
? 一个模块的控制域,等于模块本身加上
其下级模块。
? 一个模块的作用域,是受这个模块中的
判定所影响的模块。
? 规则的含义是,
a,作用域不要超过控制域的范围;
b,软件系统的判定,其位置离受它控制的模
块越近越好。
结构化编程方法
? 用一组标准的准则和工具从事程序设计,称为
结构化程序设计;这些准则和工具包括一组基
本控制结构,自顶向下扩展原则,模块化和逐
步求精
? 结构化编程方法派生于结构化程序设计理论,
它要求使用顺序、选择、循环等基本控制结构,
并遵循增加程序产量、提高程序可读性、容易
测试和验证的原则来编写程序。
结构化编程应遵循的原则 …
1) 使用程序设计语言中的顺序、选择、循环
等有限的控制结构表示程序的控制逻辑;
2) 选用的控制结构只准许有一个入口和一个
出口;
3) 程序语句组成容易识别的块,每块只有一
个入口和一个出口;
4) 复杂结构应该用嵌套的基本控制结构来实
现;
结构化编程应遵循的原则
5) 语言中所没有的控制结构,应该采用前后
一致的方法来模拟;
6) 严格控制 GOTO语句,仅在下列情况才可使
用,
a,用一个非结构化的程序设计语言去实现
一个结构化的构造;
b,若不使用 GOTO语句会使功能模糊;
c,在某种可以改善而不是损害程序可读性
的情况下。
结构化编程方法的主要优点
1) 易于理解、使用和维护。程序员采用结构化
编程方法,降低了程序的复杂性,因此容易编
写程序。程序员能够进行逐步求精、程序证明
和测试,以确保程序的正确性,程序容易阅读
并被人理解,便于用户使用和维护。
2) 提高编程工作的效率,降低了软件开发成本。
由于结构化编程方法能够把错误控制到最低限
度,因此能够减少调试和查错时间。结构化程
序是由一些为数不多的基本结构模块组成,这
些模块甚至可以由机器自动生成,从而极大地
减轻了编程工作量。
结构化方法的缺点
? 著名的“两个鸿沟”
?,数据和过程的鸿沟”
?,分析和设计的鸿沟”
? 专注于过程的分析模型,其抗击变动的
能力和可复用性就相对较差。
软件开发的原则( 1)
? 规范严格的原则
? 遵循严格化原则,可以达到开发出正确、成功的软
件产品的目的
? 软件开发过程是创造性的工作过程,但严格化不会
抑制创造性
? 严格的分析设计可以增强对创造性成果的信心
? 严格化对可靠性、维护性、可移植性、可理解性等
产生影响
? 过程详细记录可供精确地掌握和控制开发过程
软件开发的原则( 2)
? 分隔化的原则
? 解决复杂问题时从不同的方面把问题分隔开,
然后单独集中精力解决每一个方面的问题
? 分隔化原则是要将相互关系不太紧密的方面
分割开,对相互联系仅考虑其影响
? 分隔的途径:以时间次序、以质量指标、以
软件规模、以不同的视图、以开发人员的技
能
软件开发的原则( 3)
? 模块化的原则
? 先对复杂问题进行分析,找出基本要素,尽
量使之独立,然后各个击破
? 简单的单元易于加工、维修,可以标准化、
通用化
? 复杂问题的分解,基于自顶向下的思路
? 已有模块的组合,基于自底向上的思路
软件开发的原则( 4)
? 抽象化的原则
? 重要、带有普遍意义特征的方面或内容被抽
象出来,次要的、缺乏普遍意义的方面或内
容被忽略
? 抽象是分隔化原则的一种特殊应用
软件开发的原则( 5)
? 预见变动的原则
? 软件由于其错误、新需求、新环境而产生变
化要求
? 开发时就要考虑到软件变动的要求
? PARNAS的原则
? 开发系列产品
? 渐进开发,从子集出发,信息隐藏,保持接口不
变
? 采用为变化而设计的技术
软件开发的原则( 6)
? 通用化的原则
? 尽量找出对类似问题或相关问题的具有一定普遍意
义的解决方法,并在相应产品开发中应用,使软件
产品具有一定的通用性
? 对普遍性、通用性问题的解决方法具有质量、经济
方面的价值
? 对通用和专用,需要在经济和效率方面进行权衡
? 通用性原则是设计通用的软件产品的一个最基本原
则
软件开发的原则( 7)
? 逐步完善的原则
? 由于难以确定用户的具体需求,只能从不完
善逐步走向完善
? 必须注意,
? 记录每一个有意义的渐进
? 文档必须尽早反映变动,变动得到控制
? MICROSOFT在采用逐步完善原则方面取得
了成功
软件开发的原则( 8)
? 有关软件质量的原则
? 用户至上的原则
? 以用户的利益为前提
? 处处为用户使用方便着想
? 千方百计帮助用户使用好软件
? 注意与用户的交流
? 质量可靠的原则
? 在质量、成本之间进行权衡
软件开发的原则( 9)
? 有关软件文档的原则
? 文档标准化原则
? 用户手册简明原则
? 用词规范
? 尽可能使用用户的专业术语或行话
? 通俗易懂
? 描述的句子不要太长
软件开发的原则( 10)
? 有关设计编码的原则
? 根据文档设计(需求记录在文档)
? 注意概念的完整
? 整个软件要适于变动、易于维护
? 程序编制简明清晰
? 注意技术与工具更新
软件开发的原则( 11)
? 有关软件测试的原则
? 测试的独立性原则
? 克服心理障碍
? 独立公正
? 专业优势
? 成功的测试是发现问题的测试
? 要分析错误产生的原因,举一反三
软件开发的原则( 12)
? 有关开发管理的原则
? 良好的管理
? 适量的人员
? 切实的计划
谢谢!
汤铭端
010-68389085( O)
010-68389504( H)
bicast@public3.bta.net.cn
软件工程实践
汤铭端
中国航天科工集团公司 706所
第二讲
结构化方法
内容和目的
? 了解结构化方法的产生和有关概念
? 掌握结构化方法的基本原则
? 了解结构化分析、设计、编程方法的基
本内容
? 了解软件开发的一般原则
软件开发方法
? 软件开发方法是软件开发过程所遵循的
方法和步骤,其目的在于有效地得到一
些工作产品,既程序和文档,并且满足
质量要求
? 程序设计方法是软件开发方法的组成部
分
? 此外还有分析方法和设计方法
评价软件开发方法的四大特征
? 技术特征:支持各种技术概念的方法特色,如层次性、抽
象性、并行性、安全性、正确性等
? 使用特征:用于具体开发时的特色,如易理解性、易移植
性、易复用性、工具的支持、任务范围、使用的广度、活
动过渡的可行性、产品的易修改性、对正确性的支持等
? 管理特征:增强对软件开发活动管理的能力方面的特色,
如易管理性、支持或阻碍团队工作的程度、中间阶段的确
定、工作产品、配置管理、阶段结束准则、费用估计等
? 经济特征:给软件组织产生的在质量和生产力方面的可见
效益,如分析活动的局部效益、全生存周期效益、获得该
开发方法的代价、使用它的代价、管理的代价等
选用软件开发方法的考虑因素
1 对该开发方法是否已具有经验,或者已
有受过培训的人员
2 开发项目的进度、人员组成情况
3 为开发项目提供的资源如何
4 计划、组织、管理的可行性
5 开发项目的领域知识准备情况
航天的考虑
? 结构化方法较全面, 最成熟, 最基础,
使用最广泛, 有成功经验
? 结构化方法适合航天软件研制工作
? 结构化方法是基础性方法
? 结构化方法包括就形成了配套的软件结
构化分析方法, 结构化设计方法和结构
化编程方法, 其核心和基础是结构化程
序设计理论
为什么要讲这些所谓的, 方
法,?
“我只要满足需求就可以了,我自己开发使用什么方法你
管不着。”
“这些方法根本没有什么用处,我们那里高手很多,我
们不屑于使用这些方法。”
“结构化, 起源:对 GOTO的认
识
? 1968年 Dijkstra在 ACM通讯中发表了
,GOTO语句是有害的, 文章,认为:
GOTO语句是有害的,是造成程序混乱的
祸根,程序的质量与 GOTO语句的数量成
反比,应该在所有高级程序设计语言中
取消 GOTO语句
? 激起了强烈的反响和长期广泛的论战
论据
? 1966年,Boehm和 Jacopini证明了程序设
计语言只要上旬、选择和重复三种形式
的控制结构就足以表达出各种其他形式
的结构
? 1970年 McKeeman称其 XPL编译程序仅用
一个 GOTO语句
? 1972年 C.Strachey设计的操作系统只在
五处使用了标号和 GOTO语句
争辩
? 否定 GOTO
? 取消 GOTO后,程序
易理解、易排错、易
维护
? 没有其它好的结构代
替 GOTO的话,容易
滥用 GOTO
? 无 GOTO的程序容易
进行正确性证明
? 肯定 GOTO
? 在块和进程的非正常
出口处往往需要
? 使用 GOTO会使程序
执行效率较高
? 在合成程序目标时,
GOTO语句往往是有
用的,如返回语句用
GOTO
结论
? 1974年 Knuth发表了总结性文章:, 带有 GOTO的结构化
程序设计,
? 令人信服地总结和证实了以下三点,
? 滥用 GOTO语句确实有害,应尽量避免
? 完全避免使用 GOTO语句也并非是个明智的方法,有
些地方使用 GOTO语句,会使程序流程更清楚、效率
更高
? 争论的焦点不应该放在是否取消 GOTO语句,而应该
放在用什么样的程序结构上
? 最后一点使关键,肯定以提高程序清晰性为目标的结
构化方法
“方法, 的核心是模型
所谓的“方法”通常围绕一系列的模型展开,给出这些模
型的建立,校验和转换方法。
COMPUTER
MO
DE
L REAL
REAL
仿自,Cantwell Smith,Computers,Models and the Embedding World”
方法与模型
计算机
设
计
模
型
REAL 实际
分
析
模
型
分析 编码
设计
分析模型和设计模型
? 分析模型:对当前所处的环境,或者现
实情况建立的模型,用于分析和评估。
? 设计模型:对未来要建造的系统或者环
境建立的模型,用于系统实施,也用于
交流和评价。
? 建立模型有助于精确有效地表达和沟通。
结构化方法
? 结构化程序设计:一种良好定义的软件
开发技术,它采用自顶向下设计和实现
方法,并严格地采用结构化程序的控制
构造
结构化方法的原则
? 清晰第一效率第二
? 设计先于编码
? 自顶向下逐步细化
1 清晰第一效率第二
? 著名的, 清晰第一,效率第二, 已成为
当今主导的程序设计风格
?, 先求清楚后求快,
?, 保持程序简单以求快,
?, 写清楚 ——不要为 ‘ 效率 ’ 牺牲清晰,
2 设计先于编码
?,开始写程序越早,完成程序需要的时
间就越长。,
?, 设计先于编码, 已成为所有程序设计
必须遵守的一条原则。
? 设计一定要利用各种设计工具来进行。
3 逐步细化的设计方法 …
? 逐步细化方法是结构化程序设计的
心脏。
1)中心思想
a,程序设计是一个由粗到细的过程 ;
b,程序设计不仅包括对控制结构的设计,也
包括对数据结构的设计,两者都要一步步地
细化。
3 逐步细化的设计方法
2)指导原则
a,先分解主要问题,次要的问题可暂时搁置;
b,坚持渐进的原则,每一步的变化不要太大;
c,过程的细化与数据结构的细化宜并行、交叉地进
行;
d,选用适合于问题的设计工具;
e,最后一步应详细到所得结果可以直接翻译为源程
序。
3)优点
a,便于控制开发的复杂性 ;
b,便于验证程序的正确性。
结构化方法采用的原则
? 抽象
? 逐步求精
? 信息隐藏
? 模块化
? 模块独立
模块化原则
? 模块是由边界元素限定的相邻的程序元素 (例
如,数据说明,可执行的语句 )的序列,而且
有一个总体标识符来代表它。
? 模块是构成程序的基本构件。
? 模块化就是把程序划分成独立命名且可独立访
问的模块,每个模块完成一个子功能,把这些
模块集成起来构成一个整体,可以完成指定的
功能满足用户的需求。
模块化原则
? 主要思想是:将整个系统进行分解成为若干
功能独立的,能分别设计、编程和测试的模
块
? 程序员能单独地负责一个或几个模块的开发
? 开发一个模块不需要知道系统其它模块的内
部结构和编程细节
? 模块之间的接口尽可能简明,模块应尽可能
彼此隔离
模块化和软件成本
Meyer模块化五条标准 …
? (1)
? 如果一种设计方法提供了把问题分解为子问题的系
统化机制,它就能降低整个问题的复杂性,从而可
以实现一种有效的模块化解决方案。
? (2)
? 如果一种设计方法能把现有的 (可重用的 )设计构件
组装成新系统,它就能提供一种并非一切都从头开
始做的模块化解决方案。
Meyer模块化五条标准 …
? (3)
? 如果可以把一个模块作为一种独立单元 (无需参考
其他模块 )来理解,那么,这样的模块是易于构造
和易于修改的。
? (4)
? 如果对系统需求的微小修改只导致对个别模块,而
不是对整个系统的修改,则修改所引起 的副作用将
最小。
Meyer模块化五条标准 …
? (5)
? 如果在一个模块内出现异常情况时,它的影
响局限在该模块内部,则由错误引起的副作
用将最小。
模块化应达到的要求
? 具有可修改性,对整个系统的一次修改只涉及
少数几个模块,这种局部性的修改不仅能满足
系统修改的要求,而且不会影响系统已经具有
的良好质量
? 具有易读性,每个模块的含义和职责被明确,
模块之间的接口关系清楚,从而降低复杂性,
使得阅读和理解比较方便
? 具有易验证性,只有每个模块能实现正确,才
可能使整个系统的正确性有必要的前提
抽象
? 人类在认识复杂现象的过程中使用的最强有力的思维
工具是抽象。
? 人们在实践中认识到,在现实世界中一定事物、状态
或过程之间总存在着某些相似的方面 (共性 )。把这些
相似的方面集中和概括起来,暂时忽略它们之间的差
异,这就是抽象。
? 抽象就是抽出事物的 本质特性而暂时不考虑细节。
逐步求精
? 逐步求精是人类解决复杂问题时采用的基本技
术,也是许多软件工程技术的基础。
? 可以把逐步求精定义为:, 为了能集中精力解
决主要问题而尽量推迟对问题细节的考虑。,
? 求精实际上是细化过程。
抽象与求精
? 抽象与求精是一对互补的概念
? 抽象使得设计者能够说明过程和数据,同时却
忽略低层细节。
? 可以把抽象看作是一种通过忽略多余的细节同时强
调有关的细节,而实现逐步求精的方法。
? 求精则帮助设计者在设计过程中揭示出低层细
节。
? 这两个概念都有助于设计者在 设计演化过程中
创造出完整的设计模型。
信息隐藏
? 应用模块化原理时,自然会产生的一个问题,
?, 为了得到最好的一组模块,应该怎样分解软件,
? Parnas提出的信息隐藏是模块化程序设计的基
本方法
? 信息隐藏:为了实现部件的可见性控制,在分
层构造软件模块时,要求这些部件只在模块内
部可见,在模块外部不可见
?,模块独立, 概念是模块化、抽象、逐步
求精和信息隐藏等概念的直接结果,也
是完成有效的模块设计的基本标准。
? 模块的独立程度可以由两个定性标准来
度量,这两个标准分别称为内聚和耦合。
? 耦合衡量不同模块彼此间互相依赖 (连接 )
的紧密程度;内聚衡量一个模块内部各
个元素彼此结合的紧密程度。
耦合
? 耦合是对一个软件结构内不同模块之间互连程
度的度量。
? 耦合强弱取决于模块间接口的复杂程度,进入
或访问一个模块的点,以及通过接口的数据。
? 应该追求尽可能松散耦合的系统。
? 研究、测试或维护任何一个模块可以不需要对
系统的其他模块有很多了解。
? 发生在一处的错误传播到整个系统的可能性就
很小。
内聚
? 内聚标志一个模块内各个元素彼此结合
的紧密程度,它是信息隐蔽和局部化概
念的自然扩展。简单地说,理想内聚的
模块只做一件事情。
? 设计时应该力求做到高内聚,通常中等
程度的内聚也是可以采用的,而且效果
和高内聚相差不多;但是,低内聚很坏,
不要使用。
内聚和耦合
? 内聚和耦合是密切相关的,模块内的高内聚往
往意味着模块间的松耦合。内聚和耦合都是进
行模块化设计的有力工具,但是实践表明内聚
更重要,应该把更多注意力集中到提高模块 的
内聚程度上。
? 事实上,没有必要精确确定内聚的级别。重要
的是设计时力争做到高内聚,并且能够辨认出
低内聚的模块,有能力通过修改设计提高模块
的内聚程度降低模块间的耦合程度,从而获得
较高的模块独立性。
启发规则
? 以下的启发规则有助于模块化,
? 改进软件结构提高模块独立性
? 模块规模应该适中
? 深度、宽度、扇出和扇入都应适当
? 模块的作用域应该在控制域之内
? 力争降低模块接口的复杂程度
? 设计单入口单出口的模块
? 模块功能应该可以预测
结构化方法图示
数据字典
STD
控制规约
接口
设计
体系结构
设计
数据设计
过程设计
结构化分析方法
? 结构化分析 (SA)方法是结构化程序设计理论在
软件需求分析阶段的运用。它是七十年代中期
倡导的基于功能分解的分析方法,常用于基于
瀑布模型的软件研制过程的需求分析阶段,其
目的是帮助弄清用户对软件的需求。
? 按照 DeMarco的定义,,结构化分析就是使用
数据流图(DFD)、数据字典(DD)、结
构化英语、决策表和决策树等工具,来建立一
种新的、称为结构化规格说明的目标文档。,
结构化分析五个步骤
1) 通过对用户的调查,以软件的需求为线索,
获得当前系统的具体模型;
2) 去掉具体模型中非本质因素,抽象出当前系
统的逻辑模型;
3) 根据计算机的特点分析当前系统与目标系统
的差别,建立目标系统的逻辑模型;
4) 完善目标系统并补充细节,写出目标系统的
软件需求规格说明;
5) 评审直到确认完全符合用户对软件的需求。
八条指导原则
1) 请用户共同参与开发;
2) 编写用户资料,考虑他
们的专门技术水平和阅
读与使用资料的目的;
3) 使用画图工具做媒介,
减少与用户交流时发生
问题的可能性;
4) 进行系统设计之前建立
一个系统的逻辑模型;
5) 自顶向下进行分析设计;
6) 自顶向下的方法进行测
试;
7) 验收之前,就让用户看
到系统的某些主要输出,
使用户能够尽早地看到
结果,及时地提出意见;
8) 对系统的评价不仅是指
开发和运行费用的评价,
而是对整个生存过程中
的费用和收益的评价。
结构化分析方法四大特点
一是用画图的方法
二是自顶向下地分解
三是强调逻辑而不是物理
四是没有重复性
结构化分析的工具
1) 数据流图 (DFD);
2) 控制流图 (CFD);
3) 数据字典 (DD);
4) 控制逻辑表达方法,包括状态转换图 (STD)等;
5) 处理逻辑表达方法,包括结构化语言、判断
树和判断表;
6) 数据存储结构规范化;
7) 数据立即存取图 (DIAD)。
四句指导工作的准则
? 分层分片,均衡分解;父子平衡,推迟细节。
? 分层就是逐步细化;分片就是用一组数据流图
来代替一大张包罗万象的总图。
? 均衡分解是指自顶向下画分层数据流图时,各
个子系统的分解程度应大致均匀。
? 父子平衡是指数据流图的父图与子图在输入数
据和输出数据上应该分别保持一致。
? 推迟细节是指为了优先考虑重要问题,允许将
一些细节推迟到下层数据流图来处理 。
结构化设计方法
? 70年代提出的面向数据流、重点确定软件结构的
设计方法
?, 结构化设计就是采用最佳的可能方法设计系统
的各个组成部分以及各成分之间的内部联系的技
术。也就是说,结构化设计是这样一个过程,它
决定用哪些方法把哪些部分联系起来,才能解决
好某个具体有清楚定义的问题。,
? 基本思想是将软件设计成由相对独立、单一功能
的模块组成的结构。
? 评价模块结构质量的两个具体标准 ——内聚度和
耦合度
耦合度
? 耦合度:耦合度是各模块之间相互联系
的一种度量,它是对模块独立性的直接
衡量,耦合度越弱就意味着模块的独立
性越高,则模块间相互影响就越小。
? 耦合度的强弱可以由弱至强分为非直接
耦合、数据耦合、特征耦合、控制耦合、
外部耦合、公共耦合和内容耦合七个等
级。
内聚度
? 内聚度是指一个模块内部各成分(语句
或语句段)之间的联系程度,内聚度高,
则模块的相对独立性势必会提高。
? 内聚度由低到高可划分为偶然内聚、逻
辑内聚、时间内聚、过程内聚、通讯内
聚、顺序内聚和功能内聚七个等级。
结构化设计方法设计步骤
1) 建立初始结构图 ;
2) 改进初始结构图。
建立初始结构图
开始
细化 /修改软件需求
规格说明中的
数据流图
是变换
型吗?
变换
分析
事物
分析
将映射得来的初始结构图
改进为最终结构图
对最终结构图进行评审
结束
是 否
从数据流图过渡到结构图
传入
传入部分 变换中心 传出部分
( a)变换型结构
传出 变换
接受 事务
分析
动作
1
动作
2
动作
3
接受部分 事务中心
( b)事务型结构 DFD
主模块
输入模块 主加工模块 输出模块
(a)
事务控制模块
接受模块 动作发送模块
动作 1模块 动作 1模块 动作 1模块
(b) SC
改进初始结构图 …
1)减少块间联系,降低耦合度:可从方式、
作用、数量等方面着手,其中最常用的
是减少模块间传递的参数个数;
2)消除管道性模块,提高内聚度:管道性
模块的块内联系很弱,只是像管道一样
将一些参数从主模块传送到它的几个下
层模块,对这样的模块,应予以消除;
3)适当考虑系统将来可能发生的变化;
改进初始结构图
4)注意模块的大小:限制模块大小是降低
复杂性的手段之一;
5)适当调整调用和被调用的次数,即深度、
宽度、扇出和扇入都要适当。一个模块
调用或被调用过多,往往是设计不好的
迹象;
6)整体考虑问题:即尽可能研究整张结构
图,而不是只分别考虑一张结构图的各
个部分。
三条指导规则
1)对模块分割、合并和变动模块调用关系
的指导规则
2)保持高扇入 /低扇出的规则
3)把作用域保持在控制域之内的规则
对模块分割、合并和变动模块
调用关系的指导规则
? 分割或合并结构图中的模块,应以提高
模块独立性为首要的标准:力求提高内
聚,降低耦合,简化接口,少用全局性
和控制型信息
? 要适当考虑快的大小
? 对模块位置应否变更,视处理是否方便
来定,不必拘泥于数据流图
保持高扇入 /低扇出的规则
? 扇入数指调用该模块的模块个数
? 扇出数指该模块调用的模块个数
? 扇入高则上级模块多,能增加利用率
? 扇出低则下级模块少,能减少复杂度
? 扇出数以3-4为宜,最好不超过 5-7
? 软件结构通常具有, 瓮, 形或, 清真寺,
形的形状
把作用域保持在控制域之内的规则
? 一个模块的控制域,等于模块本身加上
其下级模块。
? 一个模块的作用域,是受这个模块中的
判定所影响的模块。
? 规则的含义是,
a,作用域不要超过控制域的范围;
b,软件系统的判定,其位置离受它控制的模
块越近越好。
结构化编程方法
? 用一组标准的准则和工具从事程序设计,称为
结构化程序设计;这些准则和工具包括一组基
本控制结构,自顶向下扩展原则,模块化和逐
步求精
? 结构化编程方法派生于结构化程序设计理论,
它要求使用顺序、选择、循环等基本控制结构,
并遵循增加程序产量、提高程序可读性、容易
测试和验证的原则来编写程序。
结构化编程应遵循的原则 …
1) 使用程序设计语言中的顺序、选择、循环
等有限的控制结构表示程序的控制逻辑;
2) 选用的控制结构只准许有一个入口和一个
出口;
3) 程序语句组成容易识别的块,每块只有一
个入口和一个出口;
4) 复杂结构应该用嵌套的基本控制结构来实
现;
结构化编程应遵循的原则
5) 语言中所没有的控制结构,应该采用前后
一致的方法来模拟;
6) 严格控制 GOTO语句,仅在下列情况才可使
用,
a,用一个非结构化的程序设计语言去实现
一个结构化的构造;
b,若不使用 GOTO语句会使功能模糊;
c,在某种可以改善而不是损害程序可读性
的情况下。
结构化编程方法的主要优点
1) 易于理解、使用和维护。程序员采用结构化
编程方法,降低了程序的复杂性,因此容易编
写程序。程序员能够进行逐步求精、程序证明
和测试,以确保程序的正确性,程序容易阅读
并被人理解,便于用户使用和维护。
2) 提高编程工作的效率,降低了软件开发成本。
由于结构化编程方法能够把错误控制到最低限
度,因此能够减少调试和查错时间。结构化程
序是由一些为数不多的基本结构模块组成,这
些模块甚至可以由机器自动生成,从而极大地
减轻了编程工作量。
结构化方法的缺点
? 著名的“两个鸿沟”
?,数据和过程的鸿沟”
?,分析和设计的鸿沟”
? 专注于过程的分析模型,其抗击变动的
能力和可复用性就相对较差。
软件开发的原则( 1)
? 规范严格的原则
? 遵循严格化原则,可以达到开发出正确、成功的软
件产品的目的
? 软件开发过程是创造性的工作过程,但严格化不会
抑制创造性
? 严格的分析设计可以增强对创造性成果的信心
? 严格化对可靠性、维护性、可移植性、可理解性等
产生影响
? 过程详细记录可供精确地掌握和控制开发过程
软件开发的原则( 2)
? 分隔化的原则
? 解决复杂问题时从不同的方面把问题分隔开,
然后单独集中精力解决每一个方面的问题
? 分隔化原则是要将相互关系不太紧密的方面
分割开,对相互联系仅考虑其影响
? 分隔的途径:以时间次序、以质量指标、以
软件规模、以不同的视图、以开发人员的技
能
软件开发的原则( 3)
? 模块化的原则
? 先对复杂问题进行分析,找出基本要素,尽
量使之独立,然后各个击破
? 简单的单元易于加工、维修,可以标准化、
通用化
? 复杂问题的分解,基于自顶向下的思路
? 已有模块的组合,基于自底向上的思路
软件开发的原则( 4)
? 抽象化的原则
? 重要、带有普遍意义特征的方面或内容被抽
象出来,次要的、缺乏普遍意义的方面或内
容被忽略
? 抽象是分隔化原则的一种特殊应用
软件开发的原则( 5)
? 预见变动的原则
? 软件由于其错误、新需求、新环境而产生变
化要求
? 开发时就要考虑到软件变动的要求
? PARNAS的原则
? 开发系列产品
? 渐进开发,从子集出发,信息隐藏,保持接口不
变
? 采用为变化而设计的技术
软件开发的原则( 6)
? 通用化的原则
? 尽量找出对类似问题或相关问题的具有一定普遍意
义的解决方法,并在相应产品开发中应用,使软件
产品具有一定的通用性
? 对普遍性、通用性问题的解决方法具有质量、经济
方面的价值
? 对通用和专用,需要在经济和效率方面进行权衡
? 通用性原则是设计通用的软件产品的一个最基本原
则
软件开发的原则( 7)
? 逐步完善的原则
? 由于难以确定用户的具体需求,只能从不完
善逐步走向完善
? 必须注意,
? 记录每一个有意义的渐进
? 文档必须尽早反映变动,变动得到控制
? MICROSOFT在采用逐步完善原则方面取得
了成功
软件开发的原则( 8)
? 有关软件质量的原则
? 用户至上的原则
? 以用户的利益为前提
? 处处为用户使用方便着想
? 千方百计帮助用户使用好软件
? 注意与用户的交流
? 质量可靠的原则
? 在质量、成本之间进行权衡
软件开发的原则( 9)
? 有关软件文档的原则
? 文档标准化原则
? 用户手册简明原则
? 用词规范
? 尽可能使用用户的专业术语或行话
? 通俗易懂
? 描述的句子不要太长
软件开发的原则( 10)
? 有关设计编码的原则
? 根据文档设计(需求记录在文档)
? 注意概念的完整
? 整个软件要适于变动、易于维护
? 程序编制简明清晰
? 注意技术与工具更新
软件开发的原则( 11)
? 有关软件测试的原则
? 测试的独立性原则
? 克服心理障碍
? 独立公正
? 专业优势
? 成功的测试是发现问题的测试
? 要分析错误产生的原因,举一反三
软件开发的原则( 12)
? 有关开发管理的原则
? 良好的管理
? 适量的人员
? 切实的计划
谢谢!
汤铭端
010-68389085( O)
010-68389504( H)
bicast@public3.bta.net.cn