软件设计.docx
《软件设计.docx》由会员分享,可在线阅读,更多相关《软件设计.docx(15页珍藏版)》请在冰点文库上搜索。
软件设计
软件设计
一、软件设计的目标和任务
开发阶段由三个步骤组成:
设计、实现、测试。
1.软件设计在开发阶段中的重要性
开发阶段的信息流
在设计阶段,要根据用信息域表示的软件需求,以及功能和性能需求,采用某种设计方法进行数据设计、系统结构设计和过程设计。
●数据设计侧重于数据结构的定义;ERWin,Rose
●系统结构设计定义软件系统各主要成分之间的关系;
●过程设计则是把结构成分转换成软件的过程性描述;Visio
2.软件设计任务
概要设计阶段完成的具体工作:
(1)制定规范
(2)软件系统结构的总体设计
(3)处理方式设计
(4)数据结构设计
(5)数据的保护性设计
(6)可靠性设计
(7)编写概要设计阶段的文档
(8)概要设计评审
详细阶段要完成的工作:
(1)确定软件各个组成部分内的算法以及各部分的内部数据组织;
(2)选定某种过程的表达形式来描述各种算法
(3)进行详细设计的评审
软件设计的流程
二、软件设计基础
1.自顶向下、逐步细化
将软件的体系结构按自顶向下的方式,对各个层次的过程细节和数据细节逐层细化,直到用程序设计语言的语句能够实现为止,从而最后确立整个的体系结构。
ProcedureCheckUseinfo;
CheckCard;
CheckDan;
CheckPrice;
End
2.软件结构
软件结构包括两部分:
程序模块的层次结构、数据的结构。
3.程序结构
程序结构表明了程序各个成分的组织情况,通常是树状结构或网状结构。
(1)程序的树状结构和网状结构
(2)结构图
结构图是精确表达程序结构的图形表示方法,它清楚地反映出程序中模块间的层次调用关系和联系:
不仅严格定义了各个模块的名字、功能和接口,而且还反映了设计思想。
它以特定的符号表示模块、模块间的调用关系和模块间的信息的传递。
包括以下内容:
1)模块:
模块的名字应能表明该模块的功能
2)模块的调用关系和接口
两个模块之间用单向箭头联结,箭头由调用模块指向被调用模块,表示调用模块调用了所调用模块。
3)模块间的信息传递
当一个模块调用另一个模块时,调用模块把数据或控制信息传送给所调用模块,使被调用模块能够运行,而在执行所调用模块的过程中又把它产生的数据或控制信息送给调用模块。
4)两个辅助符号
当模块A有条件地调用模块B时,在模块A的箭头尾部标以一个菱形符号。
当模块A反复地调用模块C和模块D时,在模块A的箭头尾部标以一个弧形符号。
5)结构图的形态特征
●结构的深度:
模块结构的层次数
●结构图的宽度:
结构图中同一层模块的最大模块数
●模块的扇入和扇出:
扇出表示一个模块直接调用的其他模块数目,扇入为调一个给模块的模块数
4.模块化
将整个软件划分成若干单独命名和可编址部分,称为模块。
对于一个大型软件,由于其控制路径数目多、涉及的范围广、变量的数目多以及其总体复杂性,使其相对于一个较小的软件不容易被人理解。
假设C(P)是度量对一个问题P理解复杂性的函数,E(P)是度量为解决问题P所需工作量的函数,则给定问题P1和P2,如果C(P1)>C(P2),那么有E(P1)>E(P2).
同时,如果把两个问题结合起来作为一个问题来处理,其理解复杂性大于将这两个问题分开考虑时的理解复杂性之和:
C(P1+P2)>C(P1)+C(P2),同时可以推出E(P1+P2)>E(P1)+E(P2).
模块大小、模块数目和费用的关系
三、模块的独立性
1.模块(Module)
一般把用一个名字就可调用的一段程序称为“模块”。
具有三个基本属性:
(1)功能:
即指该模块实现什么功能,做什么事情。
(2)逻辑:
即描述模块内部怎么做
(3)状态:
即该模块使用时的环境和条件
2.模块独立性(ModuleIndependence)
模块的独立性是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他的模块的接口是简单的。
若一个模块只具有单一的功能且与其他模块没有太多的联系,则称此模块具有模块独立性。
一般采用两个准则来度量模块的独立性:
模块间的耦合和模块的内聚。
3.耦合性(Coupling)
耦合性是程序结构中各个模块之间相互关联的度量,它取决于各个模块之间接口的复杂程度、调用模块的方式以及哪些信息通过接口。
一般模块之间的可能连接方式有七种,构成耦合性的七种类型:
(1)非直接耦合(NodirectCoupling)
如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合,这种耦合的模块独立性最强。
(2)数据耦合(DataCoupling)
如果一个模块访问另一个模块时,彼此之间是通过数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的,则称这种耦合为数据耦合。
数据耦合是松散的耦合,模块之间的独立性比较强。
在软件程序结构中至少必须有这类耦合。
(3)标记耦合(StampCoupling)
如果一组模块通过参数表传记录信息,就是标记耦合。
在设计中应尽量避免这种耦合,它使数据结构上的操作复杂化了。
可以采用“信息隐蔽”的方法,把在数据结构上的操作全部集中在一个模块中,就可以消除这种耦合。
(4)控制耦合(ConteolCoupling)
如果一个模块通过传送开头、标志、名字等控制信息,明显地控制选择另一个模块的功能,就是控制耦合。
(5)外部耦合(ExternalCoupling)
一组模块都访问同一个全局简单变量而不是同一个全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之外部耦合。
(6)公共耦合(CommonCoupling)
若一组模块都访问另一个公共数据环境,则它们之间的耦合就称为公共耦合。
公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。
(7)内容耦合(ContentCoupling)
如果发生以下情形,两个模块之间就发生了内容耦合:
1)一个模块直接访问另一个模块的内部数据;
2)一个模块不通过正常入口转到另一个模块内部;
3)两个模块有一部分程序代码重叠;
4)一个模块有多个入口;
4.内聚性(Cohesion)
一般模块的内聚性分为七种类型:
(1)巧合内聚(CoincidentalCohesion)
巧合内聚又称为偶然内聚,当模块内各部分之间没有联系,或者即使有联系,这种联系也很松散,则称这种模块为巧合内聚模块。
(2)逻辑内聚(LogicalCohesion)
把几种相关的功能组合在一起,每次调用时,由传送给模块的判定参数来确定该模块应执行哪一种功能。
(3)时间内聚(ClassicalCohesion)
时间内聚又称经典内聚,这种模块大多为多功能模块,但模块内的各个功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行。
(4)过程内聚(ProcedurealCohesion)
如果一个模块内的处理是相关的,而且必须是以特定的次序执行,则称这个模块为过程内聚模模块。
这类模块的内聚程度比时间内聚模块的内聚程序更强一些。
(5)通信内聚(CommunicationalCohesion)
如果一个模块内各功能部分都使用了相同的输入数据,或产生了相同的输出数据,则称之为通讯内聚模块。
通常,通信内聚模块是通过数据流图来定义的。
(6)信息内聚(InformationalCohesion)
这种模块完成多个功能,各个功能都在同一数据结构上操作,每一项功能都有一个唯一的入口点。
信息内聚模块可以看成是多个功能内聚模块的组合,并且达到信息的隐蔽。
优点:
当把程序某些方面细节隐藏在一个模块中时,各个模块的独立性就增加了。
(7)功能内聚(FunctionalCohesion)
一个模块中各个部分就是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的,称该模块为功能内聚模块。
优点:
它们容易维护和修改。
四、结构化设计方法
结构化设计方法是基于模块化、自顶向下逐层细化、结构化程序设计等程序设计技术基础上发展起来的,实施要点:
(1)首先研究、分析和审查数据流图;
(2)然后根据数据流图决定问题的类型
(3)由数据流图推导出系统的初始结构图;
(4)利用一些试探性原则来改进系统的初始结构图,直到得到符合要求的结构图为止;
(5)修改和补充数据字典;
(6)制定测试计划
1.典型的系统结构图
(1)在系统结构图中的模块
在系统结构图中,不能再分解的底层模块称为原子模块。
在一般的系统结构图中有四种关系的模块:
1)传入模块:
从下属模块取得数据,经过某些处理,再将其传送到上级模块;
2)传出模块:
从上级模块获得数据,进行某些处理,再将其传送给下属模块;
3)变换模块:
也称为加工模块。
它从上级模块取得数据,进行特定的处理,转换成其他形式,再传送回上级模块。
4)协调模块:
对所有下属模块进行协调和管理的模块。
(2)变换型系统结构图
变换型数据处理的工作过程分为三步:
取得数据、变换数据、给出数据。
变换型系统结构如下:
(3)事务型系统结构图
另一类典型的数据处理问题是事务型的,通常它是接受一项事务,根据事务处理的特点和性质,选择分派一个适当的处理单元,然后结出结果。
通常把它成选择分派任务的部分叫做事务处理中心。
2.变换分析设计方法
通常,系统的数据处理问题总能表示为变换型,可采用变换分析的方法来建立系统的结构图。
变换分析方法由以下四步组成:
(1)重画数据流图
(2)区分数据有效输入、有效输出、变换中心
(3)进行一级分解,设计出系统模块结构的顶层和第一层
(4)进行二级分解,设计输入、中心变换、输出部分的中、下层模块
3.软件模块结构的改进
(1)模块功能的完善化
(2)消除重复功能,改善软件结构
(3)模块的作用范围应在控制范围之内
(4)尽可能减少高扇出结构,随着深度增大扇入
(5)模块大小要适中
(6)设计功能可预测的模块,但要避免过分受限的模块