比如该书的第一章 1.1.2 组件的产生 提到:
在计算机软件发展的早期,一个应用系统往往是一个单独的应用程序。应用越复杂,程序就越庞大,系统开发的难度也就越大。而且,一旦系统的某个版本完成以后,在下个版本出来之前,应用程序不会再有所改变。而对于庞大的程序来讲,更新版本的周期很长,在两个版本之间,如果由于操作系统发生了变化,或者硬件平台有了变化,则应用系统就很难适应这样的变化。所以这类单体应用程序已经不能满足计算机软硬件的发展需要。从软件模型角度来考虑,一个很自然的想法就是把一个庞大的应用程序分成多个模块,每一个模块保持一定的功能独立性,在协同工作时,通过相互之间的接口完成实际的任务。我们把每一个这样的模块称为组件,一个设计良好的应用系统往往被切分成一些组件,这些组件可以单独开发,单独编译,甚至单独调试和测试。当所有的组件开发完成后,把它们组合在一起就得到了完整的应用系统。当系统的外界软硬件环境发生变化或者用户的需求有所更改时,并不需要对所有的组件进行修改,而只需对受影响的组件进行修改,然后重新组合得到新的升级软件。......
在这里作者把COM的产生归结于软件架构的需要(比如升级的需要)。如果单论这点,采用其它方式也能做到。比如书中提到的这种软件升级的办法,如果采用插件式架构,定义好接口协议,采用动态加载动态库的方式,一样可以实现这种灵活的软件升级。
实际上我认为COM对于软件开发而言的最大优点是语言无关性。所谓的语言无关性,就是不管实现COM组件的语言是哪种,它都可以很容易被支持COM规范的其它语言开发的客户端程序所调用。COM的这种特性毫无疑问将大大提高软件开发的效率,因为这可以实现不同语言背景的开发人员的混合开发,具体就是在一个项目中可以使用多种开发语言;以COM形式出现的SDK可以供多种语言进行二次开发。
可能你要说C语言的API不也可以供多种语言调用吗?COM的这种语言无关性比起C API的优势在哪里呢?首先C API需要标准化,需要按照统一的调用方式进行处理。其次COM 组件比起C API更有层次感,因为C API模块中各个函数是平等的,比如Windows API的几百个函数,用户很难找到自己需要的函数,而COM不一样,它可以把相关的API组合成独立的模块。打个通俗的比如就是你的D盘有上百个文件,大致分为三种:pdf格式的电子书、mp3格式的音频文件和rmvb格式的视频文件,如果让你找一本电子书,你得首先排除很多音频文件和视频文件。如果你建三个文件夹来放这三类文件:book--放pdf格式的电子书、music--放mp3格式的音频文件和movie--放rmvb格式的视频文件,那么找起单独的文件就方便多了。COM正起这个分类作用。
理解了COM的语言无关性,就很容易理解为什么需要COM库和COM的idl文件等。因为"计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决",COM库和idl文件实质就是沟通各种开发语言、服务端和客户端以及支持COM规范的中间层。
从这个角度看,产生COM的主要原因应该是软件开发的必然要求以及计算环境的变化(网络的兴起以及分布式计算的出现)。