资源预览内容
第1页 / 共77页
第2页 / 共77页
第3页 / 共77页
第4页 / 共77页
第5页 / 共77页
第6页 / 共77页
第7页 / 共77页
第8页 / 共77页
第9页 / 共77页
第10页 / 共77页
亲,该文档总共77页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第7章软件设计基础,软件设计阶段的工作是以需求分析阶段的成果为前提和基础的,即经过系统分析小组签字认可的需求规格说明书及有关技术文档。经过软件工程师们多年的努力,一些软件设计技术、质量评估标准和设计表示法逐步形成并用于软件工程实践。 软件设计是软件工程的重要阶段。软件设计过程是对程序结构、数据结构和过程细节逐步求精、复审并编制文档的过程,本章讨论与软件设计有关的主要概念。,7.1 软件设计基本概念 7.1.1 软件设计过程,一般认为,软件开发阶段由设计、编码和测试三个基本活动组成,其中“设计”活动是获取高质量、低耗费、易维护软件的一个最重要环节。 需求分析阶段获得的需求规格说明书包括对将要实现的系统在信息、功能和行为等各个方面的描述,这是软件设计的基础。对此不论采用何种软件设计方法都将产生: 系统的总体结构设计(architectural design); 系统的数据设计(data design); 系统的过程设计(procedural design)。,7.1.1 软件设计过程,图8-1-1 开发阶段的信息流,程序 模块,总体结构设计,设计,编码,信息描述,功能描述,行为描述,其他需求,过程设计,数据设计,集成并确认的软件,测试,7.1.1 软件设计过程,软件设计也可看作将需求规格说明逐步转换为软件源代码的过程。 从工程管理的角度软件设计可分为概要(preliminary)设计和详细(detail)设计两大步骤。 概要设计是根据需求确定软件和数据的总体框架,详细设计是将其进一步精化成软件的算法表示和数据结构。 而在技术上,概要设计和详细设计又由若干活动组成,除总体结构设计、数据结构设计和过程设计外,许多现代应用软件,还包括一个独立的界面设计活动。,7.1.2 抽象与逐步求精,抽象是控制复杂性的基本策略。“抽象” 要求人们将注意力集中在某一层次上考虑问题,而忽略那些低层次的细节。 软件设计过程应当是在不同抽象级别上考虑和处理问题的过程。最初,应在最高抽象级别上,用面向问题域的语言叙述“问题”,概括“问题解”的形式,而后不断地具体化,不断地用面向过程的语言描述问题,最后,在最低的抽象级别上给出可直接实现的“问题解”,即程序。,7.1.2 抽象与逐步求精,软件工程过程的每一步都是对较高一级抽象的解作一次进一步具体化的描述。 在系统定义阶段,软件系统被描述为基于计算机的大系统的一个组成部分; 在软件规划和需求分析阶段,软件用问题域约定的习惯用语表达; 从概要设计过渡到详细设计时,抽象级再一次降低; 编码完成后达到了抽象的最低级。 在上述由高级抽象到低级抽象的转换过程中,伴随着一连串的过程抽象和数据抽象。 过程抽象把完成一个特定功能的动作序列抽象为一个过程名和参数表; 数据抽象把一个数据对象的定义(或描述)抽象为一个数据类型名。,【例7.1】考虑适用于低级CAD的图形软件包。,抽象 该CAD软件系统配有能与绘图员进行可视化通信的图形界面,能用鼠标代替绘图工具,画各种直线和曲线;能完成所有几何计算以及所有截面视图和辅助视图的设计。图形设计的结果存在图形文件中,图形文件可包含几何的、正文的和其他各种补充设计信息。 显而易见,在这一抽象级别上,用问题域本身的术语来描述问题的解。,【例7.1】考虑适用于低级CAD的图形软件包。,抽象 CAD软件任务; 用户界面子任务; 创建二维图形子任务; 显示图形子任务; 管理图形文件子任务; end CAD. 在这一抽象级别上,给出了组成CAD软件任务的所有主要子任务,尽管术语已与问题域有所不同,但仍然不是实现所用的语言。,【例7.1】考虑适用于低级CAD的图形软件包。,抽象(仅以“创建二维图形子任务”为例) PROCEDURE 创建二维图形 REPEAT UNTIL DO WHILE 数字仪接口任务; 判断作图请求: 线:画线任务; 圆:画圆任务; END;,【例7.1】考虑适用于低级CAD的图形软件包。,DO WHILE 键盘接口任务; 选择分析或计算: 辅助视图:辅助视图任务; 截面视图:截面视图任务; END; END REPEAT; END PROCEDURE.,【例7.1】考虑适用于低级CAD的图形软件包。,在这一抽象级别上,给出了初步的过程性表示,此时所有术语都是面向软件(比如采用dowhile结构)并且模块结构也开始明朗。求精过程还可继续下去,直至产生源代码。,数据抽象,数据抽象与过程抽象一样,能使设计者按不同的详细程度表示数据对象。 仍以CAD软件为例,我们可定义一个称为drawing(图)的数据对象: TYPE drawing IS STRUCTURE DEFINED number IS STRING LENTH(12); geometry DEFINED notes IS STRING LENTH(256); bom DEFINED END drawing TYPE;,数据抽象,在此,drawing被表示为一种结构,其各个组成部件本身又可为某种数据抽象,比如geometry(几何图形)和bom。 一旦抽象数据类型drawing定义完毕,即可用类型名直接说明数据对象,而不必涉及其内部构造的细节,例如,可用语句: blueprint IS INSTANCE OF drawing; 或 schematic IS INSTANCE OF drawing; 说明blueprint和schematic具有drawing的一切特性。 blueprint蓝图,schematic简(略)图。,数据抽象,在抽象数据类型的定义中可以附加一组操作的定义,用以确定在此类数据对象上可进行的操作。以抽象数据类型drawing为例,可以定义擦除(erase)、存储(save)、分类(catalog)和拷贝(copy)等操作。 许多程序设计语言都提供了对抽象数据类型的支持,Ada 的程序包机制是对数据抽象和过程抽象的双重支持,逐步求精,关于“逐步求精”,N.Wirth曾经做过如下说明: “我们对付复杂问题的重要办法是抽象,因此,对一个复杂的问题不应该立即用计算机指令、数字和逻辑符号来表示,而应该用较自然的抽象语言来表示,从而得出抽象程序。抽象程序对抽象的数据进行某些特定的运算并用某些合适的记号(可能是自然语言)来表示。对抽象程序做进一步分解,进入下一个抽象层次,重复这一精化过程直到程序能被计算机接受为止。这时的程序可能是用某种高级语言或机器指令书写的。”,过程求精与数据求精,因为求精的每一步都是用更为详细的描述替代上一层次的抽象描述,所以在整个设计过程中产生的,具有不同详细程度的各种描述,组成了系统的层次结构。层次结构的上一层是下一层的抽象,下一层是上一层的求精。 在过程求精的同时自然伴随着数据的求精,无论是过程还是数据,每一步细化都蕴涵着某些设计决策,因此设计人员必须掌握一些基本的准则,比较各种可能的候选方案。,7.1.3 模块化与信息隐藏,软件总体结构(下一节讨论)体现了模块化思想,即把软件划分为可独立命名和编制的部件,每个部件称为一个模块,当把所有模块组装到一起时,便可获得满足问题需要的一个解。 “模块化是唯一对软件中的程序进行智能化管理的一个属性”。,7.1.3 模块化与信息隐藏,假设: 函数C(X)问题X的复杂性; 函数E(X)求解问题X需要花费的工作量(时间); 对于问题P1和P2,如果 : C(P1)C(P2) 则有 : E(P1)E(P2) 结论:解决一个复杂问题总比解决一个简单问题耗费 更多的工作量。 同时 有:C(P1+P2)C(P1)+C(P2) 结论:由P1、P2组合而成的问题的复杂性往往比考虑 单个问题复杂性的和更大。 于是有: E(P1+P2)E(P1)+E(P2),7.1.3 模块化与信息隐藏,图8-1-2 模块与软件耗费,最小成本 区域M,O,软件总成本,用于接口的成本,每个模块成本之和,模块总数,成本或 工作量,1信息隐蔽,信息隐蔽原理告诉我们,模块应该设计得使其所含信息(过程和数据)对于那些不需要这些信息的模块不可访问;每个模块只完成一个相对独立的特定功能;模块之间仅仅交换那些为完成系统功能必须交换的信息,即模块应该独立。显然,模块独立的概念是模块化、抽象、信息隐蔽和局部化等诸多概念的直接结果。,信息隐蔽原理的好处,它不仅支持模块的并行开发,而且还可减少测试和后期维护的工作量。因为测试和维护阶段不可避免地要修改设计和代码,模块对大多数数据和过程处理细节的隐蔽可以减少错误向外传播。此外,整个系统欲扩充功能亦只需“插入”新模块,原有的多数模块无须改动。,2内聚度(cohesion),内聚度是前述信息隐蔽和局部化概念的自然扩展,它标志一个模块内部各成分彼此结合的紧密程度。 内聚度按其高低程度可分为七级,内聚度越高越好。,1)偶然性内聚低级内聚,偶然性内聚(coincidental cohesion)。是指一个模块内各成分为完成一组功能而组合在一起,它们相互之间即使有关系,也很松散。常见的偶然性内聚情形是,当程序员写完一个程序后发现有一组语句多处出现,于是为节省内存便将这组语句单独组成一个模块。,X,Y,Z,W,2)逻辑性内聚低级内聚,如果一个模块完成的诸任务逻辑上相关,则称之为逻辑性内聚(logical cohesion) 例如:一个模块产生所有与类型无关的输出,即为逻辑性内聚。 又如:模块X、Y分别调用A、B,A、B相似,将其合并为模块AB,模块AB即为逻辑性内聚。,X,Y,S,A,B,X,Y,S,AB,3)时间性内聚低级内聚,如果一个模块包含的诸任务必须在同一时间段内执行(例如一个初始化模块),则称之为时间性内聚(temporal cohesion)。 以上三种内聚形式通常认为是低级内聚。,4)过程性内聚中级内聚,过程性内聚(procedural cohesion) 模块的过程性内聚度是指,模块内成分彼此相关,并且必须按特定的次序执行; 过程内聚模块的各组成功能由控制流联结在一起。,5)通信性内聚度中级内聚,通信性内聚(communicational cohesion)。 模块的通信性内聚度是指,模块中各成分都将对数据结构的同一区域进行操作,以达到通信的目的。 例如,模块A的处理单元是由同一数据文件的数据产生不同的表格,6)顺序性内聚 高级内聚,顺序性内聚(sequential cohesion) 。 如果一个模块内的各处理成分均与同一功能相关,且这些处理必须顺序执行,则称顺序内聚; 通常,一个处理成分的输出是另一个处理成分的输入。例如:,1. 输入系数 2. 求方程的根 3. 打印方程的根,求一元二次方程 根的模块,7)功能性内聚高级内聚,功能性内聚(functional cohesion)。 如果模块内所有成分形成一个整体,完成单个功能,则称功能内聚,功能内聚是最高程度的内聚形式。 例如,一个模块仅完成一个矩阵的输出,就是一个具有功能性内聚的模块。 设计软件时,应该能够识别内聚度的高低,并通过修改设计尽可能提高模块内聚度,从而获得较高的模块独立性。,3耦合度,耦合度是对软件结构中模块间关联程度的一种度量。 耦合的强弱取决于模块间接口的复杂性、进入或调用模块的位置以及通过界面传送数据的多少等。 与内聚度正好相反,在设计软件时应追求尽可能松散耦合的系统。因为对这类系统中任一模块的设计、测试和维护相对独立。由于模块间联系较少,错误在模块间传播的可能性也随之变小。 模块间的耦合程度直接影响系统的可理解性、可测试性、可靠性和可维护性。 耦合度也可以分为七级,1)非直接耦合最松散的耦合,耦合度也可以分为七级: 如果两模
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号