软件设计
软件设计是什么
【需求规格说明】通过{软件设计过程},产生【概要设计说明(又名,总体设计)】,【详细设计说明】
- 概要设计 的目的:是按某种设计方法,将软件系统分解为多个子系统,再将子系统分解为多个模块或者部件,并将系统所有的功能合理分配到模块或者部件中去。
- 详细设计 是面向程序员的,它主要目的是按某种设计方法,将软件系统的模块或者部件,进行编程设计,用以指导程序人员编写代码,形成模块或者部件的实现蓝图
- 简单的系统可以将【概要设计】和【详细设计】统一合成为【软件设计说明,SDS:】,大型或者有一定复杂的系统必须要分为两部分。
软件设计的目标和准则
目标:
- 使软件的可维护性,可理解下,可靠性,效率等最大限度得到满足。
衡量准则:
- 明显的层次结构
- 模块化(高内聚,低耦合)
- 界面清晰
- SDS:清晰,简介,完整和无歧义
PS:SDS的作用:编码基础,测试和维护指南
软件设计的核心思想
“分而治之”是软件设计解决复杂度难题的主要思路,抽象和分解时软件设计的核心思想。
- 分解时在横向上将系统分割为几个相对简单的子系统以及各子系统之间的关系
- 抽象时在纵向上将系统分离为接口与实现
软件设计过程
分析模型———设计模型
(应该做什么)—–(该怎么做)
首先进行【概要设计】产生{概要设计说明},其次进行【概要设计评审】产生{审核通过的概要设计说明},不通过则返回,之后进行【详细设计】,最后进行【详细设计评审】
详细设计
结构化设计:模块设计
面向对象设计:系统元素设计
阶段可交付成果:
- 详细设计说明文档
- 单元测试计划
概要设计的基本原理
模块化与信息隐藏的动机
动机:在测试,维护期间需要修改时,只改了一个模块就够了,其他模块不受影响。因为大多数数据和过程都是隐蔽的,时其他模块所不知道的,所以在修改期间很少会传到软件内部的其他位置模块化:
- 如何分解?
- 怎样的分解时高质量的
模块化
- 7+-2原则:人类信息处理的能力是有限的,因此菜单栏等内容最好是在5~9的长度内
- 将整个开发工作进行划分,使得我们能够分而治之
- 隔离各个模块,使得变更和服用能够在不影响其他模块的情况下进行
- 思考:软件模块划分是否越细
模块独立性
- 每个模块只完成系统要求的独立子功能,并且与其他模块的联系最少且接口简单
- 良好的模块独立性能是开发的软件具有较高的质量
- 两个定性的度量标准:耦合,内聚
- 高内聚,低耦合原则:每个模块内部有最大的关联,而模块之间有最小的关联
耦合
- 耦合性是程序结构中各个模块相互关联的度量
- 它取决于各个模块之间接口的复杂程度,调用模块的方式以及哪些信息通过接口
几种耦合的介绍:
非直接耦合
如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合。这种耦合的模块独立性最强。 。
数据耦合
如果一个模块访问另一个模块时,彼此之间是通过数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的,则称这种耦合为数据耦合。[参数表交换信息,共享数据]
由于限制了只通过参数表传递数据,按数据耦合开发的程序界面简单、安全可靠。因此,数据耦合是松散的耦合,模块之间的独立性比较强。在软件程序结构中至少必须有这类耦合。
标记耦合
如果一组模块通过参数表传递记录信息,就是标记耦合。事实上,这组模块共享了这个记录,它是某一数据结构的子结构,而不是简单变量。[参数表交换信息,共享数据结构]
这要求这些模块都必须清楚该记录的结构,并按结构要求对此记录进行操作。在设计中应尽量避免这种耦合,它使在数据结构上的操作复杂化了。如果采取“信息隐蔽”的方法,把在数据结构上的操作全部集中在一个模块中,就可以消除这种耦合。
控制耦合
如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。[共享逻辑]
这种耦合的实质是在单一接口上选择多功能模块中的某项功能。因此,对所控制模块的任何修改,都会影响控制模块。另外,控制耦合也意味着控制模块必须知道所控制模块内部的一些逻辑关系,这些都会降低模块的独立性。
外部耦合
一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。[共享数据]
例如C语言程序中各个模块都访问被说明为extern类型的外部变量。外部耦合引起的问题类似于公共耦合,区别在于在外部耦合中不存在依赖于一个数据结构内部各项的物理安排。
公共耦合
若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。[共享数据结构]
这种耦合会引起下列问题:
1)所有公共耦合模块都与某一个公共数据环境内部各项的物理安排有关,若修改某个数据的大小,将会影响到所有的模块。
2)无法控制各个模块对公共数据的存取,严重影响软件模块的可靠性和适应性。
3)公共数据名的使用,明显降低了程序的可读性。
公共耦合的复杂程度随耦合模块的个数增加而显著增加。
若一个模块只是往公共数据环境里传送数据,而另一个模块只是从公共数据环境中取数据,则这种公共耦合叫做松散公共耦合。若两个模块都从公共数据环境中取数据,又都向公共数据环境里送数据,则这种公共耦合叫做紧密公共耦合。只有在模块之间共享的数据很多,且通过参数表传递不方便时,才使用公共耦合。否则,还是使用模块独立性比较高的数据耦合好些。
内容耦合
如果发生下列情形,两个模块之间就发生了内容耦合。
1)一个模块直接访问另一个模块的内部数据;
2)一个模块不通过正常入口转到另一模块内部;
3)两个模块有一部分程序代码重叠(只可能出现在汇编语言中);
4)一个模块有多个入口。
在内容耦合的情形,所访问模块的任何变更,或者用不同的编译器对它再编译,都会造成程序出错。好在大多数高级程序设计语言已经设计成不允许出现内容耦合。它一般出现在汇编语言程序中。这种耦合是模块独立性最弱的耦合。
0 条评论