陈智罡 chzg99@21cn.com
“事情应该弄的尽可能的简单,但是又不能过于简单”——爱因斯坦
引言
爱因斯坦许多年前的这句名言,今天任然适用于构建高质量的软件系统。不幸的是,任何一个在IT业有资深经历的人,都会指出有许多软件系统违背了爱因斯坦的这句名言。其中要么是一些软件系统太简单以至于不能完成所期望的任务,要么就是太复杂,使得构建和维护成本急速增长,更不要说去整合不同的软件系统。要想达到一个合适的简单度,看起来就像是一场梦。到底错在那儿呢?
松散的耦合
我们不必要往深里去想问题所在。当我们构建的软件系统越多时,就会看到许多相似的情形和模式出现。很自然我们想到去复用已存系统的功能,而不是一切从头做起。
现实依赖是一种事件间的状态,表现在一个系统依赖于其它系统所提供的功能。如果世界上只包含现实依赖,那么爱因斯坦的检测很久以前就通过了。问题就在于我们又建立了一些人为依赖,这些人为依赖与现实依赖共存。
如果你到国外出差,你知道你必须要携带电源适配器,否则你将会碰到麻烦。你需要电源是现实依赖,而你的插头必须与当地电源插座匹配,这是人为依赖。不同国家有不同尺寸和形状的插头,他们有些小而紧凑,有些大而笨重。
这里的经验是我们不能去除人为依赖,但是我们能减小它。如果系统中的人为依赖已被减小,理想上将其最小化,我们就获得了松散耦合。某种意义上,爱因斯坦所说的就是松散耦合。我么可以将爱因斯坦的这句名言改写为:“人为依赖应被最小化,但现实依赖不应该被改变”。
SOA的定义与解释
现在可以去定义面向服务体系结构。SOA是一种体系结构,目标是在软件代理交互中获得松散耦合。一个服务是一个服务提供者为一个服务消费者获得其想要的最终结果的一个工作单元。服务者与消费者都以软件代理代表他们自己的角色。
这听起来有些太抽象,但是SOA确实无处不在。让我们在你的住房中找到一个SOA的例子。例如播放一个CD,你可以将要播放的CD放入CD机中,CD机将为你播放这张CD,CD机提供了一个CD播放服务。这里的好处就是你可以用不同的CD机去播放同一张CD。他们能提供同样的CD播放服务,但是服务质量是不同的。
SOA的思想明显不同于面向对象的编程,面向对象编程强烈的建议你应该将数据与其操作绑定。因此在面向对象编程风格中,每张CD 有它自己的CD播放机,他们之间不能被拆开。这听起来很奇怪,但是这就是我们建立许多已存软件系统的方式。