【Java习作】KWIC的分析和解决

简介:

KWIC作为一个早年间在ACM的Paper提出的一个问题,被全世界各个大学的软件设计课程奉为课堂讲义或者作业的经典。(From Wiki,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

1.问题描述

设计并实现一个软件系统。要求如下:

主要功能如下图所示:

clip_image002

该软件系统由命令行指定要进行处理的英文文本文件(.txt)的目录和文件名以及输出结果文件的目录和文件名。

 

2.解决方案:

a.面向过程方案:

见我以前的一篇:http://blog.csdn.net/gnuhpc/archive/2009/10/03/4629466.aspx

评价:这种是最简陋的实现,可扩展性不强,不过程序倒也简单明了。

b.基本面向对象方案:

该方案是个基本的面向对象方案,有四个基本功能类:input, shift, alphabetize 和 output,将这些功能在主程序中串联起来,通过共享数据的方式组成整个系统。

流程很简单,首先通过input类设定文件输入输出路径并且读入要处理的文件,接着使用shift进行移位操作,得到一行行的结果,此时再采用alphabetizer对这些行进行首字母排序,最后采用output类输出。

设计了一个Kwic类对上述类进行整合。提供代码:

http://cid-a0a0b50959052db4.skydrive.live.com/self.aspx/.Public/KWIC^_Routine.zip

评价:将各个功能模块分开设计,并且利用权限控制保证了封装的特性,系统的扩展性和封装性增强。

c.基于事件通知的方案:

基于事件通知的系统中的各个功能并不是直接被调用的,而是通过组建通知或广播事件信息而触发的。其他组件可以通过注册一个与某个事件通知相关联的过程而与其发生联系。例如,我们的IDE就是一个典型的这样的系统,编辑器和变量监视器与调试器的断点功能相联系,当调试器停留在某一个断点的时候,它就会自动去通知与其注册的组件,去定位代码或者观察变量的取值。

一般这样的方案有两种设计,一个是系统有一个分立出来的事件中心,专门负责接收所有传来的信息,并且将它们分发给系统的其他组件,它可以是广播,可以是针对某些特定事件而设定特定的反应。

这常被称为:Publish/Subscribe,如下图

dispatcher

一种方案不设置一个集权的事件中心,每个模块允许其他模块在他们发送的消息中声明他们需要干什么,这样每次模块发送的消息都只发送给对这个事件感兴趣的模块去,而无需发送到事件中心。

这常被称为:Observable/Observer,如下图

observer

在KWIC这个系统中,我们如此实现这个基于事件的系统:

arch

  • 两个行存储模块,第一个行存储模块负责存储所有原先的行,第二个行存储模块负责存储所以循环移位后的模块。 输入模块负责设定路径并且从输入文件中读入并且存储到第一个行存储模块中。 循环移位模块负责循环移位并且存储在第二个行存储模块。输出模块负责输出到文件,主控模块负责主控流程。添加一行到第一个行存储模块就触发了一个事件向循环移位模块发送,循环移位模块会根据这个事件对这一行就行处理,存储到第二个行存储模块,这就会另一个事件发送到排序模块,模块会把新加进来的行与旧行进行混合然后排序。
  • 实现的是Observable/Observers模式,其中的事件互动有两部分:

移位循环模块和第一个行存储模块注册。移位模块是第一个行存储模块的观察者。

排序模块注册和第二个行存储模块注册。排序模块是第二个行存储模块的观察者。

Java对这样的模式提供Observable 类和Observer接口,

class

在java.util中的Observer接口为观察者提供了方便,只有一个方法需要实现:update。这个方法在当接到事件时被触发。

在java.util中的Observable类为发送事件的类提供了方便,我们可以通过继承而是用其提供了其他类向观察者注册的方法。

d.基于管道的方案

在基于管道的方案中,每个组件都会有一组输入流和一组输出流,一个组件读入,然后处理后送出到下一个组件上。这个组件一般称为filter。连接器则称为pipes。filter之间不能有数据共享,并且彼此相互独立。最有名的类似的程序就是Unix的Shell了。

KWIC

 

KWIC Pipeline

http://cid-a0a0b50959052db4.skydrive.live.com/self.aspx/.Public/kwic^_pipe.zip

 




本文转自gnuhpc博客园博客,原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/12/17/2822368.html,如需转载请自行联系原作者

相关文章
|
2月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
233 1
|
2月前
|
存储 Java Go
【Java】(3)8种基本数据类型的分析、数据类型转换规则、转义字符的列举
牢记类型转换规则在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!
209 2
|
3月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
4月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
165 4
|
4月前
|
机器学习/深度学习 安全 Java
Java 大视界 -- Java 大数据在智能金融反洗钱监测与交易异常分析中的应用(224)
本文探讨 Java 大数据在智能金融反洗钱监测与交易异常分析中的应用,介绍其在数据处理、机器学习建模、实战案例及安全隐私等方面的技术方案与挑战,展现 Java 在金融风控中的强大能力。
|
5月前
|
存储 Java 大数据
Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用(198)
简介:本文探讨Java大数据技术在智能家居能源消耗分析与节能策略中的应用。通过数据采集、存储与智能分析,构建能耗模型,挖掘用电模式,制定设备调度策略,实现节能目标。结合实际案例,展示Java大数据在智能家居节能中的关键作用。
|
6月前
|
数据采集 搜索推荐 算法
Java 大视界 -- Java 大数据在智能教育学习社区用户互动分析与社区活跃度提升中的应用(274)
本文系统阐述 Java 大数据技术在智能教育学习社区中的深度应用,涵盖数据采集架构、核心分析算法、活跃度提升策略及前沿技术探索,为教育数字化转型提供完整技术解决方案。
|
6月前
|
Java 数据库连接 API
互联网大厂校招 JAVA 工程师笔试题解析及常见考点分析
本文深入解析互联网大厂校招Java工程师笔试题,涵盖基础知识(数据类型、流程控制)、面向对象编程(类与对象、继承与多态)、数据结构与算法(数组、链表、排序算法)、异常处理、集合框架、Java 8+新特性(Lambda表达式、Stream API)、多线程与并发、IO与NIO、数据库操作(JDBC、ORM框架MyBatis)及Spring框架基础(IoC、DI、AOP)。通过技术方案讲解与实例演示,助你掌握核心考点,提升解题能力。
271 2
|
传感器 分布式计算 安全
Java 大视界 -- Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)
本文围绕 Java 大数据在智能安防入侵检测系统中的应用展开,剖析系统现状与挑战,阐释多源数据融合及分析技术,结合案例与代码给出实操方案,提升入侵检测效能。
|
7月前
|
缓存 安全 Java
【高薪程序员必看】万字长文拆解Java并发编程!(3-1):并发共享问题的解决与分析
活锁:多个线程相互影响对方退出同步代码块的条件而导致线程一直运行的情况。例如,线程1的退出条件是count=5,而线程2和线程3在其代码块中不断地是count进行自增自减的操作,导致线程1永远运行。内存一致性问题:由于JIT即时编译器对缓存的优化和指令重排等造成的内存可见性和有序性问题,可以通过synchronized,volatile,并发集合类等机制来解决。这里的线程安全是指,多个线程调用它们同一个实例的方法时,是线程安全的,但仅仅能保证当前调用的方法是线程安全的,不同方法之间是线程不安全的。
142 0