软件开发中的封装与重用

达尔文的生物进化论告诉我们,生物在大自然中互相斗争与依赖,通过遗传和变异,从低级到高级、从简单到复杂、种类由少到多地进化着、发展着,适应者生存下来,不适者则被淘汰,也就是所谓的“物竞天择,适者生存”。

软件开发也有一个进化过程,其驱动者便是开发者。开发者的源动力来自于效率,以最少的投入得到做多的产出,剩下的时间玩个游戏或者追个美眉,谁能不动心呢?说白了,人们就是想偷懒。想偷懒并不是坏事哦,如果注意观察,你一定会发现你周围很多聪明人其实都很懒惰,为了偷懒一定要想出冠冕堂皇的好办法才可以嘛,一来二去的便变得聪明起来了。

怎么样才能最求效率呢?让我们先考察一下汽车行业吧。最早制造一辆汽车就跟今天全手工的阿斯顿•马丁一样,从车身到内饰,一个团队的工程师包揽了全部工程。虽然这样能够打造出独一无二的豪车,但是想要抓住普罗大众那利润同样丰厚的长尾,却是万万不可能的。伟大的亨利•福特先生是最先打破这一模式的人。他发现汽车部件之间是可以由不同部门分别完成,只要规格商量好就可以。好比在今天无论是十六寸五辐烤漆全钢轮毂,还是十七寸七辐电镀合金轮毂,无论轮毂的设计细节,只要符合同样的轴承规范,都可以安装在同一辆车的车轴上,这就是封装(Encapsulation);同时,一次设计多次生产的十七寸七辐电镀合金轮毂也能用在不同的车子上,这就是重用(Reuse)。所以,福特先生把产品的生产工序分割成一个个的环节,每个环节都生产出一个部件并加以标准化,然后把汽车底盘放到传送带上以一定速度从一端前行,前行中逐步装上发动机、操控系统、车厢、方向盘、仪表、车灯、车窗玻璃、车轮等等,等地盘走到终端时一辆完整的汽车便组装成功了。这条流水线使每辆型汽车的组装时间由原来的12小时28分钟缩短至10秒钟,生产效率提高了4488倍!再加上工人分工带来的质量和产量的提升,使得生产成本大大降低,不仅普通百姓能够负担得起汽车,也使汽车工业迅速成为美国的一大支柱产业。

其实软件行业从汽车产业学到了很多东西,这里提到的封装和重用只是其一,许多年之后丰田公司在此基础上改良还提出了精益(Lean)的管理理论,有机会再详谈。

扯远了,回到软件开发领域中,封装与重用仍然是程序员提高效率的最佳实践之一,很多时候你已经是受益者,只是潜移默化了而已。

拿面向对象编程(Object Oriented Programming)技术来举个例子吧。C是一门跨时代的语言,用它程序员们码出了Linux操作系统和Oracle数据库等大型软件。不过,想要重用C语言源代码还是比较麻烦的,因为当你打开别人的源文件后,你不但看到了你需要学习和使用的函数,你也不得不看到那些对你无关紧要的子函数以及变量,而那些只是实现细节,你不会直接调用。以C++、Java、C#等为代表的面向对象程序设计语言提供了以类(class)为核心的编程构架,不但把数据与方法绑定在一个类的范围内,还提供了共有私有等控制级别,从而你只要关心类的public的函数和成员变量即可,大大方便了源代码的复用。

面向组件编程(Component Oriented Programming)在源代码封装和重用的基础上更前进了一步。源代码分享固然好,但随之而来的编译工作却费时费力。所以,C和C++允许把源代码编译成二进制lib文件,再加上头文件,你就可以链接到你的可执行文件中了。当然,每个可执行文件实际上都包含了一份lib的副本,不但占空间,而且每次升级lib都需要重新编译可执行文件,不易维护。动态链接库DLL的出现缓解了这一矛盾,只要维护一份DLL文件,所有的程序都能调用其中的逻辑。然而,DLL生命周期管理、内存分配、函数导出表等诸多限制也不能令人满意,微软的天才们利用C++纯虚类的机制实现了COM(Component Object Model),规定了二进制级别的接口规范,使得不同语言都可以调用COM对象,后来还成了Windows和Office最重要的基石之一。在Windows 8中,COM被继续发扬光大成为Windows Runtime技术,能够更方便地被C#、JavaScript、C++/CX等语言调用,开发Metro风格的应用。貌似Windows中原生代码对托管代码展开了一场逆袭,关于这个话题,有空再聊。

面向服务架构(Service Oriented Architecture)的愿景更宏伟。注意哦,这里用的是架构而不是编程,因为SOA并不特指 某些技术,而是把业务逻辑都规划做服务,并且抽象出了一系列的原则与方法规范它们之间的交互以便更好的重用。所以,RPC、CORBA、DCOM等技术都属于SOA的具体实现,只是SOAP和REST近来曝光率比较高而已。其实SOA很先进,不过在实施中只会坐而论道而且有教无类,无异于进化太快,影响力始终有限。不过,以Windows Azure为代表的云计算平台,把计算和存储等资源都当做服务公开了出来,你完全可以运用这些服务而专注于领域业务逻辑的开发,真切体验SOA带来的各种便捷。

 



张 琪