软件体系结构KWIC实验

合集下载

1 软件体系结构风格---KWIC实验

1 软件体系结构风格---KWIC实验

实验:软件体系结构风格---KWIC实验一、实验目的通过KWIC 实例分析,理解和掌握软件体系结构风格设计与实现。

二、实验内容KWIC描述:KWIC索引系统接受一些行,每行有若干字,每个字由若干字符组成;每行都可以循环移位。

重复地把第一个字删除,然后接到行末; KWIC 把所有行的各种移位情况按照字母表顺序输出。

实验要求:1.采用主/子程序体系结构风格实现KWIC 关键词索引系统2.采用面向对象体系架构风格实现KWIC 关键词索引系统3.采用管道过滤体系架构风格实现KWIC 关键词索引系统三、实验要求与实验环境熟练掌握基于主/子程序体系结构风格的 KWIC 关键词索引系统,在此基础上,完成基于面向对象体系架构风格的 KWIC 关键词索引系统设计与实现;选做基于管道过滤体系架构风格的 KWIC 关键词索引系统。

实验课前完成实验报告的实验目的、实验环境、实验内容、实验操作过程等内容;实验课中独立操作完成实验报告的实验操作、实验结果及结论等内容;所需软件Eclipse、JDK8.0 等。

具体要求:在工程Exp3_KWIC_OO_Part中:1)CircularShiftImpl类中,补全setup方法,实现循环移位功能;2)AlphabetizerImpl类中,补全alph方法,实现字母序排序功能;3)OO_Kwic类中,补全调用代码。

选做:管道过滤器实现KWIC。

在工程Exp3_KWIC_PF_Part项目中:1)在CircularShift、Alphabetizer、Output三个类中,分别实现transform 方法,分别实现循环移位、排序、输出(写入文件)功能。

四、实验操作1、采用主/子程序体系结构风格实现KWIC 关键词索引系统主程序/子程序风格(Main Program/Subroutine Style)将系统组织成层次结构,包括一个主程序和一系列子程序。

主程序是系统的控制器,负责调度各子程序的执行。

软件体系结构实验报告

软件体系结构实验报告

软件体系结构实验报告实验指导书实验一1、实验项目:软件体系结构设计(一)某系统C/S风格客户端软件体系结构设计2、实验目的:熟悉C/S风格的工作机制3、实验内容:针对某个应用系统,选用C/S风格作为这个系统的软件体系结构风格。

熟悉C/S风格的工作机制,对所考察的系统进行C/S风格客户端软件体系结构设计。

(针对不同的特定应用系统具体表述)实验二1、实验项目:软件体系结构设计(二)某系统C/S风格服务器软件体系结构设计2、实验目的:熟悉C/S风格的工作机制3、实验内容:针对某个应用系统,选用C/S风格作为这个系统的软件体系结构风格。

熟悉C/S风格的工作机制,对所考察的系统进行C/S风格服务器软件体系结构设计。

(针对不同的特定应用系统具体表述)实验三1、实验项目:UML建模某系统UML建模2、实验目的:深入理解UML建模的思想,熟悉UML建模方法3、实验内容:作为实际应用前的一种演练,深入理解UML建模的思想,熟悉UML建模方法,锻炼和培养分析问题、解决问题的能力。

针对某个选定的应用系统,对其进行用例建模、对象类建模和状态图建模。

实验四1、实验项目:某系统详细设计2、实验目的:细化前期设计的有关结果,做出软件的详细规格说明3、实验内容:详细设计(也叫过程设计)是软件设计的具体模块设计阶段,是在作为软件开发前期设计的体系结构设计和总体设计的基础上进行的。

目的是要细化前期设计的有关结果,做出软件的详细规格说明。

要求具体地设计目标系统给个模块的实现过程。

