一、系统设计概述
1.1系统设计概述
设计和抽象
- 系统行为驱动完成设计
- 面向对象设计
- 系统数据驱动完成设计
面向操作的设计 面向数据的设计
设计主要分为三个步骤:
概要设计:接收需求的文档,完成模块的分解
详细设计:根据分解后的模块,设计其内部的细节(算法、数据结构、变量等)
模块
(模块是一个词汇上邻接的程序语句序列,由边界元素限制范围,有一个聚合标识符)
语义邻接的程序语句组成
存在开始和结束的标志即存在边界
具有聚合标识符高内聚,低耦合
1.2模块内聚
偶然内聚
一个模块执行多个完全不相同的功能,没有任何逻辑关系
某些规定规定了每个模块必须具有一定的规模
可维护性下降
重用难度大内聚度最低
解决:
完成功能分割
逻辑内聚
一个模块可以执行许多相关操作,由调用模块来进行选择的内聚情况
存在接口难以理解的问题
修改模块内容容易影响其他模块难以重用
时间内聚
许多操作的执行与时间相关,没有逻辑性(动作有时间先后,没有逻辑先后)
模块内部相互关联比较弱,与外部关联比较强
软件模块可重用性差解决:
完成功能分割
过程内聚 (内聚高于前三者)
许多操作有逻辑的先后关系(顺序颠倒则功能无法实现)
动作关联关系不是很强
重用性差
通信内聚
执行一系列操作,与产品要执行的顺序有关,并且是对同一数据进行操作
重用性差
功能内聚
只执行一个操作,或者只完成一个功能
重用可能性是最大的
比较容易进行改正性维护
容易实现产品的扩展
信息内聚(理想内聚最高)
许多操作,每一个操作都有自己的入口。每一个操作有自己的代码,每一个操作都基于相同的数据
1.3模块耦合
内容耦合
两个模块中,一个模块的内容直接引用另一个模块的内容
一个模块的修改会引起两个模块的变化,增加维护成本
公共耦合
两个模块同时存取相同的全局数据
问题
- 具有边界影响,存在并发影响和控制影响,维护困难
- 维护一个模块的全局变量的时候,会影响其他模块
- 难以在新的目标系统中重用
- 使边界影响变得不清晰
- 导致计算机犯罪
控制耦合
两个模块,一个模块给另一个模块传递控制要素(简单信息 or 控制信息-动作指令)
两个模块相互制约相互影响,独立性差
一个模块必然会存在逻辑内聚
标记耦合
两个模块之间传递一个数据结构,调用模块只对数据结构的一部分进行操作
不清晰,传递的数据结构名称不能判断使用了什么信息
维护困难
重用可能性低
传递了多余数据
数据耦合(理想)
两个模块的所有的参数都是同类数据项(传递简单参数 or 传递的数据结构中所有数据项都被使用)
1.4面向操作的设计
前期数据流程图必须能够详细的描述操作
- 变换型(由数据流图判断两个最高抽象点,得到逻辑输入、逻辑输出和逻辑处理)
- 事务型(分解成事务分析器和事务派发器)
1.5面向数据的设计
首先确定数据结构再确定产品结构
Jackson
- 数据结构表示(用Jackson图的方式)
- 找出输入数据结构和输出数据结构之间的关系(有直接因果关系,能同时处理的 || 对于重复的数据必须是重复的次序和次数都相同才有可能有对应关系)
- 按输入和输出数据结构画出处理框(如果层次不同,要按照层次较低的那个设计)
- 列出所有的操作和条件,
- 并标注到程序结构图的位置
- 采用伪代码描述
二、系统详细设计
确定每个模块内采用的算法和数据结构
外部接口和用户界面设计
用某种表达工具详细表达
NS图
PAD图(问题分析图)
判定表
判定树 H图,IPO图,HIPO图
面向对象的分析建模
- 需求建模
- 分析建模
- 设计建模