为什么要封装库? 程序库,可以理解为围绕若干功能而单独编译而成的二进制文件,在编译前,它们一般都是一系列的子函数。 应用程序(比如最简单的main函数)在调用这些功能的函数时,和直接调用编译生成库的那些源文件中的函数一样。 ——事实上,这本质上就是一回事,只不过是把 编译子函数这一块单独抽取出来 而已。 一个最重要的问题是,既然这两者的行为一模一样,我们为什么要多此一举,单独去做封装这个步骤呢?
做任何事情都有目的,我用亲身经历的事情来说明一下。 第一,当然是避免重复。 做多几个项目,都会有经验,项目中总有一些类似或者重复调用的一些子函数,我们往往叫它们做 公用函数 或者 常用函数。 比如 delay函数,比如字符串拷贝,初始化函数。
假设我们封装成库,那么,下一次我们要再调用时,只要简单地把链接上库和头文件——我的意思是,库和头文件很可能不在项目文件夹里哦(当然,这个随个人习惯,我有时会把它们一并复制到项目文件里。)
当然,也许你会说,那我也可以直接把源文件复制到项目文件里去啊。 的确,只是这样操作略显麻烦,但我承认,这个目的不算很硬气。 然而,这个往下伸延到第二个目的时,就很明显了—— 第二,避免修改不同步更新 因为有一些常用函数是经常反复使用的。然而,难免我们会在使用过程中,对这些函数进行修改——delay这种函数一般就没这种机会,但它并不是唯一封装成库的子函数。总有一些函数有这种需求。 假如你不是封装成库,而是像之前那样复制源文件的话... 假设下面一种经常会发生的情况: 假设项目D是你第九十五次复制这些公共函数,而你做的新项目,已经是第一百七十八次复制这些公共函数。维护D时,你发现某些问题是公共函数引起的,于是你修改了这些公共函数,同时你可能又引进了一些新的函数。 你是在第九十五次使用的基础上做了这些改动, 从第九十五次到地一百七十八次,可能你也做了好几次改动。但你可能忘了你所做的所有改动。 这个时候,你到底是使用哪一个版本的公共函数呢?它们永远不是你的最新版本,最完善版本——因为你现在有一百七十八套公共函数!!
但如果你使用编译库的方式——它被放在一个相对固定的位置。虽然你不能保证自己每一次更新库,都会升级以前的版本,但是你却可以保证,你永远是在使用自己最完善的库,因为——它只有一个,你每次改动都在这个地方做的。 第三.封闭源码,提供功能 当然,这是商业角度出发。 封装成库,你是看不到内部实现的源码,你只能通过调用使用它提供的功能。 于是,对于功能的改进,升级,都必须通过库提供商的授权。这过程中,当然你也就必须要付费了。 当然,软件也是一种商业产品,是一种有价值的商品和服务,提供价值,收取费用是合理的。 从非商业角度,比如一个内部项目团队,某些代码已经经过了长期验证和测试,足够的稳定,封闭源码,可以避免被随意轻率改动。
纵观三个用途,最核心的其实是第二点。 因此,一个稳定,永远保持在最新状态的 功能库,永远是开发的利器,它提供经过验证和测试的稳定代码,保证了质量,又避免了重复从而提高开发速度。 而封闭源码,就是为了保证它的相对稳定。
[ 本帖最后由 辛昕 于 2013-6-19 21:43 编辑 ]
|