软件体系结构学习【第二周】KWIC案例分析

432 阅读3分钟

KWIC索引系统功能

1.接受一些行 2.每行有若干词 3.每个词由若干字符组成 4.每行都可以循环移位:重复地把第一个词删除,然后接到行末 5.KWIC把所有行的各种移位情况按照字母表顺序输出

KWIC功能性需求

输入 -> 循环移位 -> 排序输出

KWIC非功能性需求

1.可修改性 a.算法的变化 b.数据表示方式的变化 c.系统功能的可扩展性

2.性能(时间和空间复杂性)

3.系统构件的可复用性

系统功能分解 - 主程序-子过程风格(面向过程编程)

1.分为四个基本功能:输入、移位、排序、输出 2.主程序按次序调用这四个模块 3.通过共享的数据存储和无约束的读-写协议在模块之间进行数据交换

image.png

优点: 模块之间的数据共享 不同的计算功能被隔离在不同的模块中

缺点: 对数据存储格式的变化将会影响几乎所有模块 对处理流程的改变与系统功能的增强很难适应,依赖于控制模块内部的调用次序 这种分解也henna支持有效复用

系统功能分解 - 面向对象

采取面向对象的思想,数据和作用在数据上的读写操作被封装为object,主程序调用这些object,形成控制流程。 a.数据不再被构件直接共享而是被封装在了object中 b.每个对象提供了一个接口,允许其他对象通过该接口调用该对象内封装的数据操作。

Input object(负责从输入文件中读取数据并将其存储在LineStorage对象中) LineStorage object(存储和处理字符、单词、行) CircularShifter object(负责对LineStorage对 象中存储的数据进行循环移位) Alphabetizer object(负责对循环移位后得到的数据进行排序) Output object(负责打印输出排序后的数据) Master control object(主控制对象:负责控制其他各对象中方法的调用次序) image.png

image.png

image.png

优点: 某一构件的算法与数据结构的修改不会影响其他构件 构件之间依赖性降低,提高了复用度

缺点: 不是特别适合功能的扩展 为了增加新功能,要么修改已有的模块,要么就加入新的模块。

面向过程和面向对象对比

image.png

系统功能分解 - 使用管道-过滤器风格

四个过滤器:输入、移位、排序、输出 每个过滤器处理数据,然后将结果送至下一个过滤器 控制机制是分布式的:只要有数据传入,过滤器即开始工作 过滤器之间的数据共享被严格限制在管道传输

image.png

image.png

image.png

image.png

优点: 过程流非常直观 容易修改 过滤器的功能相互隔离 新功能容易加入

缺点: 无法支持交互式系统,局限性较大。 空间复杂性高

思考:有没有更好的架构风格呢?