第十一章:设计系统
设计风格
- 管道和过滤器
- 面向对象的设计
- 隐含调用
- 分层
- 信息库
- 解释器
- 客户-服务器
管道和过滤器:
系统有:
数据流(管道)作为输入和输出
数据从输入到输出的转换 (过滤器)特性:
- 设计人员能理解整个系统对输入和输出的影响,因为可以将任何两个过滤器连接在一起。
- 系统的演化很简单
- 允许过滤器并发执行
- 缺点:
- 鼓励使用批处理,不善于处理交互式应用。
- 重复其他过滤器执行的准备功能
面向对象的设计:
- 两个特性
- 对象必须保持数据的完整性
- 数据表示必须对其他对象是隐藏的
隐含调用:
- 概念:设计模型是事件驱动,基于广播的概念。数据交换必须通过信息库中共享的数据完成
- 应用:用于分组交换网,用于数据库中一确保一致性,用于用户界面中
- 缺点: 不能保证某个构件一定会响应一个事件
分层:
- 概念:各层是按层次化组织的,每一层为它的外层提供服务,同时又作为内层的客户。需要解释两层之间将如何交互的协议。
- 优势
- 高度利用了抽象的概念
- 增加或修改一个层次相对比较容易
- 缺点
- 按照层次来组织系统并非总是这么容易的
- 系统性能也会受到层次之间的额外协调的影响
例子:提供文件安全性的系统
信息库:
- 概念:两种构件:
- 中心数据存储
- 在中心数据存储上进行存储、检索和更新信息的构件集
- 优点: 开放性。数据表示对不同的厂商都是可用的,这样厂商可以构建工具来访问信息库
- 缺点: 数据必须是所有知识源可接受的形式
解释器:
- 概念:是以某种使之可执行的方式“解释”伪代码的机器
- 构成:
- 内存:包含待解释的伪代码
- 解释引擎
- 解释引擎的当前状态
- 正被模拟的程序的当前状态
客户-服务器:
- 优点:用户可以只在需要时获得信息
- 缺点:需要更复杂的安全措施、系统管理和应用开发
创建设计中的问题
- 模块化和抽象层次
- 协作的设计(1. 个人的经验、理解和偏爱不同; 2. 人们有时候在小组中的行为方式和单独时的行为方式有所不同; 3. 语言以及交流途径)
- 设计用户界面(1. 文化问题; 2. 用户偏爱)
- 并发性(1. 同步: 允许两个活动互不干扰地并发发生的方法;2. 互斥: 某进程访问数据元素时,其他进程都不会改变该元素;3. 监控器: 控制特定进程互斥的抽象对象或构件)
- 设计模式和复用
好设计的特性
- 构件独立性:耦合度,内聚度(耦合性是一个和内聚性相对的概念。一般而言高内聚性代表低耦合性)
- 异常标识和处理
- 防错和容错技术:主动故障检测;故障改正
耦合度:
- 耦合度:
高度耦合:当两个构件之间有大量依赖关系的时候
松散耦合:当两个构件具有某种程度的依赖,但他们之间的相互连接比较弱
非耦合:构件之间不存在相互连接 - 构件间的耦合度取决于:
- 构件的引用
- 构件间传递的数据量
- 构件控制其他构件的数量
- 构件之间接口的复杂程
- 耦合度的类型:
- 内容耦合
- 公共耦合
- 控制耦合
- 标记耦合
- 数据耦合
自底向上分别是:
非耦合 -> 数据耦合 -> 标记耦合 -> 控制耦合 -> 公共耦合 -> 内容耦合
内容耦合:
- 概念:当一个构件修改了另一个构件的内部数据项时,或一个构件内的分支转移到另外一个构件中的时候,可能出现内容耦合
公共耦合:
- 概念:对公共数据的改变意味着需要通过反向跟踪所有访问过该数据的构件来评估该改变的影响
内聚度
- 概念:如果构件的所有元素都是直接面向执行同一个任务的并且必须的,那么该构件是内聚的。
- 内聚度:
自底向上分别是:
偶然内聚性 -> 逻辑内聚性 -> 时间性内聚性 -> 程序内聚性 -> 联系内聚性 -> 顺序内聚性 -> 功能内聚性
偶然内聚性:偶然内聚性是指模块中的机能只是刚好放在一起,模块中各机能之间唯一的关系是其位在同一个模块中(例如:“工具”模块)。
逻辑内聚性:逻辑内聚性是只要机能只要在逻辑上分为同一类,不论各机能的本质是否有很大差异,就将这些机能放在同一模块中(例如将所有的鼠标和键盘都放在输入处理副程序中)。模块内执行几个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。
时间性内聚性:时间性内聚性是指将相近时间点运行的程序,放在同一个模块中(例如在捕捉到一个异常后调用一函数,在函数中关闭已打开的文件、产生错误日志、并告知用户)。
程序内聚性:程序内聚性是指依一组会依照固定顺序运行的程序放在同一个模块中(例如一个函数检查文件的权限,之后打开文件)。
联系内聚性:联系内聚性是指模块中的机能因为处理相同的数据或者指各处理使用相同的输入数据或者产生相同的输出数据,因此放在同一个模块中(例如一个模块中的许多机能都访问同一个记录)。
顺序内聚性:依序内聚性是指模块中的各机能彼此的输入及输出数据相关,一模块的输出数据是另一个模块的输入,类似工厂的生产线(例如一个模块先读取文件中的数据,之后再处理数据)。
功能内聚性:功能内聚性是指模块中的各机能是因为它们都对模块中单一明确定义的任务有贡献(例如XML字符串的词法分析)。
异常标识和处理
- 异常: 与期望系统做的事情相反的已知情况
- 提供服务失败
- 提供了错误的服务或数据
- 破坏了数据
- 异常可以用下列三种方式之一处理
- 重试
- 改正
- 报告
防错和容错技术
- 主动错误检测: 定期检查故障的征兆,或设法预见故障的发生
- 互相怀疑
- n- 版本编程
- 诊断事务
被动错误检测: 执行过程中一直等到一个错误发生
故障改正: 故障发生时系统的补偿
容错: 对故障造成的损失进行隔离