Erich Gamma 和 Kent Beck合著的《Contributing to Eclipse》一书中,提到了Eclipse的一些法则。在扩展者相关的法则中,由“分层法则”一条,大致意思如下:“ 将语言无关的功能与特定于具体语言的功能开发,将核心功能与UI功能分开”。
个人觉得虽然叫做“分层法则”,其实体现的是模块合理划分的思想。
现在重点关注一下“核心功能和UI功能分开”,说一下自己的经验,仅供大家参考。自己的经验是,分层法则是在概要设计模块划分的时候就需要引入并严格遵守。
1、
根据需求,对模块进行划分。典型的输出结果是:底层模块和生成功能模块,示意图如下:
说明:例如在做集成开发环境(IDE)的产品,底层基础模块包括了资源管理(包含编译处理)、运行时候模型等类型的模块,当然也可能是workbench类似的模块(虽然是UI,但同样是底层基础模块),这些底层模块为上层模块提供服务。上层功能模块类似于你创建了一种自己的基于GEF的编辑器等类型的模块。
2、
对各个模块分别进行核心功能和UI进行拆分。这其中既包含了对上层功能模块机型UI和核心功能的拆分,也包含了对底层模块的拆分。示意图如下:
说明:到这里,我们的具体功能模块划分了如下:
com.myproduct.myeditor.ui插件(UI部分,例如包含了使用GEF创建了流程编辑器的代码)
com.myproduct.myeditor.core插件(模型部分,例如包含了EMF创建编辑器对应模型的代码)
我们也把底层的模块做了划分:
com.myproduct.resource插件(例如包含了builder等逻辑代码)
com.myproduct.refactoring.ui插件(重构功能,例如包含了一系列重构需要的UI代码等)
com.myproduct.refactoring.core插件(重构功能,例如包含了一些重构需要的模型代码等)
3、
确定上层功能模块和底层的UI模块交互。这是最容易破坏Eclipse分层法则的地方了
需求来了:我们的编辑器模块要对一个底层模块做扩展,例如对底层的refactoring重构功能做扩展。
这边容易犯的错误是, com.myproduct.myeditor.core插件会直接使用了com.myproduct.refactoring.ui插件中的逻辑代码,示意图如下:
说明:图中的红线清晰的说明了,已经违反了Eclipse的“分层法则”。
我们模块中的核心插件直接和其他模块的UI插件紧密耦合了。可能有人会说,我们的核心功能插件是在上层模块中的,依赖底层功能模块并不过分,这种想法是错误的!!!任何情况下,都要尽力避免核心功能和UI的紧密耦合。
正确的示意图如下:
【总结】
1、Eclipse分层法则的使用一定要建立的合理模块划分的基础之上。是现有了功能模块的划分之后,再对特定模块进行UI和核心功能的拆分。同时,要注意避免分层法则的过度夸大,模块的划分的基础一定是功能需求,而分层法则只是帮助我们从技术实现的角度更好的划分模块直接的关系。
2、任何模块之间都需要尽力避免UI和核心功能的耦合,哪怕是在上层模块和基础模块之间也同样如此。例如,看到有些插件开发者在非UI核心功能插件中直接去使用eclipse ui框架或者workbench中的东西,一般情况下,这是需要避免的
3、为了防患于未然,一个功能模块默认情况下分成*.core和*.ui两个插件,然后控制好和底层模块插件间的交互,参见上面2。
4、外面要下雨了,赶紧回了。。。。。不写了 改天补充
本博客中的所有文章、随笔除了标题中含有引用或者转载字样的,其他均为原创。转载请注明出处,谢谢!