470 likes | 771 Views
第 19 ç« åŸºäºŽç»„ä»¶çš„è½¯ä»¶å·¥ç¨‹. ç›®æ ‡. é˜è¿°åŸºäºŽç»„件的软件工程涉åŠå¼€å‘åŸºäºŽç»„ä»¶æ¨¡åž‹çš„æ ‡å‡†åŒ–ç»„ä»¶ä»¥åŠå°†å…¶ç»„æˆåº”用系统; æè¿°ä»€ä¹ˆæ˜¯ç»„件和组件模型; ä»‹ç» CBSE è¿‡ç¨‹çš„ä¸»è¦æ´»åŠ¨ï¼› è®¨è®ºç»„ä»¶åˆæˆçš„æ–¹æ³•以åŠå‡ºçŽ°çš„é—®é¢˜ã€‚. 内容. 组件和组件模型 CBSE 过程 ç»„ä»¶åˆæˆ. 基于组件的开å‘. 基于组件的软件工程 (CBSE) 是软件系统开å‘的基于å¤ç”¨çš„æ–¹æ³•。 它的产生是由于设计者们在使用é¢å‘对象的开å‘è¿‡ç¨‹ä¸æ‰€å—åˆ°çš„æŒ«æŠ˜ï¼Œè¿™ç§æŒ«æŠ˜æ¥è‡ªäºŽé¢å‘对象开å‘ä¸èƒ½æ”¯æŒæœ‰æ•ˆçš„å¤ç”¨ã€‚å•个对象类太细节且太特殊。 组件比对象类更抽象,å¯ä»¥è¢«è®¤ä¸ºæ˜¯ç‹¬ç«‹æœåŠ¡çš„æä¾›è€…。.
E N D
目标 • 阐述基于组件的软件工程涉及开发基于组件模型的标准化组件以及将其组成应用系统; • 描述什么是组件和组件模型; • 介绍CBSE 过程的主要活动; • 讨论组件合成的方法以及出现的问题。
内容 • 组件和组件模型 • CBSE过程 • 组件合成
基于组件的开发 • 基于组件的软件工程 (CBSE) 是软件系统开发的基于复用的方法。 • 它的产生是由于设计者们在使用面向对象的开发过程中所受到的挫折,这种挫折来自于面向对象开发不能支持有效的复用。单个对象类太细节且太特殊。 • 组件比对象类更抽象,可以被认为是独立服务的提供者。
CBSE 要素 • 独立组件 由它们的接口完全定义。 • 组件标准 使组件集成变得更为容易。 • 中间件 为组件集成提供软件支持。 • 开发过程 适应于软件复用。
CBSE 及设计原则 • 除了可以复用的好处外,CBSE还基于了一套完整的软件工程设计原则: • 组件式独立的,因此它们不会影响彼此的操作; • 组件细节的实现是隐藏的; • 组件通过良好定义的接口进行交互; • 组件平台是共享的,减少了开发成本。
CBSE 的问题 • 组件的可信度——用户在没有源代码的情况下,如何能知道组件知否可靠呢? • 组件的证明——谁来证明这些组件的质量呢? • 总体特性预测——怎样能预测组件合成的新出现的属性呢? • 需求权衡——在一个组件和另一个组件的特征之间,我们该怎样进行权衡分析呢?
组件 • 组件提供了一种服务,不必考虑组件正在哪儿执行和它的编程语言。 • 组件是一个独立可执行的实体,它可以由一个或多个可执行的对象组成; • 组件所提供的服务可以通过其接口得到,而且所有的交互都是通过接口实现的。
组件的定义 • Councill 和 Heinmann的定义: • 组件是一种软件元素,与某个组件模型要求相一致,按照组成标准无需修改即可独立进行部署和组合。 • Szyperski的定义: • 组件具有合同定义的接口和显式的上下文依赖,是可独立进行部署的并服从于第三方的组成的软件。
组件作为服务的提供者 • 组件是独立可执行的实体。在与系统其他组件一起使用之前,无需编译组件。 • 组件所提供的服务可以通过其接口得到,而且所有的交互都是通过接口实现的。
组件接口 • 提供接口 • 定义了组件提供给其他组件的服务。 • 需要接口 • 指定系统其他组件必须提供哪些服务。如果这些服务不能实现,组件将无法工作。
组件和对象 • 组件是可部署的实体 • 组件不定义类型 • 组件实现是不透明的 • 组件是独立于语言的 • 组建是标准化的
组件模型 • 组件模型定义了组件实现、文档书写及部署的标准。 • 组件模型的例子: • EJB 模型 (Enterprise Java Beans) • COM+ 模型 (.NET 模型) • Corba 组件模型 • 组件模型规定应如何定义组件接口及在一个接口定义中应该包含的元素,如操作名,参数及异常等。
中间件支持 • 组件模型是提供支持组件执行的中间件的基础。 • 组件模型实现提供的服务: • 平台服务 允许按照模型写入组件,进行相互通信; • 水平服务 应用无关的服务可以被很多不同的组件使用 • 为利用组件模型基础设施所提供的服务,将组件部署在预先定义的标准的容器中。 容器是一组接口,通过这些接口来访问支持服务的实现。
面向复用的组件开发 • 组件是为某个特定的应用而发展起来的,通常就要将其一般化,使它们可以被复用。 • 如果组件与一个稳定的领域抽象(业务对象)关联起来,它就更可能被复用。 • 例如,在一个医院管理系统中,稳定的领域抽象就与主要目标——病人、治疗和护士等关联起来。
可复用组件的开发 • 如果组件是对普遍使用的业务对象或是一组相关对象的实现,它就可能被复用。 • 组件的可复用性 • 应该反映稳定的应用领域抽象; • 应该隐藏状态显示; • 应该尽可能的独立; • 应该通过组件接口提供异常处理。 • 组件的可复用性与可重用性之间需要折衷: • 接口越通用,可复用性越高,但是,接口也越复杂,因而降低了组件的可理解性。
为组件的复用性所做的改变 • 去除特定应用的方法; • 改变组件的名字使它们更通用; • 增加方法以拓宽应用领域; • 做出一致的异常处理; • 为组件的适应性增加一个配置接口; • 集成所需要的组件来减少组件之间的依赖性。
遗留系统组件 • 现存的遗留系统,实现了一些有用的业务功能它可以被重新包装成组件,以供复用。 • 为使这些组件可复用,我们必须给它一个接口,由此定义组件的接口,然后再访问遗留系统。 • 封装的开发成本通常要远低于重新实现遗留系统的成本。
CBSE过程 • 当重用组件的时候,对理想的需求和可用的组件实际能提供的服务之间做出权衡,是很有必要的。 • 该过程包括: • 开发概要性的需求; • 组件搜索,然后对其作修改 • 按照可利用的功能修改需求; • 再一次组件搜索,进一步的变更需求。
组件识别活动 • 信任。你需要能够信任一个组件的提供商。最好的情况是,一个不够信任的组件不会像广告宣传的那样运行,最坏的情形是,它会破坏系统的安全性。 • 需求。 不同的组件组会满足不同的需求。 • 验证。 • 组件说明可能不会详细到让你开发出完备的测试用例集。 • 组件可能会有比你想要的多得多的功能。你怎样能测试出它不会干扰你对组件的应用呢?
Ariane 运载火箭失败 • 1996年,在 Ariane 5 火箭首次发射中,惯性导航软件在升空37秒后失败,火箭因而失去控制。 • 缺陷发生在一段Ariane 5所不需要的代码上,对所复用的软件的有效性验证测试是基于Ariane 5的需求的。 • 在这个组件中的一些功能是Ariane 5 所不需要的。
组件合成 • 组件合成是指通过组件组装来创造新系统的过程。 • 组件合成包括组件之间的集成和与其他组件基础设施的集成。 • 对所有组件,你都必须写“胶水代码”来连接组件。
组件合成的类型 • 顺序合成 这种情况的发生是指合成组件中,构成组件是按顺序执行的,即将各个组件的 提供接口组合在一起。 • 层次合成 发生在一个组件直接调用由另一个组件所提供的服务时。它对应于一个组件的提供接口与另一个组件的需要接口组合在一起的情形。 • 叠加合成 这种情况发生在两个或两个以上的组件接口合在一起来创建一个新组件的时候。
接口的不兼容 • 参数不兼容 接口每一边的操作有相同的名字,但参数类型与参数数目不同。 • 操作不兼容 提供接口和需要接口的操作名不同。 • 操作不完备 一个组件的提供接口是另一个组件的需要接口的一个子集,后者相反
适配器组件 • 对所有情况,都必须通过编写适配器组件来解决不兼容的问题,适配器组件使两个可复用组件的接口相一致。 • 适配器的准确形式依赖于合成的类型。 • 一个叫做postCodeStripper的适配器组件,它从addressFinder组件得到位置数据并剥离出邮政编码,这一邮政编码转而作为mapper组件的输入,从而实现了addressFinder 组件和mapper 组件的合成。
通过适配器的合成 • 组件 postCodeStripper 是一个适配器,它促进了 addressFinder 组件和mapper 组件的顺序合成。下面的代码说明实现它所需要的调用序列:
接口的语义 • 关于组件合成讨论假设你可以依赖组件文档来判断接口是否是语义兼容的。 • 考虑一下PhotoLibrary 组件的一个接口:
相片库文档 “此方法将相片加入相片库并为相片起一个名字和制作一个目录。” “若相片名字已与库中其他相片名重复会怎样?” “ 相片描述符在目录入口和相片本身都有吗?也就是说,如果删除相片,是否要删除目录信息?”
对象约束语言(OCL) • 对象约束语言(OCL) 设计用来描述UML对象模型中的约束。 • 前置条件和后置条件是用pre和post来指示的。
Photo library 描述 • 按照说明, OCL 与Photo Library组件的关联描述为: • 相片库中的相片不能有和待加入的相片有相同的标识。 • 库必须是存在的——假定创建一个库就加入一个项在其中,这样库的大小始终大于0. • 库的大小增1(因此只产生一个入口)。 • 如果用同一个标识符去取相片,就可以得到新添加的那张相片; • 如果再次用相同的标识符在目录中查找,就可以得到所生成的目录入口。
合成折衷 • 当通过合成组件来创建一个系统时,你会发现在功能性需求和非功能性需求之间,在尽可能快速移交软件和创建一个能随需求变更而进化的系统之间,都存在着潜在的冲突。 • 你必须做折衷的地方有: • 在移交系统功能性需求方面,哪种组件的合成方式是最有效的? • 组件的哪种合成将允许适应未来的需求变更? • 合成系统将有哪些总体特性?
要点 • 基于组件的软件工程基于复用的方法来定义、实现和组合松散耦合的独立组件,使之成为一个系统。 • 组件是一个软件单元,它的功能和可依赖性完全由一套公共接口定义。 • 组件模型定义了一组组件标准,包括接口标准、使用标准和部署标准。 • 在 CBSE 过程中,我们不得不将需求工程过程与系统设计交织在一起。
要点 • 组件合成是将组件“捆”到一起来创建一个系统的过程。 • 当合成不是专为你的应用写的可复用组件时,通常要编写适配器以使不同组件接口互相兼容。 • 当选择合成方式时,必须考虑系统所需的功能、非功能性需求和当系统发生改变时,一个组件能被另一个组件代替的难易程度。