浅谈组件对象模型可重用性在高职软件技术专业课中的教学方法

2017-04-10 04:09张洪
课程教育研究·新教师教学 2016年13期

【摘要】组件对象模型(COM)的可重用性是任何对象模型的实现目标,尤其是对于大型的软件系统,可重用性是非常重要的。但是,对于高职软件技术专业的学生来说,组件对象模型的可重用性与面向对象编程语言中的重用性在实现过程不同,较难掌握。本文用学生对象这个例子阐述了在《组件开发技术》课程中组件对象模型(COM)的可重用性的教学方法,这些方法在日常授课中取得了较好的效果。

【关键词】组件对象模型;COM;组件开发技术;可重用性

中国分类号:TP311.1 文献标识码:A

1、引言

在软件行业蓬勃发展的今天,不同软件之间相互利用是一个常见的事情[1]。软件之间或软件内部的相互利用常常会涉及到组件的重用。组件对象模型(COM)的最秒之处是很容易对某些代码实现一次编写和多处应用[2]。重用性是指当一个程序单元能够对其他的程序单元提供功能服务时,尽可能地重用原先程序单元的代码。组件对象模型的可重用性是指一个组件对象如何重用已有的组件对象的功能,而不是重复实现老的功能服务[3]。组件对象模型的可重用性是任何对象模型的实现目标,尤其是对于大型的软件系统,可重用性是非常重要的。但是,对于高职软件技术专业的学生来说,组件对象模型(COM)的可重用性与面向对象编程语言中的重用性在实现过程不同,较难掌握。

像我们很熟悉的面向对象编程语言如C++,它的重用性位于源代码一级,它是通过继承来实现重用,一个类继承于另一个类,实现父类功能的重用。继承可以使已经存在的类无须修改就可以适应新应用,继承是比过程重用规模更广的重用,是已经定义的良好的类的重用[4]。但对于组件对象模型的可重用性则情形有所不同,因为组件对象模型是建立在二进制代码基础上的标准,所以其可重用性也必然建立于二进制代码一级。按照组件对象模型的标准,实现这种可重用性有两条途径:包容或者聚合,这是组件对象模型两种重用模型[3]。

包容和聚合的重用思路基本一致,只是在实现方法上有所不同。包容是外部组件的接口直接包含内部组件接口的指针,它将使用内部组件的接口来实现它自己的接口。聚合就是直接将内部组件的接口直接暴露给客户,而客户并不知道这是内部组件的接口,始终认为这是外部组件的接口,客户直接通过外部接口使用内部组件对应的功能[5]。在教学过程中发现,对于组件对象模型(COM)的可重用性的實现,有程序设计经验的学生来说比较容易,但是对于那些没有经验的初学者来说,难度却不小。本文从软件技术专业初学者的角度,阐述了组件开发中二种可重用模型的实现方法。

2、用包容模型实现学生组件的重用

假定我们现在已经实现了一个COM学生对象,它实现了学生管理的功能。它的接口定义如下:

由于更新,我们实现了一个新的COM学生对象,它既要实现新的接口,也要实现学生管理功能的接口,而新对象的学生管理功能与老对象学生管理功能基本一致。因此我们在实现新对象的过程中考虑到可以重用老对象的功能。虽然接口对象的是采用面向对象语言来进行定义的,但是重用的方法上却不能采用类的继承来实现功能的重用的。应该采用组件对象的重用模型来进行重用。对于包容模型的重用。我们应该要明白,老对象的创建和释放都是在新对象的内部进行的,而客户所看到的只是新对象暴露出来的接口,因此客户并感觉不到老对象的存在。对于包容模型的实现,老对象并不要求进行什么特殊处理,只有新对象要进行包容老对象的特殊处理。实际上新对象是老对象的客户,负责老对象的创建、调用和释放工作。新对象实现包容的关键代码如下:

在Init成员函数中,新对象调用API函数创建了老对象,只要创建成功,数据成员m_pStudentInner记录了老对象的IStudent接口指针。新对象实际上通过指针调用老对象相应的成员函数。

3、用聚合模型实现学生组件的重用

如果我们采用聚合实现对象的重用。首先,对于老对象就与包容模型重用实现有所不同。要实现聚合模型重用,老对象就必须要适应能在被聚合的情况下进行一些特殊的处理。所谓特殊的处理也就是当客户向老对象请求IUnknown接口时,它必须能把控制权交给新对象,由新对象来决定客户程序的请求结果。在实现过程中也就是由委托IUnknown和非委托IUnknown来实现聚合情况下的特殊处理。能够适应在被聚合的情况下进行特殊处理的老对象的委托IUnknown和非委托IUnknown定义如下:

在Init成员函数中,对于创建老对象的API函数,我们要注意它的第二个参数。一般我们可以根据第二个参数的值,来确定它们是使用什么样的对象重用模型。当第二个参数是指向新对象的IUnknown指针时,说明它是采用聚合模型来实现组件的重用;当第二个参数是为NULL时,说明它是采用包容模型来实现组件的重用。在对象的重用过程中,我们可以在一个对象中同时混合使用包容模型和聚合模型。

4、结束语

以上这些,都是我在授课过程中的一些心得和体会,可能比较肤浅,但是从软件技术专业初学者的角度来看,是很有必要的。如何让一名软件技术专业初学者尽快摆脱日常的思维定式,更加透彻地理解和掌握组件对象模型(COM)程序设计中的基本思想,以及更加深刻的领会组件对象模型(COM)程序设计的精髓,是组件开发技术这门专业课程在讲授过程中,应该时刻关注的问题。希望这篇文章能在这方面能起到一点借鉴作用。

参考文献:

[1] 沈树茂.COM组件技术的应用[J].电脑知识与技术,2010(6-3):1718-1719

[2] 邱仲潘译. COM与COM+从入门到精通[M].北京:电子工业出版社;2000

[3] 潘爱民.COM原理与应用[M].北京:清华大学出版社;2008

[4] 钱能.C++程序设计(第二版)[M].北京:清华大学出版社;2009

[5] 潘恒.中间件技术—COM组件的探究[J].科协论坛,2011(4):61-62

作者简介:张洪(1970-)、男、四川省泸州市、硕士研究生、讲师、研究方向为软件技术 海南省琼海市富海路128号海南软件职业技术学院