第二章 相关理论与技术
本章主要介绍了本文研究的相关理论与技术,包括构件组装相关理论、SOA相关技术标准、OSGi相关技术标准、模型驱动相关技术标准、代码生成相关概念与技术以及领域工程相关理论,这些理论与技术构成了本文研究的基础。
2.1构件组装相关理论
1968年的NATO软件工程会议上,Mcllroy在提交会议的论文《大量生产的软件构件》中,提出了“软件组装生产线”的思想【5】。简单的讲,构件组装就是采用“搭积木”的方式来生产软件。分析传统工业及计算机硬件产业成功的模式可以发现,这些工业的发展模式均是符合标准的零部件(构件)生产以及基于标准构件的产品生产(组装)。构件组装是软件工业化生产的必由之路。
构件是系统构成成分的标准形态,组装是构件演化的原则与方式,及自底向上的系统构建方法。构件组装成功运用的前提是标准化的构件与构件组装机制。面向构件组装的开发,通过长期积累形成完备的构件库,以构件组装的方式快速构建软件系统,以构件增减的方式快速响应业务需求的变化,从而使软件开发具备了“敏捷性”,使软件系统具备了“弹性”。
2.1.1构件组装源自软件复用
软件复用(Software Reuse)通常指软件本身可重用,即代码可重用。但随着技术的发展,软件复用已远不止这些,软件开发的整个生命周期都有可复用的价值,包括项目组织、需求分析、系统设计、项目文档、实现代码、测试方法以及测试用例等等,都是可以被重复利用或借鉴的有效资源。
利用软件复用,可以充分利用已有成果来构建新系统,消除分析、设计、编码、测试等阶段的许多重复劳动,从而提高开发效率;同时,通过复用高质量的已有成果,可以避免重新开发可能引入的错误,从而提高产品质量。因此,软件复用同样可显著的提高软件开发效率与产品质量。
软件复用与构件组装存在殊途同归之妙。
但分析软件复用的过程后发现,软件复用中存在两个基本的开发活动:面向复用的开发与基于复用的开发,从构件组装的角度看,前者其实是可复用构件的生产,后者是利用可复用构件组装新系统。可以看出,构件组装实质上是软件复用标准化的进一步探索,构件组装源自软件复用,软件复用是构件组装的基础。
2.1.2构件组装的研究内容
构件组装是支持软件复用的核心技术,其研究内容主要包括:
(1)构件获取:有目的的构件生产以及从遗留系统中挖掘并提取构件;
(2)构件模型:研究构件的本质特征以及构件之间的关系;
(3)构件描述语言:基于构件模型,解决构件描述、理解以及组装等问题;
(4)构件分类与检索:研究构件分类策略、组织模式及检索策略,建立构件库系统,支持构件的有效管理,保存构件资产,减低构件查找与理解的成本;
(5)软件架构:研究软件系统自身的整体结构的刻画以及构件之间的互联。
(6)构件组装:以软件架构为蓝图,在构件模型以及描述语言的基础上研究构件组装机制,包括源代码级的组装和基于构件对象互操作性的运行级组装;
(7)标准化:构件模型与构件组装机制的标准化以及构件库系统的标准化。
2.1.3中间件技术促进构件组装
中间件技术(MiddleWare)是软件复用发展的产物,是软件系统开发的基础类软件,属于可复用软件,它通常位于操作系统与数据库之上、应用软件之下,管理计算资源以及网络通信等,为上层应用提供开发与运行的环境,以便实现灵活、高效的系统开发以及复杂应用的集成。中间件通常具备如下特点:
(1)支持标准协议;
(2)支持标准接口;
(3)支持分布式计算;
(4)支持多种硬件与操作系统。
近年来,中间件技术的迅速发展使得构件组装的系统开发成为可能。中间件技术作为介于系统软件与应用软件之间的特殊层次,抽象了典型的应用模式,使开发人员可以将精力更多的放在业务逻辑上,并基于标准的形式进行开发。而如Corba、Com/DCom及Ejb等工业标准的出现,进一步使中间件成为构件组装的运行框架,加速了构件组装的发展。
但是,基于中间件技术的构件组装关注的是标准运行级构件基于中间件基础设施自底向上的构造系统,这就使得构件组装的模型与实现极大地依赖于具体的中间件实现技术,而缺少针对构件组装本质特征的高层描述与系统化的指导开发的方法,以及从高层描述与到技术实现上的映射。
2.1.4 SA指导构件组装
软件架构SA为面向构件组装的系统开发提供了一种自顶向下的系统化指导方法。SA将系统的整体结构作为研究对象,在高层显式的描述系统构成元素及其之间的交互关系【6】,并指导验证系统设计。从构件组装的角度看,SA通常存在对象连接式、接口连接式、插头插座式三种类型。
对象连接式体系结构,构件接口只定义了其对外提供的服务,而没有定义构件对外要求的服务,这种非对称性使得构件在集成时,构件对外要求的服务被隐藏在代码的实现细节中,即构件之间的连接关系无法直接在接口处定义。
接口连接式体系结构,构件接口不但定义了其对外提供的功能,而且定义了其要求的外部功能,从而显式地表达了构件对环境的依赖,提高了构件接口规约的表达能力。但是当接口定义的功能数量很大时,便带来了规模上的问题。
插头插座式体系结构,考虑到构件之间的通信往往涉及到构件接口中功能的成组连接,并且在这组功能之间通常存在着一定的语义约束关系,例如使用顺序连接与数据流协议等,通过把这样的彼此间关系紧密的功能组织成组,并封装为服务,从而使得接口中直接包含的内容减少,降低了接口中功能的规模。
从构件组装的角度看,SA描述的是软件系统的基本组织,包括构件、构件之间、构件与环境之间的关系及相关设计与演化原则。SA的贡献在于将构件之间的交互显式的定义为连接件,并将连接件与构件等同的视为系统构成的一阶实体【6】,并使得接口不匹配的构件之间可以通过连接件进行连接,发展了接口匹配的构件连接。但目前SA的研究集中在通过软件体系结构描述语言ADL(Architecture DescriptionLanguage)对SA的描述和高层性质的验证上,对体系结构的求精与技术实现的支持能力明显不足【6】。
2.1.5构件组装提升面向对象技术
构件组装并非是对现有的分析、设计方法的颠覆,而是在此基础之上的继承与发展。面向对象技术基于传统的结构化技术提升了对事物的认识方法,使软件开发尽可能接近人类认识世界、解决问题的方法与过程,即使描述问题的问题空间与实现解法的解空间在结构上尽可能一致,从而直观、自然的在解空间内求解出问题空间内问题的稳定且易复用解。
相对于面向对象技术,构件组装更多的将重点放在软件生产的考虑上,即构件在软件生产中作为零件被纳入软件体系中而被复用,强调构件作为零件所需具备的特征及为实现零件组装所具备的构件之间的协调关系,认识事物的角度从个体本身上升到个体在群体中的作用。
但面向对象技术并不能完整实现构件组装,对象连接式体系结构中已分析。
构件通过接口封装内部实现,通过属性标识构件状态,通过接口定义同外界交互的全部内容,接口是构件同外界交互的唯一途径,除此之外,外界不应对构件作任何的其他的与接口无关的假设。构件接口分为:为实现被组装而提供服务的接口与为实现组装而引用服务的接口。面向对象技术只定义了对外提供服务的接口,所需引用服务的接口隐藏在内部实现中,使得组装无法直接在接口处显式定义,灵活性大大降低。
所以,单纯依靠现有的面向对象技术无法完整的实现构件组装,需要借助于其它辅助技术手段提高抽象程度,使得构件能够在接口处显式定义组装,比较好的选择便是借助于模型驱动技术。
2.1.6模型驱动的构件组装
模型驱动的构件组装,通过构件组装模型在高层显式定义构件提供服务的接口与引用服务的接口,描述基于接口或连接件的构件组装机制,并通过代码生成器结合代码模板产生构件组装的连接件代码甚至构件代码,实现构件组装的高层模型到程序代码的完整生成。而ADL本质上即是一种描述构件组装的模型。
ADL描述构件接口的语法和语义、系统中的构件和连接件以及它们之间的交互关系、构件的非功能类性质以及构件之间的协议,为构件组装提供更为有力的支持【6】。但为了支持构件组装,ADL 还应该更多地关注体系结构描述的求精和实现,提供支持转换或组装自动化的能力【7】。
2.1.7样例代码支持静态组装
SA是系统的高层规划,提供系统划分与设计的方法,定义系统静态结构与动态交互等关系,在高层为系统搭建提供理论指导。目前常用的有MVC(Model、View、Controller)三层架构。SF是系统架构指导下对系统的共性部分进行抽象提炼形成的实现基础,在此之上开发完整的业务系统。目前常用的有SSH(Struts,Spring,Hibernate)框架。SA与SF是软件发展成熟的表现,它以复用为目标,使软件开发不必从零开始。
样例代码是面向业务、以系统框架为基础建立的完整的、可运行的程序代码,它说明了以SF为基础如何开发业务系统的问题。要实现生成100%的程序代码必须参照完整的样例代码制作代码模板,即对样例代码整体模板化。以SSH框架为例,需要将包括Jsp、Js、Config、ApplicationContext、Hibernate hbm、Po、Vo、Do、Dao、Service、Action等在内的所有程序资源制作成代码模板。这就要求样例代码的完整性及对不同业务类型的覆盖度。
建立完整的、覆盖不同业务类型的样例代码,并将样例代码整体模板化,是实现从构件组装的高层模型到程序代码的完整生成的快速、灵活且有效的方法。