4 软件工程——总体设计

一、设计过程

1.两个主要阶段

  • 系统设计阶段:确定系统的具体实现方案
  • 结构设计阶段:确定软件结构

2.九个步骤

  • 设想供选择的方案
  • 选取合理的方案
  • 推荐最佳方案
  • 功能分解
  • 设计软件结构
  • 设计数据库
  • 制定测试计划
  • 书写文档
  • 审查和复审

二、设计原理

1.模块化

模块化是由边界元素限定的相邻程序元素的序列,而且有一个实体标识符代表着它。

模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体。

2.抽象

把相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。 抽象就是抽出职务的本质特性而暂时不考虑它们的细节

3.逐步求精

为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。

逐步求精可以看座是一项把一个时期内必须解决的种种问题按优先级排序的技术。

4.信息隐藏和局部化

把一些关系密切的软件元素物理地放得彼此靠近。在模块中使用局部数据元素是局部化的一个例子,显得局部化有助于实现信息隐藏。

5.模块独立

开发具有独立功能而且和其他模块之间没以后过多的相互作用的模块,就可以做到模块独立。换句话说,希望这样设计软件结构,使得每个模块完成一个相对独立的特定子功能,并且和其他模块之间的关系很简单。为什么说模块的独立性很重要呢?

  • 有效的模块化的软件比较容易开发出来
  • 独立的模块比较容易测试和维护

(1)耦合

耦合是对一个软件结构内模块之间互连程度的度量。耦合度越高,模块之间的依赖关系越紧密,系统的灵活性和可维护性越差。理想的设计是尽量减少耦合,使得模块之间相对独立。

排序(低到高):

非直接耦合<数据耦合<标记耦合<控制耦合<外部耦合<公共耦合<内部耦合

尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。

1.1 非直接耦合
  • 定义:模块之间存在间接依赖,即一个模块通过其他模块或中介进行交互,而不是直接依赖于另一个模块的内部实现。
  • 特点:通过引入中介或抽象层减少模块间的直接依赖,提高模块的独立性。
  • 示例:模块A通过接口或服务与模块B进行交互,而不是直接调用模块B的内部方法。
1.2 数据耦合(低耦合)
  • 定义:两模块彼此通过参数交换数据信息,模块之间没有控制依赖。
  • 特点:数据耦合度最低,模块间通过数据交换而不影响彼此的实现,能有效减少模块间的依赖关系。
  • 示例:模块A将一个数据对象传递给模块B,模块B仅使用数据,不控制模块A的行为。
1.3 控制耦合(中等耦合)
  • 定义:传递的信息中带有控制信息,控制信息用来控制模块内部的行为。
  • 特点:模块之间存在控制依赖,即模块通过参数来控制其他模块的行为,耦合度中等。
  • 示例:模块A传递一个控制标志(如布尔值)给模块B,来决定模块B执行不同的操作。
1.4 公共环境耦合
  • 定义:两个或多个模块共享相同的全局数据(通常是全局变量、常量、配置文件等)。
  • 特点:公共环境耦合度较高,因为多个模块共享同一全局数据,可能会导致数据污染或意外的依赖关系。
  • 示例 :模块A和模块B共享一个全局变量 counter,任何一个模块对它的修改都会影响到另一个模块。
1.5 内容耦合(最高耦合)
  • 定义:一个模块直接访问另一个模块的内部数据或实现细节,甚至直接修改另一个模块的代码。
  • 特点:内容耦合是耦合度最高的类型,模块之间高度依赖,修改一个模块的内部实现可能会影响到多个模块。
  • 示例:模块A直接修改模块B的内部数据或访问模块B的私有字段和方法。

(2)内聚

内聚是衡量一个模块内部各个部分之间紧密程度的度量。内聚度越高,模块内部的元素协同工作,功能越专一,系统的可维护性和可理解性越强。

排序(低到高):

偶然内聚<逻辑内聚<时间内聚<过程内聚<通信内聚<顺序内聚<功能内聚

尽量追求高内聚,确保模块的功能明确且专一。

2.1 功能内聚(Functional Cohesion)
  • 定义:功能内聚是指模块内部的所有元素都紧密地协作以完成同一个功能或任务。
  • 特点:功能内聚性最强,模块的每个部分都朝着一个明确的目标协作,符合单一职责原则。
  • 示例:一个处理用户注册的模块,所有代码都围绕着处理用户注册的具体任务展开。
