目录

  • 总体设计概述
  • 目的
  • 任务
  • 设计过程
  • 设计原理
  • 什么是模块?什么是模块化?
  • 模块化的优点
  • 模块化和软件成本
  • 逐步求精
  • 什么是逐步求精?
  • Miller法则
  • 抽象
  • 信息隐藏和局部化
  • 什么是信息隐藏
  • 信息隐藏的优点
  • 模块独立
  • 耦合
  • 内聚(==内聚程度由低到高:偶-逻-时-过-通-顺-功==)
  • 启发规则
  • 面向数据流的设计方法
  • 总结
  • 本章练习


总体设计概述

目的

总体设计的基本目的就是回答“概括地说,系统应该如何实现”这个问题。因此,总体设计又称为概要设计或初步设计。

任务

划分出组成系统的物理元素——程序、文件、数据库、人工过程和文档等(但是每个物理元素仍然处于黑盒子级,这些黑盒子里的具体内容将在以后仔细设计)
② 总体设计阶段的另一项重要任务是设计软件的结构,也就是要确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。

设计过程

总体设计过程通常由两个主要阶段组成

  • 系统设计阶段(确定系统的具体实现方案)
  • 结构设计阶段(确定软件结构)。

典型的总体设计过程包括以下9个步骤:

  • 设想供选择的方案。需求分析阶段得出的数据流图是总体设计的极好的出发点(上一阶段的DFD在本阶段细化之后可以被下一阶段使用)
  • 选取合理的方案
  • 推荐最佳方案
  • 功能分解。功能分解导致数据流图的进一步细化,同时还应该用IPO图或其他适当的工具简要描述细化后每个处理的算法。
  • 设计软件结构。通常程序中的一个模块完成一个适当的子功能。应该把模块组织成良好的层次系统,顶层模块调用它的下层模块以实现程序的完整功能,每个下层模块再调用更下层的模块从而完成程序的一个子功能,最下层的模块完成最具体的功能软件结构(即由模块组成的层次系统)可以用层次图或结构图来描绘
  • 设计数据库
  • 制定测试计划
  • 书写文档
  • 审查和复审

设计原理

什么是模块?什么是模块化?

答:模块是由边界元素限定的相邻程序元素序列,而且有一个总体标识符代表它。像C、C++和Java语言中的{…}对,都是边界元素的例子。按照模块的定义,函数、子程序都可作为模块。面向对象方法学中的对象是模块,对象内的方法也是模块。模块是构成程序的基本构件。
模块化就是把程序划分成为独立命名且可以独立访问的模块,每个模块完成一个子功能,把所有的模块集成起来构成一个整体,可以完成指定的功能,满足用户的需求。

模块化的优点
  • 采用模块化原理可以使软件结构清晰,不仅容易设计也容易阅读和理解。
  • 因为程序错误通常局限在有关的模块及它们之间的接口中,所以模块化使软件容易测试和调试,因而有助于提高软件的可靠性。
  • 因为变动往往只涉及少数几个模块,所以模块化能够提高软件的可修改性。
  • 模块化也有助于软件开发工程的组织管理,一个复杂的大型程序可以由许多程序员分工编写不同的模块,并且可以进一步分配技术熟练的程序员编写困难的模块。
模块化和软件成本

如果无限地分割软件,最后为了开发软件而需要的工作量就小得可以忽略了。上述结论不能成立,如下图,当模块数目增加时每个模块的规模将减小,开发单个模块需要的成本确实减少了,但是随着模块数目增加,设计模块间接口所需要的工作量也将增加。根据这两个因素。得出了图中的总成本曲线。每个程序都相应地有一个最适当的模块数目M,使得系统的开发成本最小。

总体设计与架构设计的区别 总体设计构想_总体设计与架构设计的区别

逐步求精

什么是逐步求精?

可以把逐步求精定义为:“为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。”事实上,可以把逐步求精看作是一项把一个时期内必须解决的种种问题按优先级排序的技术,逐步求精方法确保每个问题都将被解决,而且每个问题都将在适当的时候被解决。

Miller法则

逐步求精之所以如此重要,是因为人类的认知过程遵守 Miller法则 : 一个人在任何时候都只能把注意力集中在7士2个知识块上。Miller法则是人类智力的基本局限,人们不可能战胜自己的自然本性,只能接受这个事实,承认自身的局限性,并在这个前提下尽自己的最大努力工作。

抽象

抽象与求精是一对互补的概念。抽象使得设计者能够说明过程和数据,同时却忽略了低层细节。事实上,可以把抽象看作是一种通过忽略多余的细节同时强调有关的细节,而实现逐步求精的方法。求精则帮助设计者在设计过程中逐步揭示出低层细节。

信息隐藏和局部化

什么是信息隐藏

信息隐藏原理指出:一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。

信息隐藏的优点
  • 如果在测试期间和以后的软件维护期间需要修改软件,使用信息隐藏原理作为模块化系统设计的标准会带来极大好处。(有利于软件的修改)
  • 由于绝大多数数据和过程对于软件的其他部分而言是隐藏的,在修改期间由于疏忽而引入的错误就很少可能传播到软件的其他部分。(防止错误的扩大和传播)

模块独立