实验五1、实验项目:系统集成2、实验目的:系统集成与总结3、实验内容:综合考察前八次实验的内容,通盘考虑软件设计的整个过程,深入理解软件体系结构的构建过程教务管理系统序号名称基本属性1 教师教师号,姓名,性别,职称,出生日期,政治面貌,所属系部,身份证号,档案编号2 系部系部号,系部名称,办公地点,电话3 专业专业代号,专业名称,所属系部4 教室教室号,类型(语音室,实验室,多媒体教室,普通教室等),规格,管理员,备注5 课程课程号,课程名称,开课系部,课程简介6 学生学号,姓名,性别,班级,出生日期,籍贯,民族,政治面貌,身份证号,高考成绩,档案编号7 班级班级号,班级名称,专业,人数8 成绩学号,课程号,成绩,备注(缓考,补考,重修等)9 考试安排课程号,教程号,学生,时间10 评教/评学班级,教师,课程,评教分数,评学分数11 选课学号,课程号,教师号12 排课课程号,教师号,教室号,时间13 开课计划序号,专业代号,课程号,学期,学时,学分,课程性质(选修,必修),教学方式(普通教学,多媒体教学,户外教学等)要求:1.建立教务系统的需求分析模型,并声称需求分析报告;2.建立教务系统的业务流程模型;3.建立教务系统的概念数据模型;4.建立教务系统的物理数据模型(创建数据库,生成数据库);5.通过教务系统的物理数据模型生成面向对象模型(OOM),生成对应的JA V A或者C#代码;实验一里面可以用Adobe Dreamweaver或者VisualStudio2008或者以上版本描述相关的前台界面;实验二: 用以上的工具构建相关的后台界面;实验三: 用PowerDesigner设计该系统的需求分析和业务业务流程模型(BPM)实验四: 用PowerDesigner设计该系统的CDM和PDM实验五: 用PowerDesigner 设计该系统的OOM和对应的JA V A 或C#代码.附录1:实验报告模板实验一软件体系结构设计(一)某系统C/S风格客户端软件体系结构设计实验课程名:软件体系结构专业班级:学号:姓名:实验时间:实验地点:指导教师:说明:1.验证性实验报告填写好后,以学生的学号+实验项目名作为该word文件名保存,例如某学生学号为20080001,姓名为某某,本次实验名称是:实验1 线性表的实验,则本次实验报告的保存文件名为:01某某实验1.doc。

软件体系结构经典问题——KWIC的分析和解决

软件体系结构经典问题——KWIC的分析和解决

软件体系结构经典问题——KWIC的分析和解决KWIC作为⼀个早年间在ACM的Paper提出的⼀个问题,被全世界各个⼤学的软件设计课程奉为课堂讲义或者作业的经典。

(FromWiki,FYI,D. L. Parnas uses a KWIC Index as an example on how to perform modular design in his paper "On the Criteria To Be Used in Decomposing Systems into Modules" - Available as ACM Classic Paper)问题陈述:KWIC(Key Word In Context),Parnas (1972)KWIC索引系统接受⼀些⾏,每⾏有若⼲字,每个字由若⼲字符组成;每⾏都可以循环移位,亦即重复地把第⼀个字删除,然后接到⾏末; KWIC把所有⾏的各种移位情况按照字母表顺序输出•⽬的:考察不同的体系结构对变化的适应能⼒(modifiab ility)•评价准则–处理算法的改变:例如,⾏的移位可在每⾏读⼊后、在所有⾏读⼊后、或当排序要求⼀组移位的⾏时執⾏;–数据表⽰的改变:例如,⾏、字、字符可以不同的⽅式存储;类似地,循环移位后的⾏可以显式或隐式存储(索引和偏移量);–系统功能的增强:例如,限制以某些“修饰词”(a, an, and等)打头的移位结果;⽀持交互,允许⽤户从原始输⼊表中删除⼀些⾏等;–效率:时间和空间;–复⽤:构件被复⽤的潜⼒。

Solution 1:Main Program/Subroutine with Shared DataElements of Main/Subroutine Architectural style are:Components: FunctionsInteractions: Function callsPattern: Main function controls the calling sequenceThis is the primary organization of many software systems. This style reflects structural/procedural programming language (e.g. C programming language) in which these system are written.•Decompose the overall processing into a sequence of processing steps.–Read lines; Make shifts; Alphabetize; Print results•Each step transforms the data completely.每⼀步完全转换数据•Intermediate data stored in shared memory.–Arrays of characters with indexes带索引的字符数组–Relies on sequential processing串⾏处理Solution 1:Modularization•Module 1: Input–Reads data lines and stores them in “core”.–Storage format: 4 chars/machine word; array of pointers to start of each line.–•Module 2: Circular Shift–Called after Input is done.–Reads line storage to produce new array of pairs: (index of 1st char of each circular shift, index of original line)–•Module 3: Alphabetize–Called after Circular Shift.–Reads the two arrays and produces new index.•Module 4: Output–Called after alphabetization and prints nicely formatted output of shifts–Reads arrays produced by Modules 1 & 3–•Module 5: Master Control–Handles sequencing of the first 4 modules–Handles errorsProperties of Solution 1•Batch sequential processing.•Uses shared data to get good performance.⽤共享数据获得性能•Processing phases handled by control module.–So has some characteristics of main program – subroutine organization.–Depends critically on single thread of control.•Shared data structures exposed as inter-module knowledge.共享数据的结构是所有模块必须知道的–Design of these structures must be worked out before work can begin on those modules. 数据结构的设计必须在其他模块设计开始之前进⾏⽅案优缺点:+系统⾃然分解,符合⼈的处理习惯+数据共享,处理效率⾼+–难以适应数据存储格式和整体处理算法的变化——爲什麽?–系统构件难以⽀持复⽤——爲什麽?仔细参考:。