2.2 顺序内聚(Sequential Cohesion)
  • 定义:顺序内聚是指模块内部的各个部分按顺序执行,每个部分的输出是下一个部分的输入。
  • 特点:操作有序,前一个操作的结果是下一个操作的输入。
  • 示例:数据处理模块,先进行数据格式化,再进行数据分析,最后输出结果。
2.3 通信内聚(Communicational Cohesion)
  • 定义:通信内聚是指模块内部的各个部分共同操作同一组数据。
  • 特点:虽然模块内部的操作功能不同,但它们都操作相同的数据。
  • 示例:一个模块内的数据处理操作,操作相同的数据集(例如,同一个用户对象的多个属性)。
2.4 过程内聚(Procedural Cohesion)
  • 定义:过程内聚是指模块内的各个部分执行的任务虽然不同,但执行顺序上的相关性较强,必须按特定的顺序来执行这些任务。
  • 特点:模块内的操作是为了完成一个大任务的几个步骤。
  • 示例:一个模块负责验证输入数据、读取数据库、格式化输出等任务,这些任务在流程上有先后顺序。
2.5 时间内聚(Temporal Cohesion)
  • 定义:时间内聚是指模块内的各个部分需要在同一时间点执行,但这些操作的功能没有直接关系。
  • 特点:模块内的各部分功能不同,但它们在时间上被安排为同时执行。
  • 示例:一个系统初始化模块,在系统启动时执行多个初始化任务,如加载配置文件、初始化连接池等。
2.6 逻辑内聚(Logical Cohesion)
  • 定义:逻辑内聚是指模块内的各个部分负责处理同一类任务,但每个任务执行的功能不同。
  • 特点:模块内的操作虽然属于同一类别,但功能不同,通常通过一些条件判断来决定具体执行哪一部分任务。
  • 示例:一个模块根据不同的用户请求类型(如:打印、计算、存储)执行不同的功能。
2.7 偶然内聚(Coincidental Cohesion)
  • 定义:偶然内聚是指模块内的各个部分没有共同目标,它们的功能完全不相关,只是偶然地被放在同一个模块中。
  • 特点:内聚性最差,模块内的各个部分之间没有任何联系,模块功能不明确。
  • 示例:一个模块同时处理输入、输出、日志记录和网络通信等任务,它们之间没有任何相关性。

三、启发规则

  1. 改进软件结构提高模块独立性
  2. 模块规模应该适中
  3. 深度、宽度、扇入和扇出都应适当
  4. 模块的作用域应该在控制域之内
  5. 力争降低模块接口的复杂程度
  6. 设计单入口单出口的模块
  7. 模块功能应该可以预测

四、面向数据流的设计方法

1.变换流

有明显的输入输出。

根据基本系统模型,信息通常以"外部世界"的形式进入软件系统,经过处理以后再以"外部世界"的形式离开系统。

2.事务流

数据沿输入通路到达一个处理,这个处理根据输入数据的类型在若干动作系列中选出一个来执行。这类数据流应该划为一类特殊的数据流,称为事务流。

有事务中心:

  • 接收输入数据(输入数据又称为事务)
  • 分析每个事务以确定它的类型
  • 根据事务类型选取一条活动通路
相关推荐
微服务 spring cloud2 分钟前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
矛取矛求4 分钟前
QT的前景与互联网岗位发展
开发语言·qt
先睡4 分钟前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
Leventure_轩先生4 分钟前
[WASAPI]从Qt MultipleMedia来看WASAPI
开发语言·qt
弗罗里达老大爷6 分钟前
Redis
数据库·redis·缓存
向宇it18 分钟前
【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
开发语言·unity·c#·游戏引擎
wm104320 分钟前
java web springboot
java·spring boot·后端
smile-yan22 分钟前
Provides transitive vulnerable dependency maven 提示依赖存在漏洞问题的解决方法
java·maven
老马啸西风23 分钟前
NLP 中文拼写检测纠正论文-01-介绍了SIGHAN 2015 包括任务描述,数据准备, 绩效指标和评估结果
java
Earnest~26 分钟前
Maven极简安装&配置-241223
java·maven