Java应用架构设计:模块化模式与OSGi
上QQ阅读APP看书,第一时间看更新

2.2 开发模型

开发模型解决的问题是开发人员怎样使用框架构建软件应用。开发模型又可以进一步分为两类:编程模型(programming model)和设计范式。在帮助开发人员构建更加模块化的软件应用中,两者都是很重要的。

2.2.1 编程模型

要利用运行时模块系统就需要程序员能够与模块系统的应用程序编程接口(Application Programming Interface,API)交互。但是,依赖这些API将会导致重量级(heavyweight)的模块(关于重量级,参见5.2.2节),它们很难测试并且很难在运行时系统外执行。为了减少对模块系统API的依赖,框架和一些技术必须提供一定程度的抽象,这样代码就不会直接依赖框架的API了。这些框架和技术的示例包括OSGi Blueprint服务、声明式服务(Declarative Service)、Spring Dynamic Module以及iPojo。

借助这些框架和工具,开发人员可以使用运行时模块系统的能力而不用再担心编程模型。这些框架封装了对API的依赖,这样代码就不用直接与这些API交互了。通过这些框架实现关注点分离能够让Java类依旧是简单旧式Java对象(Plain Old Java Object,POJO),它们不会依赖模块系统的框架。这使得编码和测试简单了许多。

2.2.2 设计范式

除了运行时模型和编程模型以外,在开发模块化软件时还会有其他的挑战。设计范式也是必须要解决的。一个组织如何创建更加模块化的架构?模块的合适粒度是什么样的?模块间应该存在什么程度的依赖?怎样最小化模块依赖?如何将大的模块拆分为一些更小的更加内聚的模块?怎样将已有的庞大软件系统模块化?应该在何时这样做?这些问题和其他问题是重要的架构和设计问题,这都是在企业级软件开发中与模块化相关的问题。本书中的模式就着重于设计范式。

为了理解设计范式的重要性,借助一些其他技术的历史,我们可以学到重要的经验教训。先看两个不同的技术示例,事实已证明它们与模块设计范式有一些相关性:面向对象(Object-Oriented,OO)编程以及企业级JavaBean(Enterprise JavaBean,EJB)。

1.面向对象

在20世纪90年代初期,面向对象范式被视为救世主。开发团队能够通过组合可重用的对象构建系统。面向对象范式承诺会显著缩减软件的上市时间并提供更高质量的软件。但承诺并没有兑现,面向对象范式的益处从来没有完全实现。有几个原因使得开发团队无法实现这些收益。作为可重用的基础,类的粒度太小。开发团队很难正确地把握和使用面向对象的理念。较深层次结构的继承以及包含太多功能的基类会导致设计不佳和脆弱的软件系统。总之,面向对象开发过早地失效了。

面向对象编程语言的运行时功能提供了如多态、动态绑定等特性,开发人员可以很容易地理解编程模型中的很多方面。使用点号调用方法以及定义私有的成员变量都是很简单的理念。但我们花费了很长的时间才理解怎样使用面向对象技术设计好的程序。换句话说,我们一直与设计范式做斗争。如今被视为面向对象设计的简单事实(“优先使用对象组合而不是对象继承”以及“面向接口编程而不是实现”) [1]在十五年前还是未知的,至少对我们并不是那样明显。即便是现在,我们还在学习新的方法来使用面向对象技术设计更好的软件系统。

2.企业级JavaBean

企业级JavaBean,尤其是其中的实体bean,曾被视为将Java开发的业务应用进行组件化的一种方式。EJB的运行时能力是很有吸引力的——事务、持久化、安全性、透明等——并且它们直接合并到了平台中。不过,有两个很明显的问题:开发模型复杂并且无法很好地理解。

尽管这已经是多年之前的事情了,但我清楚记得第一次接触EJB时的情形。我中途参加了一个正在进行开发的团队。那时,团队有超过100个的实体bean,本地开发环境需要四个多小时才能启动而且遍地都是问题。我坚持了三周,然后自愿离开了这个项目。在此之后不久,这个项目最终取消了。EJB的问题不在于运行时模型或编程模型。有很棒的工具使这些工作变得很容易。运行时模型实现了它的很多承诺,代码生成向导以及众多的工具使得编程模型相对很简单。甚至出现了一些框架使开发人员可以将代码与EJB编程模型解耦,这样他们就可以只设计更简单的POJO。但是,EJB是一项新的技术,很多开发人员缺少有效使用这项技术的设计能力。另外,事实证明,理解EJB相关的设计范式就是它的丧钟。

3.吸取的教训

面向对象的程序设计和EJB都曾经被视为有前途的技术,但事实证明,它们并没有达到最初所炒作的那样。问题不在于面向对象编程语言或实现EJB规范的平台,而在于我们怎样使用这些技术设计应用。最大的挑战是关于设计范式的。

这些教训为OSGi可能会面临的艰巨挑战提供了前车之鉴,具体来讲就是Java平台的模块化。如果开发人员不能很好地理解设计范式以及指导使用这项技术的原则和模式,那么运行时模型的优势将不能实现。要设计在架构方面灵活和适应性强的软件系统,模块化是一个关键因素。在Java平台中,确实存在模块化的需求,尤其是在开发大型企业级软件系统时。但是,如果现在不立即着手理解怎样设计更加模块化的应用,那么当支持模块化的平台出现时,我们将会面临重大的挑战。

[1] 这些具有永恒价值的表述可以在GoF的图书《设计模式:可复用面向对象软件的基础》中找到。