分析比较KWIC系统实现四种不同体系结构风格

分析比较KWIC系统实现四种不同体系结构风格

分析比较KWIC系统实现四种不同体系结构风格:班级:学号:院系:一、实验目的 (3)二、实验容 (3)三、实验要求与实验环境 (3)四、实验操作 (3)1数据流风格:批处理序列;管道/过滤器 (3)2采用调用/返回风格:主程序/子程序、面向对象风格、层次结构 (4)3仓库风格:数据库系统、超文本系统、黑板系统 (5)4独立构件风格:进程通讯、事件系统 (5)五实验总结 (6)一、实验目的通过KWIC 实例分析,理解和掌握软件体系结构风格设计与实现。

二、实验容多种软件风格设计与实现KWIC 实例:1.采用主/子程序体系结构风格实现KWIC 关键词索引系统2.采用面向对象体系架构风格实现KWIC 关键词索引系统3.采用管道过滤体系架构风格实现KWIC 关键词索引系统4.采用事件过程调用体系架构风格实现KWIC 关键词索引系统三、实验要求与实验环境熟练掌握基于主/子程序体系结构风格的KWIC 关键词索引系统,在此基础上,完成基于面向对象体系架构风格的KWIC 关键词索引系统设计与实现。

选做基于管道过滤体系架构风格的KWIC 关键词索引系统;选做基于事件过程调用体系架构风格的KWIC 关键词索引系统。

四、实验操作1数据流风格:批处理序列;管道/过滤器管道-过滤器风格将系统的功能逻辑建立为部件集合。

每个部件实例完成一个对数据流的独立功能处理,它接收数据流输入,进行转换和增量后进行数据流输出。

连接件是管道机制,它将前一个过滤器的数据流输出传递给后一个过滤器作为数据流输入。

连接件也可能会进行数据流的功能处理,进行转换或增量,但连接件进行功能处理的目的是为了适配前一个过滤器的输出和后一个过滤器的输入,而不是为了直接承载软件系统的需求。

各个过滤器可以并发执行。

每个过滤器都可以在数据输入不完备的情况下就开始进行处理,每次接到一部分数据流输入就处理和产生一部分输出。

这样,整个的过滤器网络就形成了一条流水线。

设计词汇表:Pipe, Filter构件和连接件类型构件:Filter连接件:Pipe例子:传统编译器优缺点:优点:易于理解并支持变换的复用。

软件体系结构实验报告

软件体系结构实验报告

学生实验报告(理工类)课程名称:软件体系结构专业班级:13软件工程2班学生学号: 69 学生姓名:管东升所属院部:软件工程学院指导教师:陈圣国20 15 ——20 16 学年第 1 学期金陵科技学院教务处制实验报告书写要求实验报告原则上要求学生手写,要求书写工整。

若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。

纸张一律采用A4的纸张。

实验报告书写说明实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。

各院部可根据学科特点和实验具体要求增加项目。

填写注意事项(1)细致观察,及时、准确、如实记录。

(2)准确说明,层次清晰。

(3)尽量采用专用术语来说明事物。

(4)外文、符号、公式要准确,应使用统一规定的名词和符号。

