构件与对象
作者: 贾育
email: jia_yu@263.net
[版权所有 任何形式的拷贝和引用必须得到作者的许可]
关于构件与对象之间,或基于构件的软件工程CBSE与面向对象技术OT之间的区别讨论存在已久,1998年著名构件专家Brown在《The Current State of CBSE》一文中总结道:“OT is neither necessary nor sufficient ( to CBSE)”。CBSE(即CBD)将革新系统设计、项目管理和组织机构形态,改善和超越产业界所积累的OT经验的基础。关于OT的不足,Brown指出构件的一个主要特征是它的替代性,这一特征必须在语境中明确指出,具体地说,就是在规约中必须存在描述“使用(use)”子句的能力,OT在这个方面存在缺陷。关于OT对CBSE的必要性,Brown指出实践中非OT完全可以创建构件,有些人特意追求不用OT来实现构件。
由此可见internal DX认为构件是面向对象的一种应用是不正确的,应该构件技术是对象技术的发展,构件具有更强的独立性、封闭性和可复用性。注意,VCL和MFC中的component一词并非专有名词,而是指“部件”、“组成部分”的普通词汇。
下面陈述若干我对“构件”和“对象”的认识,有些可能是片面的、不正确的,请各位读者指正:
1. 构件和对象都是对客观世界实体的一种抽象描述,他们的共同特点是信息隐藏和一定的独立性。但是构件要求是自描述,独立性更强,而对象达不到这一要求,也较为“白盒”了一些。
2. 构件和对象的本质区别:构件提供的是服务,对象提供的是功能;构件接口描述了问题域(problem domain),而对象接口描述了方案域(solution domain)。
3. 对象是类的实例,对象是动态的;有人说构件是静态的,应该和类相对应;事实上并不尽然,可以这样看,在特定领域体系结构(DSSA)中定义的构件是静态的,而集成到应用系统中的构件是动态的,目前尚未见到有人对它们的区别。
4. 存取构件和对象中的信息都必须通过它们的接口,构件的结构有必要充分描述它的语义,对象做不到这一点,所以对象需要另加接口才可以成为构件,所以有人认为构件=对象+接口,我认为这只是构件的充分条件。
5. 分布式对象CORBA/DCOM/EJB的实现体是不是构件,或者是不是只有它们才是构件,我这样认为,构件的独立性、封闭性和异构性要求构件之间存在很强的通信能力,所以第三方协调是必要的,恰好这些基础设施(infrastructure)起了这样的作用,其实他们并非专门为构件而设计,它们的出发点是以“分布”为目的。人们在研究CBD集成/组装时由于没有其它的通信技术,所以它们自然地成为构件工业标准,我想强调构件复用可从来没用指明一定要分布式(放在服务器上),它看重的还是集成/组装的技术。不过这些标准很识时务,都在向构件方向发展,比如CORBA CCM标准。这里我想说一句题外话,就是这几个标准为什么有人说是中间件的标准,我想还是因为他们的异构能力和通信能力使他们成为开发以(消息)转换、交互为目的的一类软件的有力武器,你可千万别把中间件当成了构件(现在国内很多公司都在这么说),或者把中间件拓宽其范围成为构架,这也是不妥的。
6. 构件的接口是一种服务提供者对消费者的承诺:即契约(contract);用契约确保一组构件之间的行为组合。对象就没有这个说法。由于服务存在的持久性,所以服务都是永久性存储对象。
7. 构件的粒度一般较粗,它可能包括一个或多个对象(或类),它的接口一般也比对象复杂。
8. ……