
软件体系结构KWIC实验.docx
18页软件体系结构》实验:软件体系结构风格之应用一、实验目的通过 KWIC 实例分析,理解和掌握软件体系结构风格设计与实现二、实验内容多种软件风格设计与实现之KWIC实例:1•采用主/子程序体系结构风格实现KWIC关键词索引系统2•采用面向对象体系架构风格实现KWIC关键词索引系统3•采用管道过滤 体系架构风格实现KWIC关键词索引系统4.采用事件过程调用体系架构风格实现KWIC关键词索引系统三、 实验要求与实验环境熟练掌握基于主/子程序体系结构风格的 KWIC 关键词索引系统,在此基础上,完成基于面向对象体系架构风格的KWIC关键词索引系统设计与实现选做基于 管道过滤体系架构风格的KWIC关键词索引系统;选做基于事件过程调用体系架构 风格的 KWIC 关键词索引系统.实验课前完成实验报告的实验目的、实验环境、实验内容、实验操作过程等 内容;实验课中独立/团队操作完成实验报告的实验操作、实验结果及结论等内容; 每人一台 PC 机,所需软件 Win2003/XP 、 UML 工具( EclipseUML/ Rose/Visio/StartUML/)、Eclipse/MyEclipse、JDK6.0 等。
四、 实验操作1、采用主/子程序体系结构风格实现 KWIC 关键词索引系统主程序/子程序风格(Main Program/Subroutine Style)将系统组织成层次结 构,包括一个主程序和一系列子程序主程序是系统的控制器,负责调度各子程 序的执行各子程序又是一个局部的控制器,调度其子程序的执行 设计词汇表:主程序ma in (),子程序shift (), sort()方法,方法的调用,返回构件和连接件类型:构件:各类子程序,如shift(),sort()连接件:方法的调用基本的计算模型:子程序有shift(), sort()方法,shift()对单词进行移位,sort()方法对单词进行 排序风格的基本不变性:主程序有顺序地调用子程序,单线程控制.KWIC的主/子程序体系结构风格示意图如下所示:□ Modules (Fusons) ™ Memory Access□ Data Repr. ;n Memory ► CaHE ifO Medium “皿 system I/O主程序/子程序风格的重要设计决策与约束有:•基于声明-使用(程序调用)关系建立连接件,以层次分解的方式建立系 统部件,共同组成层次结构。
• 每一个上层部件可以“使用”下层部件,但下层部件不能“使用”上层部 件,即不允许逆方向调用.• 系统应该是单线程执行主程序部件拥有最初的执行控制权,并在“使 用”中将控制权转移给下层子程序• 子程序只能够通过上层转移来获得控制权,可以在执行中将控制权转交给 下层的子子程序,并在自身执行完成之后必须将控制权还交给上层部件KWIC主程序/子程序风格的Java语言实现见附件主程序/子程序风格的主要实现机制是模块实现,它将每个子程序都实现为一 个模块,主程序实现为整个系统的起始模块依照抽象规格的层次关系,实现模 块也被组织为相应的层次机构,通过导入/导出关系相连接需要强调的是,虽然主程序/子程序风格非常类似于结构化程序的结构,但是 主程序/子程序风格是基于部件与连接件建立的高层结构.它的部件不同于程序, 而是更加粗粒度的模块而且,在部件的实现模块内部,可以使用结构化方法,也 可以使用面向对象方法,这并不妨碍整个系统的高层结构符合主程序/子程序风格 的约定主程序/子程序风格的优点有:流程清晰,易于理解强控制性严格的层次分解和严格的控制权转移使得 主程序/子程序风格对程序的实际执行过程具备很强的控制能力,这带来了一个特 点:如果一个子程序所连接的子子程序是正确的,那么就很容易保证该子程序的 “正确性”.所以,主程序/子程序风格比其他常见风格更能控制程序的“正确 性”。
2、采用面向对象体系结构风格实现 KWIC 关键词索引系统面向对象式风格,需要强调说明的是它的“对象”是部件,属于高层结构的 元素,虽然名称相同,但它并不是面向对象方法中所述的“对象”实体面向 对象式”风格的命名是因为它借鉴了面向对象方法的思想,而不是因为它使用面向 对象方法实现体系结构,这也是在该风格名称中有一个“式”字的原因面向对象式风格的主要实现机制是模块实现,它将每个对象部件实例都实现为 一个模块存在连接的对象部件实例之间会存在模块的导入/导出关系.每个模块内部可以是基于面向对象方法的实现,也可以是基于结构化方法的实 现设计词汇表:⑴ in put, output, shift, sort, main 类(2) shift, sort, output 对象(3) 对象间的消息传递构件和连接件类型:(1)构件类型:对象⑵连接件的类型:为对象间的消息传递KWIC的面向对象程序体系结构风格示意图如下所示: ► vacation System l/Q口 Module? ^Objects)□ Public0 枪 Medium 基本的计算模型:In put模块从文本文件in put.txt中一行一行读取单Shift模块用于将单词移位。
Sort模块将单词进行排序Output模块将最终结果写到文本文件outputtxt中KWIC面向对象风格的Java语言实现见附件面向对象式风格的优点有:内部实现的可修改性.因为面向对象式风格要求封装内部数据,隐藏内部实现 , 所以它可以在不影响外界的情况下,变更其内部实现.易开发、易理解、易复用的结构组织面向对象式风格将系统组织为一系列 平等、自治的单位,每个单位负责自身的“正确性",不同单位之间仅仅是通过方 法调用相连接,这非常契合模块化思想,能够建立一个易开发、易理解、易复用的 实现结构.3、采用管道和过滤器体系结构风格实现 KWIC 关键词索引系统管道-过滤器风格将系统的功能逻辑建立为部件集合每个部件实例完成一个 对数据流的独立功能处理,它接收数据流输入,进行转换和增量后进行数据流输 出连接件是管道机制,它将前一个过滤器的数据流输出传递给后一个过滤器作 为数据流输入连接件也可能会进行数据流的功能处理,进行转换或增量,但连 接件进行功能处理的目的为了适配前一个过滤器的输出和后一个过滤器的输入, 而不是为了直接承载软件系统的需求各个过滤器可以并发执行每个过滤器都可以在数据输入不完备的情况下就开始进行处理,每次接到一部分数据流输入就处理和产生一部分输出•这样,整个 的过滤器网络就形成了一条流水线。
设计词汇表:Pipe, Filter构件和连接件类型构件:Filter连接件:PipeKWIC的管道过滤器体系结构风格示意图如下所示:FilterPipe System I/O基本的计算模型:过滤器读管道输出流,过滤器写管道输入流,过滤器通过对输入流的增量计算来完成风格的基本不变性:过滤器是独立的实体,它们之间通过管道传递数据管道一过滤器风格可以为所有过滤器部件实例建立模块实现,每个过滤器部件实例被实现为一个单独的模块,可以为所有简单的管道连接件建立一个通用的模块实现,为每个复杂的管道连接件建立一个单独的模块实现,相关联过滤器部件 的实现模块要导入管道实现模块因为管道-过滤器风格需要并发执行,所以管道-过滤器风格需要为所有过滤器 部件实例和复杂连接件实例建立进程实现,每个过滤器部件实例和复杂连接件实 例被实现为一个进程如果操作系统能够提供管道机制,那么进程实现时的简单管道可以利用操作 系统提供的机制来实现此时,所有的实现进程都需要部署在同一个物理节点 如果有中间件平台能够提供管道机制,那么进程实现时的简单管道可以利用中间 件平台提供的机制来实现•此时,各个实现进程可以被部署在不同的网络节点。
实验结果:输入文件:Hello World This is PaulinsKWIC基于管道过滤器风格的JAVA语言实现见附件输出文件:Hello WorldThis is Pauling Pauling Thi s i sWorld Hello is Pauling Thi7五、实验总结通过本次实验认识到软件体系结构风格是描述某一特定应用领域中系统组织 方式的惯用模式软件体系结构设计的一个核心问题是能否使用重复的体系结构 模式,即能达到体系结构级的软件重用也就是说,能否在不同的软件系统中,使 用同一体系结构主/子程序体系结构风格、面向对象体系架构风格、管道过滤体系架构风格、 用事件过程调用体系架构风格是四种常用的软件体系结构风格,对于实现同一种 功能的软件可以分别采用以上的这四种风格在建立体系结构过程中,不断明确 设计词汇表、构建和连接件的类型、可容许的结构模式、基本的计算类型、风格的基本不变形、常用例子、优缺点通过明确这些问题,可以理解一种体系结构 的基本特征,从而为实现体系结构重用提供可能.通过对 KWIC 进行建模和实现,让我动手把简单的软件体系结构代码实现, 在程序里体现体系结构的基本思想,拓展了数据结构的基本知识,将软件设计思 想体现在编码环节,为以后的体系结构设计提供基础。
KWIC 主程序/子程序风格的 Java 语言实现:public static void alphabetize() {String [] tmpArray = new String [shiftedLinelndexessize ()]; shiftedLineIndexes.toArray ( tmpArray);Arrays sort(tmpArray) ; sortedLineIndexes=tmpArray;}public static void Output( StringoutputAddress){ FileWriter fw = null;try {fw = new FileWriter(outputAddress) ;} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace ();}BufferedWriter bw=new BufferedWriter(fw);for(int i=0; i〈sortedLineIndexes.length; i++){try {bw.write (sortedLineIndexes[i]);} catch (IOException e) {// TODO Auto-generated catch block }}try {bw.close();} catch (IOException e) {// TODO Auto-generated catch block }}public static void Input(String iFile){ FileReader fr=null; try{ fr=new FileReader(iFile);} catch (FileNotFoundException e) {();}bw。
newLine();e.printStackTrace( ) ;e.printStackTrace() ;e printStackTracefr) ; textLines=newBufferedReader br=new BufferedReader ArrayList〈。
