笔记参考:广州大学软件工程教学
软件工程是软件工程专业的一门重要学科,掌握好软件工程原理是开发软件的重要基础知识。本博客对软件工程导论进行了详细的讲解,以方便理解。
目录
六. 软件设计概论
6.1 软件设计的概念
软件设计:针对需求工程给出的软件需求模型,综合考虑各种制约因素,探求切实可行的软件解决方案并最终给出方案的逻辑表示,这种表示又被称为设计模型
软件设计的制约因素主要来自于资源和技术两方面。
资源制约:在软件开发过程中可以获取的时间,人力,财力,开发辅助工具等
技术制约:待开发目标软件系统可以使用的技术平台
软件设计是需求模型和实现代码之间的“桥梁”,是达成软件质量目标的关键性阶段。
6.1.1 软件设计模型
设计元素:出现在设计模型中的模块,这些模块的表现形式包括子系统,构建和类
- 子系统:完成一组逻辑上相互关联的系统功能的模块的集合,他应该作为一个整体进行设计,构造和部署,因为其功能相对独立于其他软件模块的功能
- 子系统与软件系统的其余部分的协作主要通过接口来完成,子系统内部的模块及其协作应尽量被子系统的接口隐藏。
- 构件:可执行软件系统中一个可分离、可独立部署的部分
- 构件的封装性比子系统更严格,他仅仅通过接口对外提供服务,内部实现细节完全隐藏,他的设计更专注于易复用性,易组装性
设计模型是软件问题解决方案的逻辑表示
设计模型的内容应该包括:
- 宏观说明目标软件系统的整体结构,这种宏观的软件结构在软件工程中称为“体系结构”
- 从高层抽象的角度刻画组成目标软件系统的模块以及他们之间的逻辑关联和协作关系
- 用户界面的设计——界面类
- 必须说明用户界面模型和体系结构模型中设计元素如何协同工作以实现每项软件需求
- 数据存储也是设计模型中不可缺失的环节
- 如果体系结构中的子系统或构件规模较大,需要对其内部进行展开——子系统设计模型和构件设计模型
- 类设计模型
综上,典型的软件设计模型一般包含体系结构模型,用户界面模型,用例设计模型,数据模型,子系统/构件/类设计模型
就像我们搭房子要先搭框架,然后再细化房子里面的内容。
6.1.2 设计模型的质量要素
软件设计的目标是构建高质量的设计模型。
设计模型的质量要素:正确性(一致性和可行性)、充分性、优化性和简单性
6.2 软件设计的基本原则
软件设计原则包含:
抽象与逐步求精、强内聚及松耦合、信息隐藏及关注点分离
6.2.1 抽象与逐步求精
抽象:集中在某一层次上考虑问题,暂时忽略那些低层次的细节
抽象是管理、控制问题复杂性的基本策略。
软件设计的抽象原则是指:软件设计一般要自顶向下经历一系列抽象级别从高到低的设计阶段,后续阶段会在前一阶段的基础上引入更接近于软件实现的设计元素,这一过程称为“逐步求精”。
6.2.2 模块化
将软件系统划分为若干相对独立的部件(模块),所有模块组装后可获得满足问题需要的软件解
但是,并不是意味着我们要不断的将软件系统划分模块,因为总耗费并不是随着划分的模块越多而减少的
为了解决模块化分解相关的难题,引入模块内聚度和耦合度两个概念
内聚度:
内聚度表示一个模块内部各成分彼此关联的程度
内聚度的表现形式:
- 偶然性内聚
- 模块各成分为完成一组功能而组合在一起,他们互相之间即使有关系,也很松散
- 逻辑性的内聚
- 模块完成多项功能,这些功能在逻辑上具有某种相关性
- 时间性内聚
- 模块完成的任务必须在同一个时间段内执行
- 过程性内聚
- 在逻辑性内聚的基础上,进一步要求模块内各功能必须按特定的次序执行
- 通信性内聚
- 模块中各成分对数据结构的同一区域进行操作,以达到通信的目的
- 顺序性内聚
- 模块内各处理均与同一功能相关,且这些处理必须依序执行
- 功能性内聚
- 模块内各成分协同完成单一功能
前三种内聚度较低,4、5内聚度居中,后面两种内聚度最高
模块的内聚度越高越好
耦合度
耦合度是指软件结构中多个模块之间的关联程度。耦合的强弱取决于模块间接口的复杂性,通过接口传递的数据量的大小及复杂性等。
在设计软件时应追求尽可能松散耦合的系统结构
模块间的耦合度直接影响软件系统的可理解性、可测试性、可维护性和可靠性
模块间的耦合度从低到高有五种表现形式:
- 非直接耦合:两模块中任意一个都不依赖于另一个而独立工作
- 数据耦合:如果两个模块通过参数的交换信息,这些信息仅参与计算而不影响模块的功能或执行路径
- 控制耦合:模块间交换的参数因为取值不同而导致模块功能或执行路径的变化
- 外部耦合:当若干个模块与同一外部设备或外部环境相关联
- 公共耦合:当若干模块通过公共的数据环境相互作用时。公共数据环境的种类包括全局变量,被多个模块共用的内存区或存储介质上的文件等
- 内容耦合:两模块的业务逻辑处理线索相互交织,或他们交互的复杂度高于前面的耦合形式
软件设计时应尽量使用非直接耦合和数据耦合,减少控制耦合,限制外部耦合和公共耦合,杜绝内容耦合
强内聚、松耦合原则
是软件设计领域最重要,最经典的原则之一
6.2.3 信息隐藏
模块应设计得使其所含信息(过程和数据)对于那些不需要这些信息的模块不可访问,模块之间仅交换那些为完成系统功能必须交换的信息
好处:支持模块的并行开发,减少测试和后期维护工作量
6.2.4 关注点分离
关注点是指问题求解者针对概念、任务或目标的某个部分或侧面的聚焦
抽象与逐步求精,模块化都是关注点分离原则的具体应用:前者分离“结构”和“细节”,后者分离指责型和功能型关注点
其实就是一个分而治之的原则
可以沿 “职责划分”、“结构-细节”及“通用-专用” 三个维度来分离关注点
6.3 软件设计活动
6.3.1 软件设计活动概念
完整的软件设计过程的活动:
- 设计策划
- 体系结构的设计
- 软件的体系结构是指,软件系统中主干模块的组织形式,包括这些模块的职责分派,他们之间的接口定义,协作关系及协作行为
- 人机交互设计
- 详细设计
- 设计整合与验证
- 总结
6.3.3 设计过程模型的裁剪
软件设计过程模型的裁剪方法与需求工程过程模型的裁剪方法相似
七. 软件体系结构的设计
7.1 软件体系结构的概念
软件体系结构,也称架构,从高层抽象的角度刻画组成目标软件系统的设计元素(包括子系统,构件及类)以及他们之间的逻辑关系。软件体系结构是构成后续的详细设计和软件实现的主要工作基础。
在一个设计模型中可以存在一系列抽象级别不同的体系结构模型
抽象级别越低,模型中子系统或构件的粒度越小,软件实现的细节越多。
自顶向下,逐步精化是一种广泛采用,行之有效的设计原则。
体系结构设计的任务是,建立满足软件需求的软件体系结构。
体系结构既要明确定义软件各子系统,构件、关系类的职责划分及协作关系,也要描绘他们在物理运行环境下的部署模型。
体系结构还必须针对软件系统全局性、基础性的技术问题给出技术解决方案,这种方案构成目标软件系统的技术基础设施。
体系结构设计是从what(需求)迈向how(设计)的第一步,选项很多,迷茫很多。
7.1.1 何谓体系结构
软件体系结构包括三大要素:
- 组件:软件系统的一个组成单元
- 连接件:组件之间的连接和交互关系
- 约束:组件中的元素应该满足的条件,以及组件经过连接件组成更大的模块时应满足的条件
软件体系结构涉及的约束的一些例子:
- 位于叫高层的软件元素可以向低层元素发出服务请求,低层元素完成计算后向高层元素发送服务应答,反之不行。
- 每个软件元素根据其职责位于最恰当的一个层次当中,不可错置(如核心层不能包含界面呈现和界面输入职责,也不能直接与物理设备层交互)
- 每个层次都可替换,即,一个层次可以被能实现同样对外服务接口的层次替代
软件需求和体系结构设计之间的关系:
体系结构是以软件需求的实现为目标的软件设计为蓝图,软件需求是体系结构设计的基础和驱动因素。