1 插件的原理
众所周知,计算机的硬件设备是由许多插件板连接而成的,而这些插件板又是将许多具有独立功能的集成电路插件按插件板的设计要求组装连接而成的。各种插件卡插到计算机主板上,通过总线让相互通信、协同工作,计算机的迅速发展与这种结构特征密不可分。近年来受到硬插件技术的启发,人们开始研究软件插件技术。与硬插件系统类似,软件插件系统由总线(也称宿主程序)、接口和插件三部分组成,如图2-2所示
![cj1](http://xiangtyee.com/wp-content/uploads/2013/06/cj1.jpg)
图 2-1 软件插件系统示意图
插件通过预先定制的接口连接到总线上。总线是一个总控程序,通常为线程,负责插件间的通信和互操作;接口负责插件的设置、初始化、启动、关闭以及数据的传递工作;插件为普通的程序,由界面、数据和函数组成,可以完成某种功能。由于对插件接口制定了统一的规范,系统投入运行后,用户可以根据自己的需要制作插件,通过接口集成到系统中去。修改或淘汰某个插件时可以简单地将其卸载,而总控程序不用修改,如果总控程序正在运行、修改某个插件时,不用停止运行这个总控程序。通过这种技术,增强了系统的灵活性和可扩展性口,降低了系统维护费用,延长了软件系统的生命周期。
一个使用插件结构的软件,是由一个可执行程序和许多完成子功能的插件组成,主要由三部分组成:
(l) 宿主程序:在Window平台上一般表现为一可执行的文件,该文件负责启动整个系统,将插件系统所需的插件加载到自身进程地址空间中,插件系统所需插件为一些服务性的插件,常驻进程之中。宿主程序还必须对插件进行管理,不同产品的服务性插件的设计不完全相同,但是必须实现插件管理功能。
(2) 插件:能够动态插入系统,提供给插件系统相对简单的功能,是插件系统的重要组成部分。多个插件能够进行许多复杂处理,实现系统功能。插件中必须给宿主程序提供调用接口,宿主程序通过该接口获得插件相关信息,并实现插件与宿主程序的通讯与交互。
(3) 接口:宿主程序和插件能够互相结合在一起工作,必须有一套互相协作的规则和协议来使不同来源的程序互相协调工作,完成这些规则和协议的部分称为插件系统的接口。这是一个逻辑上的接口,由宿主程序和插件各完成一部分,它们共同完成插件的插入、调用、停止以及宿主程序与插件以及插件与插件之间的交互,是插件系统中的重要组成部分。
![cj2](http://xiangtyee.com/wp-content/uploads/2013/06/cj2.jpg)
图 2-2 软件插件系统示意图
2 插件的分类
目前各用户软件领域所应用的插件技术可归纳为如下三种类型
[8]:
(1) 类似批命令的简单插件(文本插件):
这种插件的自由度非常低。使用这种方法的软件有Win Hacker 等。运行这种插件后, 会一步步要求用户进行选择/输入, 最后根据用户的输入来执行一系列事先定义好的操作。 这种插件一般是文本文件, 功能比较单一, 可扩展性极小。 优点是插件的制作比较容易, 即使是对程序设计了解不多的人也可以制作, 如WinAmp 的Skin。
(2) 使用一种特殊的脚本语言来实现的插件(脚本插件):
这种插件比较难写, 需要软件开发者自己制作一个程序解释内核。 比如微软的宏就是这种类型的,Microsoft Office 提供了开发者用于扩展辅助功能的内置VBScript (VBA)。 这种方法的优点在于制作插件时不需要使用其它工具, 软件本身就可以实现,普遍出现于各种办公自动化软件中。网络漏洞扫描软件Nessus中使用的插件也属这种类型。
(3) 利用已有的程序开发环境来制作插件(程序插件):
例如Photoshop 等软件使用的插件制作方法。 使用这种方法的软件在程序主体中建立了多个自定义的接口, 使插件能够自由访问程序中的各种资源。这种插件的优势在于自由度极大,可以无限发挥插件开发者的创意,而这种插件机制的编写相对复杂,对于插件接口之间的协调比较困难,插件的开发也需要专业的程序员才能进行。这种插件是狭义范围的插件,也是真正意义上的插件。
3 插件技术的特点
插件技术的特点主要有:
(1) 结构清晰、易于理解。由于借鉴了硬件总线的结构,而且各个插件之间是相互独立的,所以结构非常清晰也更容易理解。
(2) 易修改、可维护性强。由于插件与宿主程序之间通过接口联系,就像硬件插卡一样,可以被随时删除,插入和修改,所以结构很灵活,容易修改方便软件的升级和维护。
(3) 可移植性强、重用粒度大。因为插件本身就是由一系列小的功能结构组成,而且通过接口向外部提供自己的服务,所以复用粒度更大,移植也更加方便。
(4) 结构容易调整。系统功能的增加或减少,只需相应的增删插件,而不影响整个体系结构,因此能方便的实现结构调整。
(5) 插件之间的耦合度较低。由于插件通过与宿主程序通信来实现插件与插件、插件与宿主程序间的通信,所以插件之间的耦合度更低。
(6) 可以在软件发布后修改应用程序。由于采用了插件的结构,可以在软件的开发过程中随时修改插件,也可以在应用程序发布后,通过补丁包的形式增删插件,通过这种形式达到修改应用程序的目的。
(7) 灵活多变的软件开发方式。可以根据资源的实际情况来调整开发的方式,资源充足可以开发所有的插件,资源不充足可以选择开发部分插件,也可以请第三方的厂商开发,用户也可以根据自己的需要进行开发。
4 基于插件技术的软件开发方法
基于插件技术的软件开发可以根据产品的具体情况采用面向对象的分析与设计方式,也可以采用面向构件的设计方式。唯一需要注意的地方就是要遵循插件系统的原理,重点去处理在设计中经常出现的问题。插件技术的原理己经在上文中阐述过,下面重点阐述在插件系统的规划时需要重点考虑的几个问题:
(l) 实现对插件的管理。宿主程序可以搜索插件、加载插件、卸载插件以及维护插件的状态等操作。它的实现对于插件系统的正常运行也是至关重要的。当然在具体的实现时可以有两种选择,一是将这些功能放到一个模块中来实现另外一种方式是将这些功能放到宿主程序中来实现。当然从软件工程的角度还是将这些对插件的管理功能放到一个模块比较妥当。
(2) 接口的设计与识别。在插件系统中接口是不同插件之间,宿主程序与插件之间的通信基础,同时接口能否被宿主程序识别并加载对于插件的识别也是非常重要的问题,如果插件不能被识别则无法正常插入到系统中。
(3) 插件调用过程中的参数问题。在插件系统中对插件的调用往往是动态的,很多参数是在调用的时候才能确定的,所以要预先定义好调用过程中的参数,保证调用过程中的正确、稳定和高效。
(4) 资源的同步与互斥。插件系统中的每一个插件都会有资源的申请问题,多个插件的并行运行就有可能对资源之间产生竞争,所以资源的同步与互斥问题也是插件系统需要注意的问题。
(5) 插件的设计与生成。插件系统的功能由插件来实现,如何设计插件,让与插件相关的界面显示、数据处理能够顺利高效地进行是插件设计需要关心的问题。除此之外,快速方便的批量生成插件也是插件系统工业化生产所必须的。
基于插件技术的软件开发方法的一般步骤为:定义接口、生成插件以及在宿主程序中实现对插件管理的功能。接口是宿主程序和插件之间通讯的纽带,所以第一步就是要制定好双方通讯的规则与数据结构,然后定义好插件的结构。如何设计一种好的结构以使开发更加简单,插件的耦合度更低以及更方便的进行数据管理与界面的显示都是非常重要的问题。最后实现对插件的管理功能,宿主程序应能执行识别插件、加载插件、卸载插件等操作。此外,在软件开发的过程中需注意所开发产品的特殊性。