基于构件的软件工程(CBSE)
2025年12月20日约 5477 字大约 18 分钟
基于构件的软件工程(CBSE)
1. 概念
- 基于构件的软件工程(Component-Based Software Engineering,CBSE)是一种新型的软件开发模式,旨在通过 复用可重用的软件构件 来构造高质量、高效率的应用软件系统。这种模式强调 将软件系统分解为独立的构件,每个构件都 具有明确定义的功能和接口,可以 独立开发、测试和部署。
- 是一种基于 分布对象技术、强调通过 可复用构件与构造软件系统 的软件复用途径(体现了购买而不是重新构造)。
- 用于 CBSE 的构件应该具备以下特征:
- 可组装性:对于可组装的构件,所有外部交互必须通过公开定义的接口进行。同时它还必须提供对自身信息的外部访问。
- 可部署性:软件必须是 自包含 的,必须能作为一个独立实体在提供其构件模型实现的构件平台上运行。构件总是 二进制形式,无须在部署前编译。如果一个构件实现为一项服务,它不必由用户来部署,而是由服务的提供者来部署。
- 文档化:构件必须是 完全文档化 的,用户根据文档来判断构件是否满足需求。
- 独立性:构件应该是 独立 的,应该可以在无其他特殊构件的情况下进行组装和部署,如确实需要其他构件提供服务,则应显示声明。
- 标准化:构件标准化意味着在CBSE过程中使用的构件必须符合某种标准化的构件模型。此模型会定义构件接口、构件元数据、文档管理、组成以及部署。
- 可见性:没有(外部的)可见状态。构件本身不直接暴露外部可见状态,但可以通过运行时 容器(如应用服务器、框架等)管理状态并对外提供可见性。
- CSBE 过程的主要活动:
- 面向复用的开发:
- 开发将被复用在其他应用程序中的构件或服务。它通常是对已存在的构件进行通用化处理。
- 基于复用的开发 (主要):
- 复用已存在的构件和服务来开发新的应用程序。
- 开发过程:
- 系统需求概览
- 识别候选构件
- 根据发现的构件修改需求
- 体系结构设计
- 识别候选构件(构件定制与适配)
- 组装构件创建系统
- 面向复用的开发:
2. 构件模型
- 概念:定义了 构件实现、文档化 以及 开发的标准。
- 包含的模型要素:
- 接口:构件通过 构件接口 来定义,构件模型规定应如何定义构件接口以及在接口定义中应该包含的要素,如操作名、参数以及异常等。
- 使用信息:为使构件远程分布和访问,必须给构件一个特定的、全局唯一的名字或句柄。
- 构件元数据 是构件本身相关的数据,比如构件的接口和属性信息。
- 部署:构件模型包括一个规格说明,指出应该如何打包构件使其部署成为一个独立的可执行实体。
- 部署信息中包含 有关包中内容的信息 和 它的二进制构成的信息。
- 构件模型提供了一组被构件使用的通用服务,这种服务包括以下两种:
- 平台服务:允许构件在分布式环境下通信和互操作。
- 支持服务:这是很多构件需要的共性服务。例如,构件都需要的身份认证服务。中间件实现共性的构件服务,并提供这些服务的接口。
3. 构件(component)
- 概念:是软件系统中 可复用的、自包含的、具有明确接口、显示依赖语境 的 独立功能单元,可以构建复杂的软件系统。构件可以由更小的单元组成,细到不可再分的构件称为 原子构件。
- 原子构件:构件的最小单位,不可再分割为更小的构件。 作为构件而言,依然具有独立的功能和明确的接口,是 复用的基本单元。通常是 成组部署,某些情况也可以单独部署。
- 特性:
- 组成:一个构件可以包含多个原子构件或其他构件,这些组成部分需要作为一个整体来同时部署
- 独立部署性:构件的部署必须能跟它所在的环境及其他构件完全分离,可以单独部署
- 独立性:构件作为一个 独立部署单元,不可拆分
- 共享型:具有复用性,可以在 多个构件家族中共享使用(原子构件的归属唯一)
- 封装性:对于不影响构件功能的某些属性可以对外部可见
- 唯一性:在同一环境中,只能存在一种构件
- 一些描述:
- 构件是二进制形式,无需在部署前编译,即构件应以二进制形式交付,能在运行平台上直接部署,不需要重新编译。
- 构件元数据是构件本身相关的数据,即构件元数据描述的是构件自身的信息,如接口、依赖关系、版本号等,是支持构件管理、查找、配置的关键信息。
- 构件是一个独立的 软件单元,即对应于构件的独立性属性,指构件应能作为一个完整的、独立的软件单元进行部署和运行。
- 构件应支持配置性,即可以通过参数、属性文件或界面配置等方式,使其适应不同系统的需求,这是构件灵活复用的重要保证。
- 接口 是一个 已命名的一组操作的集合,是构件与外界交互的唯一访问点,定义了构件提供的服务及其使用方式。
- 构件的部署 必须能跟它所在的环境及其他构件完全分离,便于组合、替换和复用,是构件独立部署性的体现。
- 构件和模块的区别:
- 模块:强调程序结构的逻辑划分,内聚性和耦合性
- 构件:强调 可复用性和接口标准化
- 构件与对象的区别:
- 构件的四个特征:
- 是一个独立部署单元
- 第三方组装单元
- 无外部可见状态(可以利用容器管理自身对外的可见状态)
- 可以包含多个类元素,且一个类元素仅属于一个构件
- 对象的特征:
- 是一个 实例单元,有唯一标识
- 可能具有外部可见状态
- 封装自身状态行为
- 核心区别:
- 状态的可见性
- 构件的四个特征:
4. 构件的分类
4.1 构建分类
按照外部形态,构成一个软件系统的构件可以分为五类:
- 独立而成熟的构件:
- 成熟度高,经过实际的多次检验,并且 隐藏了所有接口,用户只需通过命令使用。
- 例子:数据库管理系统、操作系统等各类系统、系统级应用
- 有限制的构件:
- 提供接口,并指出使用条件和前提,有可能产生资源冲突或覆盖,需要进行测试。
- 例子:面向对象程序设计语言的基础类库
- 适应性构件:
- 经过 包装 或 接口技术 处理,主要是为了 解决不兼容 的问题,可以在各类环境 直接使用。
- 例子:Active X 组件,万能适配
- 装配的构件:
- 安装的时候已经装配在操作系统或数据库等系统层次,通过 胶水代码 连接使用
- 例子:大多数软件供应商提供的软件产品
- 可修改的构件:
- 支持 版本替换,可以通过 重新包装 或者 编写接口 来实现功能 修改或新增
- 例子:应用系统开发中常用的功能模块,可迭代
4.2 构件分类方法
- 关键字分类法:把应用领域的概念按照从抽象到具体的顺序分解为 树状或有向无回路图,每个概念都会用一个 关键字 来描述(树状图代表 层级结构)
- 刻面分类法:多种维度(面)去描述,每个维度(面、特征角度)包含若干个表述特征,通过多个面特征的组合去描述一个构件的功能、被操作的数据、构件应用的语境活任意其他特征(比较灵活,多角度描述,适合复杂构件的分类)
- 超文本组织方法:一种全文检索的技术,每个构件都有一个相关的说明文档,搜索时根据关键字去匹配构件的说明文档,进而锁定构件的一种分类方法
5. 构件组装
- 概念:将构件库中的构件,经过适当的修改(改参数、改接口等),再相互连接构成新的目标软件的过程。
- 三种构件组装技术
- 基于 功能:通过构件提供的功能接口进行组装,强调功能匹配,是常见的组装方式之一
- 基于 数据:通过共享数据结构或数据格式实现构件之间的连接与通信。(对输入输出有格式要求)
- 基于 对象:利用面向对象的封装、继承、多态等特性,将构件作为对象进行组装
- 组装方式:
- 顺序组装:按照 顺序去调用 已有的构件,来创建新的构件,适用于构件作为程序元素或服务,需要 胶水代码 保证前一个构件输出与下一个构件输入相兼容。
- 层次组装:一个构件 直接调用 由另一个构件所提供的服务时,被调用的构件为调用的构件提供所需的服务。
- 二者之间接口匹配兼容。
- 只有接口兼容才能做层次组装。其他组装不需要考虑接口兼容。
- 叠加组装:指 两个或多个构件合并,创建新的构件,新构件合并了原构件的功能,并且对外提供新的接口,与原构件之间无依赖关系,外部应用通过新接口调用原构件接口。
- 适合于 构件是程序单元 或者 构件是服务 的情况
- 构件组装成软件系统的过程可以分为三个不同的层次:
- 定制(Customization):对已有的构件进行参数或接口上的适配,用来满足当前所需要的系统。
- 集成(Integration):对定制好的构件连接成一个整体,并且还要处理构件之间的交互关系。
- 扩展(Extension):在做出一个初始的系统之后,为未来的改变预留一些空间可以用于改造。
- 构件组装的三种不兼容问题(通过 编写适配器 解决):
- 参数不兼容:接口每一侧的操作有相同的名字,但参数类型或参数个数不相同。
- 操作不兼容。提供接口和请求接口的操作名不同。
- 操作不完备。一个构件的提供接口是另一个构件请求接口的一个子集,或者相反。
6. 构件管理
- 概念:构件管理是组件化软件开发中的重要环节,旨在对构件进行有效组织、存储、维护和使用,以提升软件复用率和开发效率。
- 构件管理的内容包括:
- 构件描述:包括构件的功能、接口信息(输入/输出、操作)、应用语境、性能特征等
- 构件分类:指按功能、用途、技术特性等对构件进行分类管理,方便检索与复用
- 构件库组织:包括如何存储和管理构件数据,不仅存储构件的二进制代码,还包括其元数据、文档和版本信息
- 人员及权限管理:为了保证构件库的安全和有序运作,需要对用户角色进行划分和授权
- 用户意见反馈:收集用户在使用构件过程中发现的缺陷、改进建议或适应性修改需求
7. 构件失配
概念:指在软件构件复用与组装过程中,由于 构件对系统的假设与实际体系结构不一致 而导致的冲突。
分类:
- 构件失配:通常源于系统对构件基础设施、控制模型和数据模型的假设不一致,例如构件依赖的运行时环境与系统现有环境不匹配
- 连接子失配:主要包括系统对构件交互协议、数据格式等假设不一致而导致的冲突
- 由于系统成分对全局体系结构的假设存在冲突引起的失配:要解决失配问题,首先需要检测出失配问题,井在此基础上通过适当的手段消除检测出的失配问题。
比较:
构件失配 连接子失配 常见情况 基础设施、模型失配 交互、协议、规范、数据格式失配 解决方案 适配器、中间件 协议转化、接口适配、数据映射
8. 构件库
- 概念:构件库不仅仅是构件的简单堆积,它是实现软件复用的物质基础和核心支撑环境。
- 功能:
- 构件检索:指用户根据查询需求,能够在构件库中快速准确地找到相关的可复用构件。
- 构建分类:指根据某些特定的标准对构件进行组织和分类,以便于更好地管理和查找。
- 构建构造:指构建新的构件或将多个构件组合成新的构件。
- 构建获取:指从构件库中获取所需构件的过程,通常包括下载或调用。
9. 面向构件的编程(COP,Component-Oriented Programming)
- 定义:基于面向对象编程的方式,专注于 面向构件 的解决方案。强调以 构件 为基本单元进行软件构建,关注构件的 独立部署、可替换性、可重用性 及 安全性。
- 核心目标:提升构件的可重用性、灵活性和系统安全性。
- 四个基本要素:
- 多态性:同一个类型的不同实例对象,具有不同的行为,并且能够相互替代(可复用性、灵活性)
- 模块封装性:把已写好的模块封装起来,隐藏内部的实现细节,只对外暴露必要的接口
- 后期绑定和装载:在构件部署的时候进行绑定,为了实现构件的部署独立性,使得构件更灵活,更易于部署和更新
- 安全性:确保构件的类型安全和模块安全,防止非法访问和使用(保护系统的完整性和稳定性,避免因为构件的滥用导致的系统风险)
- 面向构件的编程目前缺乏完善的方法学支持,存在很多问题,包括:
- 异步处理:依赖事件传播机制去装配构件,构件需要 监听事件 并且 动态地变更 自身状态
- 多线程并发:引入共享变量机制,容易引起数据竞争,进而导致 死锁
- 多语言支持:构件需要 跨语言交互,但主流的编程语言尚不原生支持
- 调用者封装:构件接口可能被内部或外部的代码调用,需要严格定义接口,并且封装调用逻辑,避免偶尔混乱
10. CORBA 构件模型
- CORBA:面向对象的 远程调用中间件,主要通过 3 大组件解耦客户端与服务端的依赖。
- 三大依赖:
- 伺服对象(Servant):是 CORBA 对象的真正实现,负责接收和处理来自客户端的请求,执行具体业务逻辑。
- 对象适配器(Object Adapter):作为 ORB 与 Servant 的 桥梁,屏蔽 ORB 的执行细节,并为伺服对象提供注册、激活、调用等统一的 抽象接口。
- 对象请求代理(Object Request Broke,ORB):是 CORBA 的核心通信中介,负责 解析、调用,查找目标对象以及路由请求(通信、调用,不负责实际的执行)
- 适配器激活器(Adapter Activator):用于在需要时自动激活对象适配器,是 协调调用请求与服务实现之间交互 的关键组件,不处理具体业务请求。
- 应用场景主要分为 3 大类,根据服务器类型分为:
- 应用服务器:EJB 模型、COM+ 模型
- Web 服务器:Servlet、ASP
- .NET 框架:基于 CLR 的构件模型
11. 接口定义语言(IDL)
- 概念:IDL 是 OMG(对象管理组织)在 CORBA(公共对象请求代理架构)中定义的一种与平台和语言无关的接口定义语言,用于描述分布式系统中组件之间的接口规范。
- 基本元素:
- 接口描述:是 IDL 文件中 最核心 的部分,用于 定义组件对外提供的操作及属性,是实现不同语言互操作的关键。映射为 Java 类或 C++ 类
- 模块定义:用于将 IDL 元素进行逻辑分组,在 Java 中映射为包(Package),在 C++ 中映射为命名空间(Namespace)
- 类型定义:用于定义用户自定义的数据类型,实现复杂数据结构的封装
- 常量定义:用于在 IDL 文件中声明固定的数值或字符串
- 异常:用于定义在方法调用过程中可能发生的错误或特殊条件
- 值类型:用于定义具有状态和行为的可序列化对象
12. 企业 Java Bean(Enterprise Java Bean,EJB)
- 概念:EJB 是企业级 Java 构件,用于开发和部署多层结构的、分布式的、面向对象的 Java 应用系统
- 三种会话:
- 会话型构件 (Session Bean):可以有或没有状态,主要用于 实现业务逻辑,可以直接访问数据库,或者通过实体访问数据库,负责完成服务端与客户端的交互
- 实体型构件 (Entity Bean):使用对象关系映射(O/R),把数据库的记录映射为内存中的对象,以此达到内存中的数据与数据库中达到 同步(数据持久化)
- 消息驱动构件 (Message-Driven Bean):基础是基于 JMS 消息,功能是只能接收 JMS 消息,用于并发和异步处理客户端请求,适合需要 异步处理 的场合
13. J2EE(现 Jakarta EE)构建模型
- 概念:J2EE 是一个用于开发企业级应用程序的标准平台,目的是为了简化和规范企业应用系统的开发和部署,提供一整套的服务应用编程接口和协议,用于开发多层次的分布式应用程序。
- J2EE 应用系统支持五种不同类型的构件模型:
- Applet:浏览器端的 Java 小程序
- Servlet:服务端的 Java 程序,主要作用是处理 HTTP 请求
- JSP:动态网页技术,嵌入 Java 代码
- EJB:企业级业务组件
- Application Client:独立的客户端程序(桌面应用)
- JFC:一个 GUI 的开发库
- JDBC:Java 的数据库连接 API
14. 服务端构件模型
- 概念:指用于构建 服务器端 业务逻辑和应用服务的软件架构标准。
- 典型解决方案分为两种:
- 适用于 应用服务器 的构件模型:
- EJB(Enterprise JavaBeans)模型
- COM+ 模型
- 这类模型更适合处理复杂的事务管理、安全性、分布式计算等企业级业务逻辑。
- 适用于 Web 服务器 的构件模型:
- servlet 模型
- 基于 Visual Basic 和 ASP 技术的模型
- 通常用于处理 Web 请求与响应。
- 适用于 应用服务器 的构件模型:
