第四章软件工程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.1 软件概要设计的基本任务
在软件需求分析阶段,已经搞清楚了软件“做什么”的问题,并把这些需求通过规格说明书描述了出来,这也是目标系统的逻辑模型。进入了设计阶段,要把软件“做什么”的逻辑模型变换为“怎么做”的物理模型,即着手实现软件的需求,并将设计的结果反映在“设计规格说明书”文档中,所以软件设计是一个把软件需求转换为软件表示的过程,最初这种表示只是描述了软件的总的体系结构,称为软件概要设计或结构设计。
4.1.1 基本任务
1. 设计软件系统结构(简称软件结构)
为了实现目标系统,最终必须设计出组成这个系统的所有程序和数据库(文件),对于程序,则首先进行结构设计,具体为:
(1)采用某种设计方法,将一个复杂的系统按功能划分成模块。
(2)确定每个模块的功能。
(3)确定模块之间的调用关系。
(4)确定模块之间的接口,即模块之间传递的信息。
(5)评价模块结构的质量。
根据以上内容,软件结构的设计是以模块为基础的,在需求分析阶段,已经把系统分成层次结构。设计阶段,以需求分析的结果为依据,从实现的角度进一步划分为模块,并组成模块的层次结构。软件结构的设计是概要设计关键的一步,直接影响到下一阶段详细设计与编码的工作软件系统的质量及一些整体特性都在软件结构的设计中决定。
2.数据结构及数据库设计
对于大型数据处理的软件系统,除了控制结构的模块设计外,数据结构与数据库设计也是很重要的。
(1)数据结构的设计
逐步细化的方法也适用于数据结构的设计。在需求分析阶段,已通过数据字典对数据的组成、操作约束、数据之间的关系等方面进行了描述,确定了数据的结构特性,在概要设计阶段要加以细化,详细设计阶段则规定具体的实现细节。在概要设计阶段,宜使用抽象的数据类型。
(2)数据库的设计
数据库的设计指数据存储文件的设计,主要进行以下几方面设计:
①概念设计。在数据分析的基础上,采用自底向上的方法从用户角度进行视图设计,一般用ER模型来表示数据模型,这是一个概念模型。
②逻辑设计。ER模型或IDEFlx模型是独立于数据库管理系统(DBMS)的,要结合具体的DBMS特征来建立数据库的逻辑结构,对于关系型的DBMS来说将概念结构转换为数据模式、子模式并进行规范,要给出数据结构的定义,即定义所含的数据项、类型、长度及它们之间的层次或相互关系的表格等等。
③物理设计。对于不同的DBMS,物理环境不同,提供的存储结构与存取方法各不相同。物理设计就是设计数据模式的一些物理细节,如数据项存储要求、存取方式、索引的建立。
3.编写概要设计文档
文档主要有:
(1)概要设计说明书。
(2)数据库设计说明书,主要给出所使用的DBMS简介、数据库的概念模型、逻辑设计、结果。
(3)用户手册,对需求分析阶段编写的用户手册进行补充。
(4)修订测试计划,对测试策略、方法、步骤提出明确要求。
4.评审
对设计部分是否完整地实现了需求中规定的功能、性能等要求,设计方案的可行性,关键的处理及内外部接口定义正确性、有效性,各部分之间的一致性等等都一一进行评审。
4.1.2 软件概要设计说明书的主要内容
概要设计说明书是概要设计阶段结束时提交的技术文档,按国标GB8576-88的“计算机软件产品开发文件编制指南”规定,软件设计文档可分为“概要设计说明书”、“详细设计说明书”、“数据库设计说明书”。
4.2 软件设计的基本原理
软件设计中最重要的一个问题就是软件质量问题,用什么标准对软件设计的技术进行衡量呢?本节介绍几种基本原理。
4.2.1 模块化
何为模块?模块在程序中是数据说明、可执行语句等程序对象的集合,或者是单独命名和编址的元素,如高级语言中的过程、函数、子程序等等。模块是可组合、分解和更新的单元。模块有以下基本属性:
接口:指模块的输入与输出。
功能:指模块实现什么功能。
逻辑:描述内部如何实现要求的功能及所需的数据。
状态:该模块的运行环境,即模块的调用与被调用关系。
功能、状态与接口反映模块的外在特性,逻辑反映它的内在特性。
模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。
例如,设问题x,表示它的复杂性函数为C(x),解决它所需的工作量函数为E(x)。对于问题P1和P2,如果C(P1)>C(P2)即Pl比P2复杂,
那么E(P1)>E(P2)即问题越复杂,所需要的工作量越大。
根据解决一般问题的经验,规律是:
C(P1十P2)>C(P1)十C(P2)
即一个问题由两个问题组合而成的复杂度大于分别考虑每个问题的复杂度之和。这样可以推出:
E(Pl十P2)>E(P1)十E(P2)
由此可知,开发一个大而复杂的软件系统,将它进行适当的分解,不但可降低其复杂性,还可减少开发工作量,从而降低开发成本,提高软件生产率,但是模块划分越多,块内的工作量减少,模块之间接口的工作量增加了,如图4—l所示。因此在划分模块时,应减少接口的代价,提高模块的独立性。
4.2.2 抽象
抽象是认识复杂现象过程中使用的思维工具,即抽出事物本质的共同性而暂不考虑它的细节,不考虑其他因素。抽象的概念被广泛应用于计算机软件领域,在软件工程学中更是如此。软件工程过程中的每一步都可以看作是对软件解决方法的抽象层次的一次细化。
4.2.3 信息隐蔽
通过抽象,可以确定组成软件的过程实体。通过信息隐蔽,可以定义和实现对模块的过程细节和局数据结构的存取限制。信息隐蔽指在设计和确定模块时,使得一个模块内包含的信息(过程或数据),对于不需要这些信息的其他模块来说,是不能访问的。
4.2.4 模块独立性
为了降低软件系统的复杂性,提高可理解性、可维护性,必须把系统划分成为多个模块,模块不能任意划分,应尽量保持其独立性。模块独立性指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。
如何衡量软件的独立性呢?根据模块的外部特征和内部特征,提出了两个定性的度量标准--耦合性和内聚性。
1.耦合性
也称快间联系,指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。模块的耦合性有以下几种类型,分为:
(1)无直接耦合
指两个模块之间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。因此模块间耦合性最弱,模块独立性最高。
(2)数据耦合
指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言中的值传递。
(3)标记耦合
指两个模块传递的是数据结构,如:高级语言中的数组名、记录名、文件名等这些名字即为标记,其实传递的是这个数据结构的地址。
(4)控制耦合
指一个模块调用另一个模块时,传递的是控制变量(如开关、标志等),被调模块通过该控制变量的值有选择地执行块内某些功能。
(5)公共耦合