昨天对抄书练手的两个lucene使用的例子进行了重构,利用接口设计提高了应对用户需求变化或可快速构建新的代码。今天对代码再进行了审视,又发现接口的设计并没有遵循keep it simple原则,也没有满足SRP原则,每次新的搜索类实现此接口来完成新的索引类型所有功能,而搜索功能的实现可能相同,但也得对这一代码进行重复;当有新的搜索功能需求,索引功能的实现也可能相同,也得对相同的代码进行重复。有两个不同的变化因数的不同组合可能带来代码的重复,因此有必要对代码进行再次重构。为了满足SRP和保持接口的简洁,得对此接口进行再次抽象分离。
1)设计如图1
通过两个独立接口分别来适应各自的变化,岂不是可以解决这个问题,呵呵,没有错,可以。接下来要完成昨天那个完整的功能(索引与搜索),是不是就如上图所示,采用对两个接口的同时实现(类似于C++的多重继承),那不就实现了,有道理。面对对象程序设计原则告诉我们:优先用聚合而非继承。那又该如何设计呢?为什么要这样呢?
2) 进一步的设计与优化
对外功能调用可以提供一个类作为服务类,这个类主要是两个接口的不同对象的聚合,对功能可以很好按需组合,这样就可以更好的适应新的需求变化,同时对开发人员来说,负担很轻,可以不断的基于单职接口来扩展新类完成编码,很cool。嘿嘿,目前就这么个理解,设计如图2
Iindexer接口的实现可以不断的加入新类来完成,如图所示
Isearcher接口也可以不断加入新的类来适应变化,这种设计的确有良好的特性,优于1)中所提的继承方案,这个根本原因了。今天就写到这里吧。目前的理解也就在这个水平,呵呵,下一步要进一步的学习lucene,今天的重构就到这儿吧。
先自己给个后期的学习计划:
1)学习路线:lucene实践(边学边编码),API,拿来主义,学会运用》lucene内部原理(源码定时查看,逆向工程看其UML图)》IR原理,核心算法
2)学习方法:学习,测试(编码实践),重构(知识提炼),学习,测试,重构,借用一下XP编程方法,呵呵。