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

简介: 作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ KWIC作为一个早年间在ACM的Paper提出的一个问题,被全世界各个大学的软件设计课程奉为课堂讲义或者作业的经典。

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

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/


               作者:gnuhpc
               出处:http://www.cnblogs.com/gnuhpc/
               除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


分享到:

目录
相关文章
|
8天前
|
存储 Java
【编程基础知识】 分析学生成绩:用Java二维数组存储与输出
本文介绍如何使用Java二维数组存储和处理多个学生的各科成绩,包括成绩的输入、存储及格式化输出,适合初学者实践Java基础知识。
37 1
|
1月前
|
缓存 JavaScript Java
常见java OOM异常分析排查思路分析
Java虚拟机(JVM)遇到内存不足时会抛出OutOfMemoryError(OOM)异常。常见OOM情况包括:1) **Java堆空间不足**:大量对象未被及时回收或内存泄漏;2) **线程栈空间不足**:递归过深或大量线程创建;3) **方法区溢出**:类信息过多,如CGLib代理类生成过多;4) **本机内存不足**:JNI调用消耗大量内存;5) **GC造成的内存不足**:频繁GC但效果不佳。解决方法包括调整JVM参数(如-Xmx、-Xss)、优化代码及使用高效垃圾回收器。
119 15
常见java OOM异常分析排查思路分析
|
8天前
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
9 1
|
8天前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
21 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
11天前
|
Java
如何从Java字节码角度分析问题|8月更文挑战
如何从Java字节码角度分析问题|8月更文挑战
|
17天前
|
安全 网络协议 Java
Java反序列化漏洞与URLDNS利用链分析
Java反序列化漏洞与URLDNS利用链分析
35 3
|
1月前
|
缓存 JavaScript Java
常见java OOM异常分析排查思路分析
Java虚拟机(JVM)遇到 OutOfMemoryError(OOM)表示内存资源不足。常见OOM情况包括:1) **Java堆空间不足**:内存被大量对象占用且未及时回收,或内存泄漏;解决方法包括调整JVM堆内存大小、优化代码及修复内存泄漏。2) **线程栈空间不足**:单线程栈帧过大或频繁创建线程;可通过优化代码或调整-Xss参数解决。3) **方法区溢出**:运行时生成大量类导致方法区满载;需调整元空间大小或优化类加载机制。4) **本机内存不足**:JNI调用或内存泄漏引起;需检查并优化本机代码。5) **GC造成的内存不足**:频繁GC但效果不佳;需优化JVM参数、代码及垃圾回收器
常见java OOM异常分析排查思路分析
|
1月前
|
Java
JAVA并发编程系列(9)CyclicBarrier循环屏障原理分析
本文介绍了拼多多面试中的模拟拼团问题,通过使用 `CyclicBarrier` 实现了多人拼团成功后提交订单并支付的功能。与之前的 `CountDownLatch` 方法不同,`CyclicBarrier` 能够确保所有线程到达屏障点后继续执行,并且屏障可重复使用。文章详细解析了 `CyclicBarrier` 的核心原理及使用方法,并通过代码示例展示了其工作流程。最后,文章还提供了 `CyclicBarrier` 的源码分析,帮助读者深入理解其实现机制。
|
1月前
|
安全 Java API
Java线程池原理与锁机制分析
综上所述,Java线程池和锁机制是并发编程中极其重要的两个部分。线程池主要用于管理线程的生命周期和执行并发任务,而锁机制则用于保障线程安全和防止数据的并发错误。它们深入地结合在一起,成为Java高效并发编程实践中的关键要素。
24 0
|
2月前
|
存储 消息中间件 监控
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统ELK、日志收集分析
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统、日志收集分析。日志级别从小到大的关系(优先级从低到高): ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 低级别的会输出高级别的信息,高级别的不会输出低级别的信息