2010年将是Java模块化的一年。51CTO编辑希望能在这一年中让更多的开发者了解模块化编程的概念,它的学习、实现方式以及它的好处,为此,我们请来了国内OSGi先锋,淘宝网平台架构部架构师林昊(@BlueDavy)为大家进行一次简单的普及介绍。
【51CTO独家特稿】模块化编程从UNIX开始兴起,自Eclipse和NetBeans等插拔式IDE获得巨大成功之后,在最近几年受到广泛关注。51CTO开发频道曾对模块化编程的优点与实现原理进行过简单的介绍,并且在Java模块化方面,对OSGi规范进行了持续的报道。
但是,很多Java开发者对模块化编程仍然接触不多,对Java的模块化的进展也不甚了解。多方观望,2010年将是Java模块化的一年,因此51CTO编辑希望能在这一年中让更多的开发者了解模块化编程的概念,它的学习、实现方式以及它的好处。为此,我们请来了一位国内的OSGi布道者为大家进行一次简单的普及介绍。
有请China OSGi User Group Director,淘宝网平台架构部架构师——林昊(@BlueDavy)。林昊是《OSGi原理与最佳实践》一书的作者。
林昊的Twitter:@BlueDavy
此次采访模式为邮件采访,林昊对51CTO编辑提出的7个问题一一进行了回复。内容如下:
1. 模块的实现和传统编程方法有何不同?开发者需要学习哪些知识(比如版本控制、依赖性管理、规范的接口设计等)?
林昊:模块的实现和传统的编程方法确实有一些差别,主要体现在模块之间类访问的隔离、版本选择这两个方面。如希望更好的设计模块化的系统,开发者需 要学习ClassLoader机制、模块之间类的交互方法(这包括了模块怎么样对外提供可访问的package、怎么样访问其他模块提供的 package、如何选择适合版本的package等)。
2. 对模块化的形容,我们往往使用“高内聚”,“低耦合/松散耦合”这样的用语。您是如何理解这两个概念的?
林昊:高内聚、低耦合更多程度是指让模块之间的依赖是清晰的,内聚体现在内部对功能实现的封装,而低耦合体现在模块对外提供的接口是可控的。在模块 化之前,在Java体系中更多的是通过public、protected、private这样的作用域来保证依赖清晰(参考阅读:模块化概念解惑);但事实证明,这样的方法来保证不是非常有效。而在模块化的体系中,则会有明确的模块之间接口暴露以及依赖的定义,因此能够更好的实现高内聚和低耦合。
3. 模块化编程的好处有哪些?它解决了原来那种紧密耦合式编程中存在的哪些问题?
林昊:模块化编程最大的好处在于有效的控制和避免了模块被外部误用。其他方面的好处在于各模块可以方便的做到引用自己所需要依赖的包,避免产生包冲突现象,对于现有java体系而言,另外一个好处则是可以做到多版本的共存。
4. 您觉得模块化编程最大的难点在哪里?在您的模块化开发过程中,理清逻辑和层次所花的时间和编写代码花费的时间大致是怎样的比例?
林昊:模块化编程最大的难点一方面是设计方面的挑战,在没有实际隔离情况下模块化的设计其实并不会真正做到有效的模块隔离的设计;另一方面是在开发 过程中,以前的开发习惯都需要改变,例如以前需要依赖其他模块时,可以采用直接依赖工程或依赖jar的方式,但在模块化的系统中则不行。
在实际的模块化开发过程中,更多的时间仍然会花费在设计阶段。
5. 我们来谈谈OSGi规范。OSGi模块化规范有什么特点?
林昊:OSGi是Java中目前唯一的一个模块化、动态化的规范。在模块化方面OSGi联盟已经研究了很多年了,因此OSGi规范对于模块的物理隔离、模块的交互、多版本这些方面都有了非常完善的机制,并且也得到了现在几乎所有的App Server厂商或开源社区的认可。
6. 虽然OSGi已经是有十多年发展的成熟的模块化标准,但Sun在对Java进行模块化的时候却选择采用JSR 294,并在Java 7当中开展Jigsaw项目。您对此有什么看法?
7. 您认为理想的Java模块化标准应该具备怎样的特点?您对Java模块化的发展有怎样的期待?
林昊:Java模块化标准应有明确的模块定义、模块之间隔离机制的定义、模块交互机制的定义,个人认为在模块化这一方面OSGi已经做到非常好了,当然,如果是语言级能支持就更完美了。
对于Java模块化的发展而言,还是希望Sun能放开胸怀,采用OSGi作为Java模块化的实现基础,并纳入语言级中。