模块独立的概念是模块化、抽象、信息隐藏和局部化概念的直接结果。
模块的独立程度可以由两个定性标准度量,这两个标准分别称为内聚耦合。耦合衡量不同模块彼此间互相连接的紧密程度;内聚衡量一个模块内部各个元素彼此结合的紧密程度。

耦合

耦合是对一个软件结构内不同模块之间互连程度的度量。在软件设计中应该追求尽可能松散耦合的系统(由于模块间联系简单,发生在一处的错误传播到整个系统的可能性就很小)。

耦合分为以下几类:(耦合程度由低到高:无-数-标-控-外-公-内)

  • 无直接耦合。如果两个模块中的每一个都能独立地工作而不需要另一个模块的存在,那么它们彼此完全独立,这意味着模块间无任何连接,耦合程度最低。但是,在一个软件系统中不可能所有模块之间都没有任何连接。
  • 数据耦合。如果两个模块彼此间通过参数交换信息,而且交换的信息仅仅是数据,那么这种耦合称为数据耦合。
  • 控制耦合。如果传递的信息中有控制信息(尽管有时这种控制信息以数据的形式出现),则这种耦合称为控制耦合。
  • 外部耦合。
  • 公共耦合。当两个或多个模块通过一个公共数据环境相互作用时,它们之间的耦合称为公共环境耦合。
  • 内容耦合。最高程度的耦合是内容耦合,应该坚决避免使用内容耦合。
  • 特征耦合。当把整个数据结构作为参数传递而被调用的模块只需要使用其中一部分数据元素时,就出现了特征耦合。在这种情况下,被调用的模块可以使用的数据多于它确实需要的数据,这将导致对数据的访问失去控制,从而给计算机犯罪提供了机会。
内聚(内聚程度由低到高:偶-逻-时-过-通-顺-功)

内聚标志着一个模块内各个元素彼此结合的紧密程度,设计时应该力求做到高内聚,内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的松耦合。模块化设计的原则一般遵循:高内聚、低耦合。

内聚分为以下几类:

  • 偶然内聚:0分
  • 逻辑内聚:1分
  • 时间内聚:3分
  • 过程内聚:5分
  • 通信内聚:7分
  • 顺序内聚:9分
  • 功能内聚:10分

启发规则

  • 改进软件结构提高模块独立性
  • 模块规模应该适中
  • 深度、宽度、扇出和扇入都应适当。深度表示软件结构中控制的层数,它往往能粗略地标志一个系统的大小和复杂程度。宽度是软件结构内同一个层次上的模块总数的最大值。一般说来,宽度越大系统越复杂。对宽度影响最大的因素是模块的扇出

    扇出是一个模块直接控制(调用)的模块数目,扇出过大意味着模块过分复杂,需要控制过多的下级模块;扇出过小也不好。经验表明,一个设计得好的典型系统的平均扇出通常是3或4(扇出的上限通常是5~9)。

    一个模块的扇人表明有多少个上级模块直接调用它,扇入越大则共享该模块的上级模块数目越多,这是有好处的(扇入可以影响模块的复用率)。但是,不能违背模块独立原理单纯追求高扇人。
  • 模块的作用域应该在控制域之内
  • 力争降低模块接口的复杂程度
  • 设计单入口单出口的模块
  • 模块功能应该可以预测

面向数据流的设计方法

通常用数据流图描绘信息在系统中加工流动的情况。
因为 任何软件系统都可以用数据流图表示,所以面向数据流的设计方法理论上可以设计任何软件的结构。通常所说的结构化设计方法(简称SD方法),也是基于数据流的设计方法。
面向数据流的设计方法把 信息流 映射成 软件结构
信息流有两种类型,分别是变换流事务流

需要注意的是:

交换流是线性的、顺序的

总体设计与架构设计的区别 总体设计构想_软件结构_02


事务流是分支的

下图中T称为事务中心,它完成下述任务。

  • 接收输入数据(输入数据又称为事务)
  • 分析每个事务以确定它的类型
  • 根据事务类型选取一条分支(活动通路)
    66

总结

1、总体设计阶段的基本目的是用比较抽象概括的方式确定系统如何完成预定的任务。因此,总体设计阶段主要由两个小阶段组成。首先需要进行系统设计,然后进行软件结构设计

2、在软件结构设计中,层次图和结构图是描绘软件结构的常用工具

3、自顶向下逐步求精是进行软件结构设计的常用途径。但是,如果已经有了详细的数据流图,也可以使用面向数据流的设计方法,用形式化的方法由数据流图映射出软件结构。 应该记住,这样映射出来的只是软件的初步结构,还必须根据设计原理并且参考启发式规则,认真分析和改进软件的初步结构,以得到质量更高的模块和更合理的软件结构。(数据流图的作用 —— 软件结构设计)

本章练习

1、模块是构成程序的基本构件。

2、模块是构成程序的基本构件。

3、如果无限地分割软件,最后为了开发软件而需要的工作量就小得可以忽略了。(×)

4、数据耦合可有可无。(×)
(数据耦合是低耦合。系统中至少必须存在数据耦合,因为只有当某些模块的输出数据作为另一些模块的输人数据时,系统才能完成有价值的功能)

5、控制耦合通常可以被数据耦合代替。(√)
(控制耦合是中等程度的耦合,它增加了系统的复杂程度。控制耦合往往是多余的,在把模块适当分解之后 通常可以用数据耦合代替控制耦合。)

6、任何软件系统都可以用数据流图示。(√)