要如何才能创建一个面向对象的应用框架呢?又该如何创建能够提供应用核心,可用于构建大量应用的呢?面向对象编程技术是一个很好的开端,但对于创建一个成功的框架而言,这还不够。那么还需要些什么呢?
你们中的大多数人都经历过从过程式编程迁移到面向对象编程的变革。适应了这种变革,你才能够自如的运用Java或C++编写程序,但是你仍然无法积极地使用面向对象编程技术(除非有奇迹发生)。通过阅读和接受培训(以及犯错误),你慢慢地获取经验,这些都在潜移默化的影响着你。你开始接收一系列面向对象编程的模式,它们帮助你正确的使用继承,使你能够真正进行面向对象设计,并帮助你形成有效地开发团队。要成为一个框架开发者,你也要经历类似的转变,这个转变虽然不大,但确实存在。
是什么使得框架如此独特呢?框架是一门艺术,它在提供可重用的内容(例如供业务应用使用的,预定义的业务对象和业务流程)和灵活性(允许对内容进行定制,以准确地满足框架用户需要)之间保持一种平衡。这是一种极其微妙的权衡艺术。如果过度的提供灵活性,那么框架就会分裂成微小的业务对象和低层次的业务流程——更像是一个类库。另一方面,如果过分注重内容,我们就会面临着使定制复杂到难以使用的风险——就像使用一个现存的系统来构建另一个系统一样。如何有效的找到这个平衡点,是那些希望成为框架设计者所需要学习的。
为了帮助你完成这种转变,本书介绍了成为一位框架开发者所需要学习的基本内容。我们把自己的经验精练为模式,这样你就可以立刻把它们应用到工作中——我们相信,这些模式不但对那些和框架打交道(开发者、使用者和评估者)的人有用,还能被其他软件开发者所利用。框架开发能够测试并强化我们在成为面向对象开发者途中所学到的知识,因此该书也能够帮助那些面向对象开发者。此外,随着越来越多可定制的应用、组件、Web Service的出现,有关技术团队(非领域团队)和非技术团队(领域团队)协作开发软件的模式就越发显露出其价值所在。
本书并不是一本描述面向对象开发的书,也没有向你讲述如何使用一门特定的面向对象语言编写程序。它也不曾提及神秘的算法、彻底革新的开发过程,或是对面向对象设计建模的新方法的讨论。实际上,我们只是把在日常的面向对象框架开发中遇到的(也是典型的)情况整理为模式的形式。其开发活动涵盖了从初始需求收集到框架文档制作的范围。我们还针对开发中人的问题投入了一些精力——如何协调不同类型的人员交互,以保证他们相互协作,开发出成功的框架。最后我们简要的叙述了如何使用框架来开发应用。
如果你有面向对象的开发经验,你会从本书中得到最大的价值。如果你刚开始学习面向对象的知识,这本书对你还是有价值的——它介绍了未来你会遇到的一系列问题。框架开发者和使用者也能够从本书中收益。框架用户不仅会学习到使用框架的模式,还能够了解到如何进入框架开发的世界。面向对象开发的项目经理们也可以发现本书的用处,它指出了软件开发过程中可能出现的一些潜在的缺陷和开发团队要处理的主要的问题。
这些模式到底是什么呢?我们拿 Tor's Second Cousin模式(见4.2节)做一个例子。它是用一个在IBM的SanFrancisco框架中工作的领域专家的名字命名的。Tor能够在框架中找出别人无法发现的需要灵活性的部分。我们把这些发现归功于Tor的虚构的、疯狂的表弟。在很多情况下,Tor描述的场景表达简单但考虑了过多灵活性的需求。换句话说,只有极少数的框架用户才会按照Tor描述的方式那样使用框架。如果你是项目开发团队中的领导者,当遇到这种情况的时候,你就需要做出决定:是否需要在框架中囊括对该种灵活性的支持?Tor's Second Cousin模式正是捕获了这种处于灵活性和复杂性之间的平衡艺术。框架的某些目标受众需要灵活性,但它却引入了额外的复杂性,而这恰恰是需要被避免的。这种规则提供了一种方法,令你能够对情况进行研究,同时不至于触怒他人。询问需求是否满足Tor's Second Cousin模式并不是意味着需求是错误的,或是说提出需求的人是傻冒或出格。它只是提醒我们注意复杂度和灵活性之间的权衡而已。给这条规则冠以一个幽默的名称,这样我们就可以在对需求发生争执的时候缓解紧张的气氛。我们发现,当幽默运用得当时,对于构建团队和缓解紧张气氛来说非常有效,特别是当软件开发的时间紧迫,面临着巨大的压力的时候。出于这些因素的考虑,本书中的大部分模式除了它们的描述性的名字外还有一个幽默的名宇(译注,这也是我们保留这些原汁原味的幽默的原因)。举个例子,Tor's Second Cousin模式的另一个名称是怎样才是真正的极端?
为什么采用过程模式呢?Scott Ambler把过程模式定义为一种经过证明的、成功的软件开发方法[Ambler 99]。本书提供了框架开发中的经过证明的成功方法。把这些方法捕捉为模式,使得我们能够以一种一致的方式来记录它们,这样你就可以很容易的检视这些模式,参考它们的适用性,来判断是否适合用于某个特殊的情形中,或者应该把它作为一个定义自己的解决方案的起点。所有的模式都包含下列的部分:
名称——模式的名称(通常都比较幽默)。
别名——模式的另一个名称。
意图——模式内容的简要叙述。
上下文——模式的动机。
示例——示例,通常是基于案例研究展开的。
问题——对模式所处理问题的简要描述。
方法——各种的解决方案,有不同的侧重点,同样是基于案例研究的。
解决方案——模式对问题的推荐解法的简要描述。
何时使用/何时不使用——是否使用模式的思考,一般是研究基于案例的。
适用性——是否使用模式的简要描述。
已知应用——模式曾经的应用之处,包括IBM的SanFrancisco框架例子。
相关模式——和当前的模式相关的其他模式,以及它们的关系。
. 我们的经验
和你们之间的许多人一样,我们原先也属于过程式编码人员阵营。我们在课堂上学习面向对象技术,并在实践中磨练自己的技艺。我们都参与过面向对象操作系统的开发(使用C++)。我们的工作属于20世纪90年代初把 AS/400从CISC转移到MSC项目的一部分。该项目涉及到对数百万源代码的修改和替换。组织中的大多数人都是面向对象开发的新手,因此我们并不只是关注自己的设计和代码,相反的,团队中的每一位成员都抱着开放的心态,相互帮助,讨论和复审彼此的设计和代码。当我们完成从CISC到MSC的转换时,我们所有人都成为了面向对象的专业开发人员。这为我们撰写此书提供了最初的经验。
从项目中出来之后,我们都投入到了IBM的SanFrancisc。项目中去,准备开发一个分布式的面向对象业务应用框架(使用Java)。我们设定了一个目标——为应用开发者提供一个应用核心,换句话说,提供每个人都需要的部分。框架使得应用开发者能够在应用的特殊性上投入更大的精力,增加和竞争者不同的内容,而不是提供和他人完全一致的内容。框架还允许应用开发者针对特殊的需求定制框架元素。
SanFrancisco框架是以多层的形式交付的。在底层的是更加传统、更面向技术的框架,提供了对诸如持久性和分布式对象的支持(目前的大多数功能都已被EJB实现了)。在技术框架上构筑的是业务应用框架。框架的这些部分并非提供可重用的技术解决方案,而是提供了可重用的业务内容——业务对象和业务流程。而且,根据框架应用和目标领域的不同,这部分的框架被细分为不同的应用,例如库存管理和会计。虽然我们参与了大部分层次的开发工作,但我们的重点保持在提供业务内容的业务应用框架上。
SanFrancisco的开发团队之所以选用面向对象技术,是基于以下几点原因:对复杂性的隔离和分解、对可维护性的改进,以及把开发工作分解为自含的模块。面向对象技术吸引人的一个主要原因是它把职责封装到对象中。这使得对框架某部分的修改得到控制,也容易理解,对于为实现定制性而需要改变的框架来说,该特性是非常关键的。我们选择Java的原因是它的平台无关性和因此而产生的最大灵活度。
当我们结束项目时,IBM的SanFrancisco框架已经拥有超过1000个面向业务的类,近100万行的Java代码,这使得IBM的SanFrancisco框架成为有史以来完成并销售的、规模最大的商业化面向对象业务应用框架。
这么多类和代码难道都在本书的介绍范围之内吗?并非如此。它们仅是我们为处理大量问题而使用的框架技术。我们并不是编写了一个小框架,一旦发现一些东西就整理出一个模式,也不是我们想当然的认为它是个模式就把它整理为模式。我们之所以认定它们成为模式,是因为我们不断的发现它。它们被识别、精化,并应用到整个团队之中,包括技术专家和领域专家。最后,大量的软件开发人员通过构建他们自己的灵活的应用也验证了这些模式,其中的大部分应用都是在IBM的SanFranisc。框架的基础上为更大范围的销售或特定的业务需要进行的二次开发。
如何阅读本书
所有的读者都应当阅读第1章简介和第2章案例研究。简介通过描述框架是什么,如何开发和使用框架,为你提供了一个了解模式上下文环境的基础。它展示了模式是如何相互配合的,使你能够有兴趣深入了解模式。案例研究提供了一个通用领域以及领域中的词汇,这样我们就可以提出领域中的问题,并引发对模式的思考,以及想出解决问题的方法。
在结束了简介和案例研究章节的阅读之后,剩余的章节你可以以任意的顺序进行阅读。管理者和开发人员希望了解模式的大概,他们可以阅读所有模式的意图。问题、解决方法和适用性部分。剩余的部分可以等到以后需要时再详细阅读,例如第一次遇到似乎可以应用这些模式的情形。
根据模式的主要用途,我们把相关的模式组织成如下几个章节,包括:
·第3章讨论了在整个框架开发过程中都适用的模式。
·第4章讨论了识别和捕获需求的相关模式。
·第5章讨论了分析阶段的模式。
·第6章讨论了设计阶段的模式。
·第7章讨论了框架的和文档相关的模式,对于框架开发来说,广泛的文档是非常重要的。
·第8章讨论了框架(以及通用的面向对象软件)开发的组织特征,包括了属于不同人群的领域和技术专家的相关模式。
·第9章讨论和使用框架相关的模式。
此外,本书还包括两个附录。附录A描述了组件和框架之间相互补充的关系。附录B描述了IBM SanFancisco项目中用于业务应用框架开发的开发过程。
致谢
没有大家共同的努力,该书将无法面世。IBM SanFrancisco框架的成功是团队中众人智慧的结晶。每一位成员都以自己的方式贡献力量,形成了这些规则。我们感谢团队中的每一个人——在我们曾经工作过的团队中,你们是最出色的。
Brent感谢他的妻子Lisa,感谢她对自己写作爱好的容忍,并保证近期不再签任何图书出版合同。
Jim感谢他的家庭对他花费大量时间用于本书写作上的支持。
感谢以下审阅者:Michele Chilanti,Will Traz,Simon Reason,Palle Nowack,Marcus Fontoura,Roger Snowden帮助作者专注于本书的内容并和文字的推敲。此外还感谢 Addison-Wesley出版社的同仁,特别是 Paul Beeker和 Marcy Burnes。最后,特别感谢 Chrysta Meadowbrooke为本书所做的文字编辑工作。
James Carey
Brent Carson