(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。

实验报告批改说明实验报告的批改要及时、认真、仔细,一律用红色笔批改。

实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。

实验报告装订要求实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。

实验项目名称:经典软件体系结构风格实验学时: 4学时同组学生姓名:实验地点: 1216 实验日期:实验成绩:批改教师:批改时间:一、实验目的和要求(1)理解管道-过滤器软件体系结构、面向对象软件体系结构的原理(2)掌握管道-过滤器软件体系结构、面向对象软件体系结构特点(3)面向对象软件体系结构的编程实现二、实验仪器和设备奔腾以上计算机,Windows 10 、Visual Studio 2013、MySQL三、实验过程(1)在dos下体会管道过滤器的体系结构。

使用 dir | more 命令了解管道-过滤器风格的程序。

(2)数据抽象和面向对象软件体系结构设计实现。

设计一个应用程序,在该程序定义平面图形的抽象类和其派生类圆、矩形、三角形,椭圆。

【精品实验报告】软件体系结构设计模式实验报告

【精品实验报告】软件体系结构设计模式实验报告

【精品实验报告】软件体系结构设计模式实验报告软件体系结构设计模式实验报告学生姓名: 所在学院: 学生学号: 学生班级: 指导老师: 完成日期:一、实验目的熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的设计模式,包括组合模式、外观模式、代理模式、观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。

二、实验内容使用PowerDesigner和任意一种面向对象编程语言实现组合模式、外观模式、代理模式、观察者模式和策略模式,包括根据实例绘制模式结构图、编写模式实例实现代码,运行并测试模式实例代码。

(1) 组合模式使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。

绘制类图并编程模拟实现。

(2) 组合模式某教育机构组织结构如下图所示:北京总部教务办公室湖南分校行政办公室教务办公室长沙教学点湘潭教学点行政办公室教务办公室行政办公室教务办公室行政办公室在该教育机构的OA系统中可以给各级办公室下发公文,现采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。

(注:可以定义一个办公室类为抽象叶子构件类,再将教务办公室和行政办公室作为其子类;可以定义一个教学机构类为抽象容器构件类,将总部、分校和教学点作为其子类。

)(3) 外观模式某系统需要提供一个文件加密模块,加密流程包括三个操作,分别是读取源文件、加密、保存加密之后的文件。

读取文件和保存文件使用流来实现,这三个操作相对独立,其业务代码封装在三个不同的类中。

现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作,而不需要与每一个类进行交互,使用外观模式设计该加密模块,要求编程模拟实现。

分析比较KWIC系统实现四种不同体系结构风格

分析比较KWIC系统实现四种不同体系结构风格

分析比较KWIC系统实现四种不同体系结构风格KWIC系统(Keyword in Context)是一种文本处理系统,它通过对输入的文本进行预处理,将每个单词的关键字移到字母表序的最前面,从而方便用户查找和理解文本。

在实现KWIC系统的过程中,可以采用不同的体系结构风格。

本文将分析和比较KWIC系统实现的四种不同体系结构风格。

1.面向过程风格:面向过程风格是一种传统的体系结构风格,它以功能为中心,通过一系列的子程序来实现系统的功能。

在KWIC系统中,面向过程风格可以将各个功能模块划分为不同的子程序,如输入模块、处理模块和输出模块。

输入模块负责读取文本数据,处理模块负责对文本数据进行预处理,输出模块负责将处理后的文本数据进行显示或存储。

面向过程风格的优点是结构清晰,易于理解和维护。

然而,面向过程风格缺乏灵活性和可重用性,随着系统功能的扩展和变化,其复杂性和维护成本会增加。

2.面向对象风格:面向对象风格是一种基于对象和类的体系结构风格,它将系统划分为多个对象,每个对象都具有属性和方法。

在KWIC系统中,面向对象风格可以将输入、处理和输出等功能划分为不同的对象,对象之间通过消息传递来实现协作。

输入对象负责读取文本数据,处理对象负责对文本数据进行预处理,输出对象负责将处理后的文本数据进行显示或存储。

面向对象风格的优点是可重用性和灵活性强,易于扩展和维护。

然而,面向对象风格的缺点是易于产生过度设计和过度集成的问题,增加系统的复杂性和开发成本。

3.数据流风格:数据流风格是一种基于数据流和处理器之间的依赖关系的体系结构风格,它将系统看作一系列的数据流和处理器。

在KWIC系统中,数据流风格可以将输入、处理和输出等功能看作数据流,并将数据流之间的依赖关系表示为处理器的输入和输出。

处理器负责对输入的数据流进行处理,生成输出的数据流。

数据流风格的优点是模块化和并行化程度高,易于理解和调试。

然而,数据流风格的缺点是系统结构复杂,难以维护和扩展。

《软件体系结构》实验指导书解读

《软件体系结构》实验指导书解读

前言软件体系结构课程是计算机科学与技术本科专业的一门重要的专业课.通过本课程的学习,使学生在已有的计算机软硬件基础知识、程序设计知识、数据库和网络通信知识的基础上系统掌握面向对象系统分析与设计的基本方法和技术,并具有针对特定环境下的应用问题进行信息系统开发(包括系统分析,设计与实现)的能力。

通过学习本课程学生可以理解和掌握软件体系结构的分析和设计方法,掌握面向对象系统分析和设计的建模标准UML语言,能够利用Rational Rose(或Microsoft Viso)软件以某一信息系统为例进行系统分析和设计。

本课程主要介绍系统原理的基本概念、系统开发过程RUP、对面向对象分析和面向对象设计的方法、对面向对象分析和设计的建模标准UML等内容。

通过本课程的学习,学生掌握的知识、内容及掌握的程度要求为:1. 使学生理解面向对象的信息系统的开发过程、系统分析和设计的原则和方法;2. 使学生掌握UML语言的基础知识,以及UML在面向对象的软件系统分析和设计中的应用,并能使用UML工具建立系统模型;3. 使学生掌握在UML系统模型下应用高级语言建立应用系统的方法;4. 通过案例教学和实验,提高学生在应用面向对象技术开发软件方面的动手能力和解决问题的能力,并鼓励创新。

本实验所要求的建模工具为Rational Rose 2003。

目录实验一用例图及进度安排 (3)实验二活动图 (8)实验三状态图 (16)实验四类 (23)实验五类的关系 (29)实验六交互图 (33)实验七对象图和包 (42)实验八组件图和配置图 (44)实验九正向工程 (51)实验一用例图及进度安排一、实验目的1.熟悉用例图的基本功能和使用方法。

2.掌握如何使用建模工具绘制用例图方法。

3.学习使用Microsoft Project对题目进行进度安排。

二、实验器材1.计算机一台。

2.Rational Rose 工具软件。

三、实验内容根据实例,如“图书馆管理系统”开发进度,在完成对系统的需求建模,得到用例模型后,应针对每个用例进行业务分析,说明其具体的业务流程,现系统分析部指派您完成该项任务。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《软件体系结构》实验:软件体系结构风格之应用一、实验目的通过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)将系统组织成层次结构,包括一个主程序和一系列子程序。

