软件设计开始于软件需分析和规约之后,是把需求转化为软件系统的重要环节。软件需求解决“做什么”的问题,软件设计解决“怎么做”的问题。
一、概述
早期设计工程分为概要设计和详细设计。
概要设计:将需求转换为数据结构、软件体系结构及其接口。
详细设计或部件级设计:将软件体系结构中的结构性元素转换为软件部件的过程性描述,得到详细的数据结构和算法。
现在设计工程分为数据/类设计、软件体系结构设计、接口设计和部件设计。
1. 软件设计的任务
软件设计的输入是软件分析模型。
使用一种设计方法(之后章节讲),把软件分析模型中通过数据、功能和行为模型所展示的软件需求信息传送给设计阶段,产生数据/类设计、软件体系结构设计、接口设计和部件设计。
(1)数据/类设计:将分析模型转变为类的实现和软件实现所需要的数据结构。
(2)体系结构设计:定义了软件的整体结构,由软件部件、外部可见的属性和它们之间的关系组成。
(3)接口设计:描述软件内部、软件和协作系统之间以及软件同人之间的通信方式。
(4)部件级设计:将软件体系结构的结构性元素转化为对软件部件的过程性描述。
2. 软件设计的目标
3.软件设计的过程
①制定规范
②体系结构和接口设计
③数据/类设计
④部件级设计
⑤编写设计文档
⑥设计评审
二、软件设计原则
软件设计的原则有很多,下面介绍典型的四种:
1. 抽象与逐步求精
(1)抽象
抽象分为过程抽象和数据抽象。
过程抽象指任何一个完成明确定义功能的操作都可以当作单个实体看待,忽略实现该操作的更低级操作。
数据抽象指定义数据类型和施加于该类型对象的操作,并限定了对象的取值范围,只能通过操作修改和观察数据。
(2)逐步求精
把问题的求解过程分解成若干步骤或阶段,每一步比上一步更精化,更接近问题的解法。
2.模块化
模块化就是:把软件按照规定的原则,划分成一个个较小的、相互独立的但又相互关联的部件。
模块化实际是系统分解和抽象的过程。
问题越复杂,解决问题的花费越大。
把一个困难问题划分成多个较简单的问题,解决起来多个较简单问题的花费和是小于解决一个困难问题的花费的。
但是并不能对一个问题无限划分下去,因为划分之后的这些小的模块之间还需要联系,这些模块接口也需要一些费用。
因此需要衡量模块划分的数量,而且划分也需要遵守其他的设计原则。
3.信息隐藏
每个模块实现的细节对于其他模块来说应该是隐蔽的。
模块中所包含的信息(包括数据和过程),不允许其他不需要这些信息的模块使用。
4.功能独立
指模块的功能独立性,就是在设计模块时,使得模块实现独立的功能并且与其他模块的接口简单,符合信息隐蔽原则,模块间的关联和依赖程度尽可能小。
(1)内聚
内聚是一个模块内部各个元素彼此结合的紧密程度的度量。
内聚分为以下几种类型:
(2)耦合
耦合是指模块之间的相对独立性(相互连接的紧密程度)的度量。
耦合取决于各个模块之间接口的复杂程度、调用模块的方式以及通过接口的信息类型。
耦合类型:
三、软件体系结构设计
软件体系结构关注系统的一个或多个结构,包括软件部件、这些部件的对外可见的性质以及他们之间的关系。
1. 体系结构发展过程
单主机结构:
客户界面、数据和程序集中在主机上,通常只支持一个用户操作,不需要考虑多个用户并发操作的问题,因此结构简单。
客户/服务器(C/S)结构:
应用程序的处理由客户机和服务器分担;
处理请求通常被关系数据库处理,客户机在接收到经处理的数据后实现显示和业务逻辑;
系统支持模块化开发,通常有GUI界面。
浏览器/服务器(B/S)结构:
就是熟知的三层/多层计算:
①处理用户接口和用户请求的客户层,典型的就是网络浏览器。
②处理Web服务和运行业务代码的服务层。
③处理关系型数据库和其他后端数据资源的数据层。
2. 软件体系结构的风格
(1)数据为中心的体系结构
即一些数据保存在整个结构的中心,并且被其他部件频繁使用、添加、删除和修改。
(2)数据流风格的体系结构
这种体系结构适用于输入数据被一系列的计算或处理部件变换成输出数据。
由管道和过滤器组成。
(3)调用和返回风格的体系结构
(4)面向对象风格的体系结构
(5)层次式风格的体系结构
四、部件级设计技术
部件在不同的分析设计方法中有着不同的名称。在结构化分析和设计方法中部件往往是模块;在面向对象分析和设计中部件指的是类;在基于构件开发方法中部件指的是构件。
部件级设计阶段任务:
①为每个部件确定算法,选择某种适当的工具表达算法的过程,编写部件详细过程性描述。
②确定每一部件内部使用的数据结构。
③在部件级设计结束时,应该把上述结果写入部件级设计说明书,并且通过复审形成正式文档,作为下一阶段(编码阶段)的工作依据。
1. 结构化程序设计方法
并无明确的定义,一种较为流行的定义是:
如果一个程序的代码仅仅通过顺序、选择和循环这三种基本控制结构进行联结,并且每个代码只有一个入口和一个出口,则称这个程序是结构化的。
2. 图形表示法
如何选择一种合适的方式描述每个部件的执行过程?常用的描述方法有三种:图形描述、语言描述和表格描述。
图形描述包括程序流程图、盒图、问题分析图等;
语言描述用某种设计性语言来描述过程的细节;
表格描述包括判定表。
(1)程序流程图
程序流程图独立于任何一种程序设计语言,直观、简单易学习。
流程图只能使用以下五种结构:
(2)盒图(N-S图)
(3)PAD
PAD图执行顺序是从左边最上面向下执行,遇到判断或者循环自左向右进入下一层。
3. 判定表
当算法中包含多重嵌套但是条件选择时,用流程图、N-S图和PAD都不易清楚的描述。
判定表可以清晰的表达复杂条件的组合与应做动作之间的对应关系。但是他是静态的,不能表示加工的顺序,也不能表示循环结构,因此不能作为一种通用的设计工具。
4. 设计性语言PDL
PDL是一种用于描述功能部件的算法设计和处理细节的语言,称为设计性语言,是一种伪码。
五、设计规约与设计评审
...