软件工程第17章基于组件的软件工程2019/11/15122019/11/15目标介绍CBSE如何开发基于组件模型的标准化组件以及如何将这些组件组成应用系统的问题描述组件和组件模型CBSE过程中的主要活动组件合成的方法及存在的主要问题32019/11/15主要内容组件及组件模型CBSE过程组件合成42019/11/15基于组件的开发基于组件的软件工程(CBSE)是基于复用的软件开发方法。源于复用在面向对象开发中所遭受的挫折,挫折来自于面向对象开发不能够实现像人们最初所期待的那样能完成广泛的复用。单个的对象类过于详细和特殊,通常需要再编译时间与应用绑定。组件比对象类更抽象,而且能被当成是独立的服务提供者。52019/11/15基于组件的开发基于组件的软件工程(CBSE)是定义、实现和集成或组合松散耦合的独立组件成系统的过程。成为重要的软件开发的原因软件系统越来越大和复杂用户要求开发更可靠软件的发布和部署更快而处理系统的复杂性,并更快交付软件的方法是复用软件组件而不是重新实现组件。62019/11/15CBSE要素独立组件由他们的接口完全定义。组件标准使组件集成变得更为容易。中间件为组件集成提供软件支持。开发过程一种适应基于组件的软件工程的开发过程。72019/11/15CBSEand设计原则除了获得复用的好处,CBSE也支持软件工程的设计原则:组件是独立的,因此他们不会影响彼此的操作;组件的实现细节是隐藏的;组件通过良好定义的接口进行通信;组件平台是共享的,这可以降低开发成本。组件标准标准需要建立,使组件可以与对方互操作。不幸的是,几个相互竞争的组件标准的被建立:Sun的企业JavaBeans微软的COM和.NETCORBA的CCM在实践中,这些多个标准阻碍CBSE的采用。对于开发小组,使用不同的方法来共同工作是不可能的。82019/11/1592019/11/15CBSE的问题组件的可信度-用户如何能确定组件是否可靠呢?组件的证明-谁来证明组件的质量?总体特性预测-如何来预测组件的总体特性?需求权衡-我们怎样权衡理想需求和现实可用的组件?102019/11/1517.1组件组件是能提供服务的软件单元,不管它在何处执行以及采用何种编程语言实现组件是由一个或多个可执行对象构成的一个独立的执行实体;组件接口公开,所有的交互都是通过公开的接口进行的。112019/11/15组件的定义Councill和Heinmann:组件是一种软件元素,与某个组件模型相一致,按照组成标准无需修改即可独立进行部署和组合。Szyperski:组件具有合同定义的接口和显示的上下文依赖,是可独立进行部署的并服从于第三方的组成的软件单元。122019/11/15组件特性1132019/11/15组件特性2142019/11/15将组件看成是服务提供者组件是独立可执行的实体,在使用这些组件前无需编译。组件所提供的服务可以通过其接口得到,所有的交互都是通过接口实现的。组件接口表现为在参数化的过程,是不会暴露其内部状态的。152019/11/15组件接口提供接口定义组件向其他组件提供的服务。需要接口指定组件需要哪些服务才能正确运行。162019/11/15组件接口ProvidesinterfaceRequiresinterfaceComponentDefinestheservicesfromthecomponent抯environmentthatitusesDefinestheservicesthatareprovidedbythecomponenttoothercomponents172019/11/15数据采集组件的模型ProvidesinterfaceRequiresinterfaceDatacollectoraddSensorremoveSensorstartSensorstopSensortestSensorlistAllreportinitialisesensorManagementsensorData182019/11/15组件模型组件模型是关于组件实现,文档化以及部署等相关的标准。组件模型的实例EJBmodel(EnterpriseJavaBeans)COM+model(.NETmodel)CorbaComponentModel组件模型规定了接口应该如何定义,在接口定义中应包括哪些要素等。192019/11/15组件模型的基本要素ComponentmodelInterfacesUsageinformationDeploymentanduseInterfacedefinitionSpecificinterfacesCompositionNamingconventionMeta-dataaccessCustomisationPackagingDocumentationEvolutionsupport组件模型接口使用信息部署和使用接口定义特定接口元数据访问打包净化支持文档化定制命名约定组成组件模型的要素接口通过指定其接口定义组件。组件模型指定的接口应该定义的元素,如操作名称,参数和异常,都应包括在接口定义中。用法为了远程分发和访问的组件,他们需要有一个唯一的名称,或与它们相关联的处理。这是全球唯一的。部署组件模型,包括一个规范描述该组件作为独立的、可执行的实体,应该如何被打包和部署。202019/11/15212019/11/15中间件支持组件模型是支持组件执行的中间件的基础。组件模型实现提供:平台服务:这些基本服务使组件间可以相互通信;水平服务:这些应用无关的服务可能被很多不同的组件使用。为使用模型提供的服务,组件部署在预先定义的容器中,容器是一组接口,通过这些接口来访问支持服务的实现。222019/11/15组件模型中定义的中间件服务PlatformservicesAddressingInterfacedefinitionComponentcommunicationsExceptionmanagementHorizontalservicesSecurityTransactionmanagementConcurrencyComponentmanagementPersistenceResourcemanagement平台服务支持服务寻址接口定义异常管理组件通信组件管理事务管理资源管理并发持久性信息安全性17.2CBSE过程CBSE过程是支持基于组件的软件工程的软件过程。考虑了复用的可能性,以及在开发和使用可复用的组件中所涉及的不同的过程活动。两种类型的CBSE过程面向复用的开发:这个过程是开发将被复用在其它应用程序中的组件或服务。它通常是对已存在的组件进行一般化处理。基于复用的开发:这个过程就是新的应用程序开发过程中使用现有的组件和服务。232019/11/15CBSE过程242019/11/15支撑过程组件的取得过程就是取得可复用或开发成一个可复用组件的过程。它可能涉及访问本地开发的组件或服务,或从外部源中找到这些组件。组件管理关注的是管理可重用的组件,确保他们正确编目,存储和可重用。组件认证是检查组件以及证明它符合其规范的过程。252019/11/15262019/11/1517.2.1面向复用的组件开发针对专有应用开发的组件需要通过改写使其更通用以适合复用。如果组件与一个稳定的抽象领域相关,则组件更加容易复用。例如,在医院管理系统中,稳定的抽象域中可能包括病人,治疗和护士等。272019/11/15面向复用的组件开发面向复用的组件可能通过改造现有组件使其更通用来实现。应该反映稳定的域抽象;应该隐藏状态表示;应该尽可能独立;应该通过组件接口公开异常。在复用性和可用性之间保持平衡接口更通用,意味着组件的复用性更好,但是也意味着更高的复杂性因此可用性降低。282019/11/15提高复用性的变更移除专有的应用方法。更名方法使其更通用。添加方法提供更完备的功能覆盖。为所有方法构造一致的异常处理。添加“配置”接口允许对组件改编以适应不同的使用情况。集成所需要的组件以增强独立性。292019/11/15遗留系统组件完成很重要业务功能的现存遗留系统可以通过封装转化成可复用的组件。这包括编写适配组件,实现提供服务接口和请求服务接口,并访问现存遗留系统。尽管这些需要成本开销,与重新编写遗留系统相比,开销要小得多。302019/11/15复用组件开发复用组件的成本可能要高于其等价的面向专门应用的组件。通用组件可能在空间效率和时间性能方面要劣于其等价的专有组件。组件管理组件管理涉及决定如何进行分类组件,以便它可以被发现,使得该组件可在存储库中,或作为一种服务,保持组件的使用的信息,并跟踪不同的组件版本。在组件成为可复用组件之前,机构需要开展一些形式的组件认证工作。认证是指除了开发者外,还需相关人员检查组件的质量。312019/11/15322019/11/1517.2.2基于复用的CBSE当复用组件时,有必要在理想的需求和可用的组件实际能提供的服务之间进行妥协。这包括:建立概要需求;查找组件并依据组件能提供的功能修改需求;重新查找看是否有更好的组件满足修改后的需求。332019/11/15基于复用的CBSE系统需求概览识别候选组件根据发现的组件修改需求体系结构设计识别候选组件组合组件构建系统342019/11/15组件识别过程组件搜寻组件选择组件有效性验证352019/11/15组件识别的问题信任.你需要信任一个组件供应商。最好的情况是,不受信任的组件可能无法像其广告描述的那样正常运行;最坏的情况是,它可以破坏你的系统安全。需求.不同群体的组件将满足不同的需求。验证.组件的说明书可能不够详细,无法进行全面地开发测试。组件可能包含你一些不需要的功能,你怎样来测试它而不干扰你的应用程序?组件验证组件验证涉及到为组件开发一套测试案例(或可能的话,扩大与该组件提供的测试用例),并开发一个测试程序来运行组件测试。组件验证的主要问题是组件描述可能不足够详细,以致无法让你开发一个全面的组件测试集。验证一个所需要的复用组件,你可能还需要检查该组件不包含任何恶意代码或你不需要的功能。362019/11/15372019/11/15Ariane5运载火箭失败在1996,Ariane5首次发射中,惯性导航软件在升空37秒后失败,火箭因而失去控制。导致问题的原因是某个定点数到整数转换中发生了数溢出这样的无法处理的异常,这导致了运行系统关闭了惯性参考系统,所以火箭的稳定性得不到维持。此缺陷在Ariane4中没有发生是因为他的引擎功率比较小,所转换的值不会大到溢出的程度。缺陷发生在一段Ariane5所不需要的代码上。382019/11/1517.3组件合成组件合成是指组装组件创建系统的过程。合成包括在组件框架的支持下将组件集成成应用。通常你不得不编写‘胶水代码’来集成组件。注:胶水代码就是用一段代码屏蔽用户的鼠标,使用户无论在网页的什么位置点击鼠标都会跳转到代码指定的网页,一般这种技术多用于流氓网站,目的是强迫用户点击自己的广告,从而获得收入!392019/11/15组件合成的类型顺序合成这种情况的发生是指在合成组件中,构成组件是按顺序执行的(图a)。层次合成这种情况发生在一个组件直接调用由另一个组件所提供的服务时(图b)。叠加合成这种情况发生在两个或两个以上的组件接口合在一起来(加)创建一个新组件的时候(图c)。(a)AABBAB(b)(c)402019/11/15合成组件的应用创建一个系统时,可能用到所有形式的组件合成方式。无论哪种组件合成,当一个组件调用另外一个组件时,你可能需要引入一个过渡组件以确保‘提供’接口和‘需要’接口是兼容的。当你编写组件尤其是为了合成来写组件时,必须注意设计好接口,以使其在系统中相互匹配,