主程序是系统的控制器,负责调度各子程序的执行。

各子程序又是一个局部的控制器,调度其子程序的执行。

设计词汇表:主程序main(), 子程序 shift(), sort() 方法,方法的调用,返回构件和连接件类型:构件:各类子程序,如shift(),sort()连接件:方法的调用基本的计算模型:子程序有shift(), sort()方法,shift() 对单词进行移位,sort()方法对单词进行排序风格的基本不变性:主程序有顺序地调用子程序,单线程控制。

KWIC 的主/子程序体系结构风格示意图如下所示:主程序/子程序风格的重要设计决策与约束有:●基于声明-使用(程序调用)关系建立连接件,以层次分解的方式建立系统部件,共同组成层次结构。

●每一个上层部件可以“使用”下层部件,但下层部件不能“使用”上层部件,即不允许逆方向调用。

●系统应该是单线程执行。

主程序部件拥有最初的执行控制权,并在“使用”中将控制权转移给下层子程序。

●子程序只能够通过上层转移来获得控制权,可以在执行中将控制权转交给下层的子子程序,并在自身执行完成之后必须将控制权还交给上层部件。

KWIC 主程序/子程序风格的Java 语言实现见附件。

主程序/子程序风格的主要实现机制是模块实现,它将每个子程序都实现为一个模块,主程序实现为整个系统的起始模块。

依照抽象规格的层次关系,实现模块也被组织为相应的层次机构,通过导入/导出关系相连接。

需要强调的是,虽然主程序/子程序风格非常类似于结构化程序的结构,但是主程序/子程序风格是基于部件与连接件建立的高层结构。

它的部件不同于程序,而是更加粗粒度的模块。

而且,在部件的实现模块部,可以使用结构化方法,也可以使用面向对象方法,这并不妨碍整个系统的高层结构符合主程序/子程序风格的约定。

主程序/子程序风格的优点有:流程清晰,易于理解。

强控制性。

严格的层次分解和严格的控制权转移使得主程序/子程序风格对程序的实际执行过程具备很强的控制能力,这带来了一个特点:如果一个子程序所连接的子子程序是正确的,那么就很容易保证该子程序的“正确性”。

所以,主程序/子程序风格比其他常见风格更能控制程序的“正确性”。

2、采用面向对象体系结构风格实现KWIC 关键词索引系统面向对象式风格,需要强调说明的是它的“对象”是部件,属于高层结构的元素,虽然名称相同,但它并不是面向对象方法中所述的“对象”实体。

“面向对象式”风格的命名是因为它借鉴了面向对象方法的思想,而不是因为它使用面向对象方法实现体系结构,这也是在该风格名称中有一个“式”字的原因。

面向对象式风格的主要实现机制是模块实现,它将每个对象部件实例都实现为一个模块。

存在连接的对象部件实例之间会存在模块的导入/导出关系。

每个模块部可以是基于面向对象方法的实现,也可以是基于结构化方法的实现。

设计词汇表:(1)input, output, shift, sort, main 类(2)shift, sort, output 对象(3)对象间的消息传递构件和连接件类型:(1)构件类型:对象(2)连接件的类型:为对象间的消息传递KWIC 的面向对象程序体系结构风格示意图如下所示:基本的计算模型:Input 模块从文本文件input.txt 中一行一行读取单Shift 模块用于将单词移位。

Sort模块将单词进行排序。

