面向对象,面向服务

时间:2021-05-20 19:51:52
    关于这两个概念之间的联系、区别,在SOA提出之初就已经讨论的很多了,为什么到今天还会有“现在都已经SOA了,还面向对象干吗?”的论调呢。
    OO与SOA就不是同一个层次上的概念,提出的目标不同,针对的问题不同,成熟程度更不同。关于SOA的内涵,到现在也还是像“九二共识“一样,各有各的解读。IBM,Microsoft,Oracle等各大厂商(或者叫概念炒家)都有自己对SOA的理解、诠释和解决方案。而在社区中,认为SOA是旧瓶装新酒,是概念炒作的,有之;将SOA的概念推广,认为其在软件中无处不在,甚至Anything is Service的,有之。今年春节时和一个在柏林工大读硕士的哥们聊天,他在西门子还有份兼职,说到SOA,他说据他了解至少在德国,目前SOA还在天上飘。
    我的感觉是,SOA的概念源于产业界,而非学术界,这样的概念如果要进入学术界必须要非常谨慎。但现在SOA已经不仅在产业界热炒,而且正在向学术界蔓延。这未必是一个好现象,因为产业界提出的新概念可能是需求牵引,更可能是利益驱动,其学术价值可能非常低。所以我们广大在校攻读学位的兄弟们一定要保持清醒的头脑,至少要明白这个概念为什么提出,目标是什么,摸清其产生的纵向与横向原因脉络,不要盲目跟风,更不要把根本不是一个层次上的概念(比如OO)拿来乱搅和。
    那么在现在“王子复仇记”般缤纷演绎的SOA大戏台上,什么才是需要把握的呢?我觉得idior的 “四点式SOA”总结的比较好:
1、SOA是松耦合的
2、SOA是基于消息的
3、SOA是用于系统集成的
4、SOA的用武之地就在于构建组合型应用

    言简意赅。特别是第3点,个人觉得道出了目前SOA的应用领域,即用于所谓“烟囱林立”的信息系统的整合,这些“烟囱”高矮粗细越不相同(系统异构性越强),离的越远(地理分布越广),那么SOA就越能发挥效力。前几天wayfarer举了一个 全球酒店预定系统的例子,就很好的说明了这一点,这恐怕可以算是飘在天上的SOA触到地面的一个脚尖吧。

    那么我们再回过头来看OO。这可不是个新概念了,它从OOL(面向对象的语言)开始,发展成包括概念、原理和原则的完整理论体系。OO是个神奇的东西,它可简可繁,简能简到只用“封装、继承、多态”六个字就能表达;繁的话可以让李建忠用近两个钟头的一整个WebCast也仅仅讲了个提纲挈领。近年来随着敏捷、测试驱动、设计模式、企业应用架构模式等OO的高级主题和方法论逐渐升温,OO甚至已经升华到了一个哲学思想的高度,它已经渗透到从界面、逻辑到数据的各个层面和从分析、设计到编码的各个阶段,成为目前主流的软件开发思想与范型。
    然而我们应该看到,抽丝剥茧,OO思想中所蕴含的最重要的部分是什么?按照前文的思路,我们应该搞清楚的是OO提出的目标和针对的问题是什么。如果让我用一句话来概括,那么或许应该是: 运用抽象的力量封装变化,隔离变化,实现复用。软件的复用是软件技术发展的目标,把握住这个目标就找到了软件技术发展的脉络。OOL的出现从实现层面上为达到这个目标提供了一个强大的武器,后来UML的出现又从分析与设计层面为达到这个目标进一步强化了这个武器。但退一步想想,其实要达到这个目的,没有OOL,没有UML一样也行。我们见过一些C达人(或者叫偏执者)用函数指针模拟继承和多态,然后说:这个我也能实现!除了对他C语言深厚的功底感到钦佩以外,我没有其他感觉,期待汇编达人跳出来用ASM模拟一下基于寄存器的继承和多态,更期待01达人用打孔机模拟……我们不推崇这种倒转历史车轮的做法,既然发明了打火机,干吗还去钻木取火?我觉得他们的目的无非是为了说明OOL的OO特性对于他们来说没有什么用,如果硬要用的话,他们用C也能实现。但是这至少说明OO在有些地方并不一定适用。那么既然OO那么厉害,真的还有它起不了作用的地方吗?
    近年来,国内技术社区不断成长和成熟的一个显著标志就是关于“语言之争”的话题越来越少,大家逐渐意识到为“是C语言厉害,还是Java牛逼;是vb.net时髦,还是C#强大”争的面红耳赤就像在为“是螺丝刀厉害,还是电锯厉害”争论一样,除了在不经意间(当然也可能是有意的)成了某个商业公司的代言人,为其做了免费宣传以外,没有其它任何意义。与之前的技术相比,OO之所以算是一种进步,就在于其提供了更高层的抽象能力,在特定的软件开发领域内,这种能力非常重要,它能够让开发人员更加方便的去封装变化和隔离变化。注意,我用了“特定的软件开发领域”,也就是说,并非所有需要编程的地方都需要OO的这种抽象能力,甚至在很多地方,这种能力反而会成为累赘。比如学信号处理搞DSP的,学雷达用Matlab做仿真的,甚至是做操作系统底层开发的,都不是很需要这种级别的抽象能力。那么难道这些领域的软件开发不要复用吗?不是,他们会以自己的方式来实现这个目标。最能运用OO的相关工具,把OO提供的抽象能力发挥到淋漓尽致的就是信息系统开发这个领域。这恐怕也是现在最庞大的软件技术社区之一。正是这个现状,才显得学OO,用OO的人群那么大,OO是那么的流行,那么的重要。
    当我们把现在所有戴着OO帽子的技术、名词和概念慢慢梳理之后就会发现,它们存在的意义都是封装变化、隔离变化,实现复用。这里我想起了idior的 《沿着重用我们一路走来》。通过实现重用减少软件开发中的低水平简单重复劳动是软件技术发展的主线,OO只是这个过程中一朵绚丽的浪花,是搞信息系统开发这帮人的强大武器。

p.s.很久没在首页写东西了,上面这些也是今天在实验室和一个同学讨论之后的有感而发, 欢迎讨论