Output 模块将最终结果写到文本文件output.txt 中KWIC 面向对象风格的Java 语言实现见附件。

面向对象式风格的优点有:部实现的可修改性。

因为面向对象式风格要求封装部数据,隐藏部实现,所以它可以在不影响外界的情况下,变更其部实现。

易开发、易理解、易复用的结构组织。

面向对象式风格将系统组织为一系列平等、自治的单位,每个单位负责自身的“正确性”,不同单位之间仅仅是通过方法调用相连接,这非常契合模块化思想,能够建立一个易开发、易理解、易复用的实现结构。

3、采用管道和过滤器体系结构风格实现KWIC 关键词索引系统管道-过滤器风格将系统的功能逻辑建立为部件集合。

每个部件实例完成一个对数据流的独立功能处理,它接收数据流输入,进行转换和增量后进行数据流输出。

连接件是管道机制,它将前一个过滤器的数据流输出传递给后一个过滤器作为数据流输入。

连接件也可能会进行数据流的功能处理,进行转换或增量,但连接件进行功能处理的目的为了适配前一个过滤器的输出和后一个过滤器的输入,而不是为了直接承载软件系统的需求。

各个过滤器可以并发执行。

每个过滤器都可以在数据输入不完备的情况下就开始进行处理,每次接到一部分数据流输入就处理和产生一部分输出。

这样,整个的过滤器网络就形成了一条流水线。

设计词汇表:Pipe, Filter构件和连接件类型构件:Filter连接件:Pipe KWIC 的管道过滤器体系结构风格示意图如下所示:基本的计算模型:过滤器读管道输出流,过滤器写管道输入流,过滤器通过对输入流的增量计算来完成风格的基本不变性:过滤器是独立的实体,它们之间通过管道传递数据管道-过滤器风格可以为所有过滤器部件实例建立模块实现,每个过滤器部件实例被实 现为一个单独的模块,可以为所有简单的管道连接件建立一个通用的模块实现,为每个复杂的管道连接件建立一个单独的模块实现,相关联过滤器部件的实现模块要导入管道实现模块。

因为管道-过滤器风格需要并发执行,所以管道-过滤器风格需要为所有过滤器部件实例和复杂连接件实例建立进程实现,每个过滤器部件实例和复杂连接件实例被实现为一个进程。

input output Shifting sorting Input mediumFilter Pipe System I/O如果操作系统能够提供管道机制,那么进程实现时的简单管道可以利用操作系统提供的机制来实现。

此时,所有的实现进程都需要部署在同一个物理节点。

如果有中间件平台能够提供管道机制,那么进程实现时的简单管道可以利用中间件平台提供的机制来实现。

此时,各个实现进程可以被部署在不同的网络节点。

KWIC 基于管道过滤器风格的JAVA 语言实现见附件。

实验结果:输入文件:输出文件:五、实验总结通过本次实验认识到软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。

软件体系结构设计的一个核心问题是能否使用重复的体系结构模式,即能达到体系结构级的软件重用。

也就是说,能否在不同的软件系统中,使用同一体系结构。

主/子程序体系结构风格、面向对象体系架构风格、管道过滤体系架构风格、用事件过程调用体系架构风格是四种常用的软件体系结构风格,对于实现同一种功能的软件可以分别采用以上的这四种风格。

在建立体系结构过程中,不断明确设计词汇表、构建和连接件的类型、可容许的结构模式、基本的计算类型、风格的基本不变形、常用例子、优缺点。

通过明确这些问题,可以理解一种体系结构的基本特征,从而为实现体系结构重用提供可能。

通过对KWIC 进行建模和实现,让我动手把简单的软件体系结构代码实现,在程序里体现体系结构的基本思想,拓展了数据结构的基本知识,将软件设计思想体现在编码环节,为以后的体系结构设计提供基础。

KWIC 主程序/子程序风格的Java 语言实现:public static void alphabetize(){String[] tmpArray = new String[shiftedLineIndexes.size()];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(inti=0;i<sortedLineIndexes.length;i++){try {bw.write(sortedLineIndexes[i]); bw.newLine();} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace(); }}try {bw.close();} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace(); }}public static void Input(StringiFile){ FileReader fr=null; try{ fr=new FileReader(iFile);} catch (FileNotFoundException e) { e.printStackTrace(); }BufferedReader br=new BufferedReader(fr); textLines=new ArrayList<String>();try { while(br.ready()){textLines.add(br.readLine());}} catch (IOException e) { e.printStackTrace();}}public static voidCircularShift(){ shiftedLineIndexes=newArrayList<String>(); for(inti=0;i<textLines.size();i++){ StringorinLine=textLines.get(i); Stringsarray[]=orinLine.split(" "); for(intj=0;j<sarray.length;j++){ StringnewLine=sarray[j]; if(sarray.length>1){if(j==sarray.length-1){for(int k=0;k<(sarray.length-1);k++){newLine=newLine+" "+sarray[k];}}else{for(int k=j+1;k<sarray.length;k++){newLine=newLine+" "+sarray[k];}for(int m=0;m<j;m++){ newLine=newLine+" "+sarray[m];}}}shiftedLineIndexes.add(newLine);} } }KWIC 面向对象风格的Java 语言实现://InputStore.java importjava.io.BufferedReader; importjava.io.FileNotFoundException; importjava.io.FileReader; importjava.io.IOException; importjava.util.ArrayList; public classInputStore { publicArrayList<String> ls;public InputStore(ArrayList<String> ls){ this.ls=ls; }public void input(StringinputFile){ FileReader fr=null;try {fr=new FileReader(inputFile); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace();}BufferedReader br=new BufferedReader(fr);try { while(br.ready()){ls.add(br.readLine());}} catch (IOException e) { // TODOAuto-generated catch blocke.printStackTrace();}}} //Output.java importjava.io.BufferedWriter; importjava.io.FileWriter; importjava.io.IOException; importjava.util.ArrayList; publicclass Output { publicArrayList<String> ls;public Output(ArrayList<String> ls){ this.ls=ls; }public void output(String outputAddress){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<ls.size();i++){try {bw.write(ls.get(i)); bw.newLine();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}try {bw.close();} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}}}//Alphabetizer.java importjava.util.ArrayList; import java.util.Arrays;public class Alphabetizer { publicArrayList<String> ls; publicAlphabetizer(ArrayList<String>ls){ this.ls=ls;}public void alpha(){String[] tmpArray = new String[ls.size()];ls.toArray(tmpArray);Arrays.sort(tmpArray);for(inti=0;i<ls.size();i++){ ls.set(i, tmpArray[i]);}}}//CircularShifter.java importjava.util.ArrayList; public classCircularShifter { public ArrayList<String> ls;public CircularShifter(ArrayList<String>ls){ this.ls=ls;}public void shift(){ArrayList<String> shiftedLineIndexes=new ArrayList<String>(); for(int i=0;i<ls.size();i++){String orinLine=ls.get(i); String sarray[]=orinLine.split(" "); for(int j=0;j<sarray.length;j++){ String newLine=sarray[j];if(sarray.length>1){ if(j==sarray.length-1){ for(intk=0;k<(sarray.length-1);k++){newLine=newLine+" "+sarray[k];}}else{for(int k=j+1;k<sarray.length;k++){newLine=newLine+" "+sarray[k];}for(int m=0;m<j;m++){ newLine=newLine+""+sarray[m];}}}shiftedLineIndexes.add(newLine);}}ls=shiftedLineIndexes;}}//Main.java importjava.util.ArrayList; publicclass Main {public static void main(String[] args) {// TODO Auto-generated method stubArrayList<String>ls=new ArrayList<String>();InputStore inputStore=new InputStore(ls);inputStore.input("input.txt");CircularShifter cs=new CircularShifter(ls);cs.shift();Alphabetizer alp=new Alphabetizer(cs.ls);alp.alpha();Output output=new Output(alp.ls);output.output("output.txt");}}KWIC 基于管道过滤器风格的JAVA 语言实现//Main类 packagekwic_pipe; importjava.io.File; importjava.util.Scanner;public class Main { public static voidmain(String[] args) { File infile = newFile("e:\\mykwic_in.txt");File outfile = new File("e:\\mykwic_out.txt");Scanner inputfile; Scanneroutputfile;try{ inputfile = newScanner(infile); outputfile =new Scanner(outfile); // 定义三个管道Pipe pipe1 = new Pipe();Pipe pipe2 = new Pipe();Pipe pipe3 = new Pipe();// 定义四种过滤器Input input = new Input(infile, pipe1); Shift shift = new Shift(pipe1, pipe2);Output output = new Output(pipe3, outfile);// 启动四种过滤器的线程input.transform()shift. transform ();output. transform ();// 直接输出结果System.out.println("----- infile -----"); String str = null; while (inputfile.hasNextLine()){ str = inputfile.nextLine();System.out.println(str);}System.out.println("input end");Thread.sleep(3000);System.out.println("----- outfile -----"); while (outputfile.hasNextLine()){ System.out.println(str);}inputfile.close();outputfile.close();} catch(Exceptione){ e.getMessage();}}}//Filter类 package kwic_pipe;import java.io.IOException;public abstract class Filter {//定义输入管道protected Pipe input; //定义输出管道 protected Pipe output;private boolean isStart = false;Filter(Pipe input, Pipeoutput){ this.input = input;this.output = output;}// 防止多次调用,调用之后线程开始执行public voidstart(){ if(!isStart){isStart = true;Thread thread = new Thread(); thread.start();}}//线程的 run 方法public voidrun(){ try{this.transform(); }catch (IOExceptione){ e.getMessage();}}//将输入数据转换为所需数据并写入输出管道//由子类实现抽象方法protected abstract void transform()throws IOException;}Pipe类package kwic_pipe;import java.io.IOException;import java.io.PipedReader;import java.io.PipedWriter;import java.io.PrintWriter;import java.util.Scanner;public class Pipe {//输入管道private Scanner pipereader;//输出管道private PrintWriter pipewriter;public Pipe(){PipedWriter pw = new PipedWriter();PipedReader pr = new PipedReader();try{pw.connect(pr);} catch (IOException e){ e.getMessage();}pipewriter = new PrintWriter(pw);pipereader = new Scanner(pr);}//读入一行数据到管道//return 读入的数据public String readerLine() throwsIOException{ return pipereader.nextLine();}//从管道输出一行数据public void writerLine(String strline) throwsIOException{ pipewriter.println(strline);}//将读管道关闭,调用该方法后,不能再从管道中读数据//如不能关闭则抛出异public void closeReader() throwsIOException{ pipereader.close();}//先刷新数据,在将写管道关闭,调用该方法后,不能向管道中写数据//如不能关闭则抛出异常public void closeWriter() throwsIOException{ pipewriter.flush(); pipewriter.close();}} Alphabetizer类package kwic_pipe;import java.io.IOException; importjava.util.ArrayList; importjava.util.Collections; public classAlphabetizer extends Filter{private ArrayList<String> al = new ArrayList<String>();Alphabetizer(Pipe input, Pipeoutput){ super(input, output);}//对读入的数据进行排序protected void transform() throws IOException {String templine = null;//读入数据while((templine = input.readerLine()) !=null){ al.add(templine);}//按字母表排序Collections.sort(al);//对排序后的数据进行输出for(int i = 0; i < al.size();i++){ output.writerLine(al.get(i));}input.closeReader();output.closeWriter();}} Shift类 packagekwic_pipe;import java.io.IOException; importjava.util.ArrayList; public classShift extends Filter{//单词的列表private ArrayList<String> wordlist = new ArrayList<String>(); //重组后的行的列表private ArrayList<String> linelist = new ArrayList<String>();Shift(Pipe input, Pipeoutput){ super(input, output);}Overrideprotected void transform() throws IOException {String templine = "";//读数据while((templine = input.readerLine()) != null){//将数据拆分为不同单词this.lineSplitWord(templine);//将单词重组为句子this.recombination();//输出重组结果for(int i = 0; i < linelist.size();i++){ output.writerLine(linelist.get(i)); }//清空wordlist、linelist和templinewordlist.clear();linelist.clear();templine = "";}input.closeReader();output.closeWriter();}//从一行中提取单词存入单词表中private void lineSplitWord(String line){String word = ""; inti = 0; while(i <line.length()){ if(line.charAt(i) != ''){ word +=line.charAt(i);}else{ wordlist.add(word);}i++;}}private void recombination(){for(int j = 0; j < wordlist.size(); j++){ String templine = ""; for (int k = wordlist.size() - 1 - j; k < wordlist.size(); k++){ templine += wordlist.get(k) + " "; } for (int m = 0; m < wordlist.size()- 1 - j; m++){ if(m != wordlist.size() - j -2){ templine += wordlist.get(m) + " ";}else{ templine +=wordlist.get(m);}}linelist.add(templine);}}}Input类 packagekwic_pipe;import java.io.File;import java.io.IOException;import java.util.Scanner;public class Input extends Filter{//输入文件的文件名private File infile;Input(File file, Pipeoutput){ super(null,output); this.infile =file;}Override //读取数据protected void transform() throws IOException {Scanner sc = new Scanner(infile); String templine = ""; while((templine =sc.nextLine()) !=null){ output.writerLine(templine);}output.closeWriter();sc.close();}}Output类 package kwic_pipe;import java.io.File; importjava.io.IOException; importjava.io.PrintWriter;public class Output extendsFilter{//输出文件的文件名private File file;Output(Pipe input, Filefile){ super(input, null);this.file = file;}//输出数据protected void transform() throws IOException {PrintWriter pw = new PrintWriter(file); String templine = "";while((templine = input.readerLine()) !=null){ pw.write(templine); pw.write("\n");}pw.flush();pw.close();input.closeReader();}}。

相关文档
最新文档