校园活动报名已经能处理容量 100、取消和候补。团队接下来要接入身份校验、发送通知、导出名册。三个功能都能找到现成实现,安装包也已经下载好;真正困难的部分随之出现:报名需要的身份接口怎样接上?通知失败能否重试?导出的结果能否直接交给压缩工具?“有现成代码”只回答了实现从哪里来,还没有回答这些实现怎样共同兑现需求。
基于构件的软件工程(CBSE)把复用与组装放到开发主线中。沿这一次集成,可以依次看清四层关系:构件交付什么,接口承诺什么;共同的构件模型怎样约束实现;需求、选型与架构怎样相互反馈;最后怎样连接、适配并检验结果。这里的分类各有依据,不能把所有名词接成一棵树。
构件、接口与依赖:独立交付需要把条件写出来
教材对应:5.6.1 构件和构件模型。
先把报名实现打包成一个可交付的软件单元。调用者通过 IRegistration 使用报名、取消、查询余量等操作,而内部如何存确认名单、怎样组织候补队列,交由构件实现决定。构件提供实现与交付边界,接口描述使用契约。题干问“已命名的一组操作的集合”时,对应接口;问这组操作背后的某个函数体,则到了实现层。接口也可以只有一个操作,数量本身不决定它是不是契约。
签名还不够。cancel 的参数、返回值、异常、重复调用处理,以及取消后何时递补,都影响调用者能否正确使用。当前已批准的 R17@1.1 / B2 要求按候补登记顺序递补;函数名字相同、参数相同,却偷偷改为抽签,仍然违反契约。

报名构件没有必要把校园卡数据库驱动写死在内部。它可以声明需要 IAuth,再由组装者接入满足这一契约的身份构件。UML 简化符号中,提供接口用空心小圆,需要接口用半圆插口;下面的 Mermaid 则用明确的“需要/提供”文字避免把边界符号误读成调用方向。UML 2.5.1,§10.4.3–5、§11.6.3–4。
教材的五项特征在这里都有具体检查对象。可组装检查交互是否经公开接口;可部署检查交付物能否在符合条件的构件平台安装运行;文档化使组装者能够据功能与质量约束选型;独立性要求依赖显式说明;标准化要求遵守共同构件模型。它们可以同时成立。教程采用可部署二进制单元、部署前无需重新编译的经典口径;讨论更广的复用资产时,需要另说明定义范围。
构件可以采购,也可以自研。“第三方可组装”说的是组装者能够依据契约使用这个单元,并不要求它一定出自另一家公司。已有资产能否复用,仍要核对平台、版本、许可及接口条件;独立包装不会自动保证任意热替换。
黑盒使用视角如何容纳状态
调用者只需契约就能使用报名构件,这叫黑盒使用视角。它允许内部维护确认名单和候补队列,也允许某些构件完全不保存会话状态。交付的程序单元、加载后的运行对象和持久数据处于不同层次,不能用“构件独立部署”推出“所有运行对象无状态”。Sommerville 的作者补充文也将构件的可部署边界、接口及内部不透明性分开说明。Components and objects。
接口还可声明公开属性的访问契约,由查询或设置操作实现。getRemaining 返回余量,让调用者观察一个受约束的值;这不允许它越过接口把私有字段 remaining 随意改为 999。若提供 setter,实现也要保持容量和报名状态的不变量。公开访问契约、内部字段暴露、内部有没有状态,是三个不同问题。
旧题的状态与“多拷贝”表述为什么单列边界
参考试题曾把“进程内多份相同构件拷贝”标为正确,并用“任何属性均不能对外可见”排除另一选项。定向核验 Szyperski 的经典定义后,这些标答存在冲突:作者区分静态部署单位与有状态对象,还允许不影响功能的记账属性、缓存;同进程中不可区分的相同部署单位在该定义下至多一份。这里保留来源身份,不用冲突标答建立确定答案,更不把它解释成所有构件都必须纯函数。Component Software,§4.1.1–2,公开副本。
构件模型与分类轴:先确定“模型”在回答什么
报名与身份构件即使接口名字相近,若对调用约定、命名、配置和部署包装各自作出不同解释,组装者仍要反复处理差异。构件模型规定共同标准,包括接口定义、使用信息和部署方式。使用信息又涉及全局名称或句柄、元数据、配置等;这是组成关系,可以在共同标准下面展开。

标准需要基础设施实施。平台服务处理通信、互操作等机制,支持服务提供认证等共性能力,容器帮助构件得到支撑并履行整合契约。具体能获得哪些事务、安全或生命周期能力,要看平台及配置;不能据“有容器”就认定业务竞争、幂等和锁的设计已经自动正确。
教材列 Web Services、EJB、.NET 作为构件模型例子,是教材的技术语境。另一组“逻辑构件模型/物理构件模型”描述特定系统:前者关注功能和协作蓝图,后者关注部署及性能。它们属于 系统分析与设计 的观察,既不成为 EJB 的下属阶段,也不等同 RUP 的某个时间段。
旧题与跨章补充:CORBA、COM、经典 J2EE 各抓什么职责
CORBA 的 IDL 描述接口,ORB 承担对象请求通信;两者分别回答“约定怎样写”和“请求怎样到达实现”。COM 包含由外对象把请求委托给内对象;聚集允许外对象暴露内对象接口,同时满足身份规则,减少额外转发。不能由此推出整个调用链零开销。Microsoft:包含/委托、聚集。
经典 J2EE MVC 场景常用 Servlet 分发请求、JSP 展示、Session Bean 处理业务、旧 Entity Bean 处理持久数据,消息驱动 Bean 用于异步消息处理。这里讲旧题角色分工,不把这一名单当所有年代的 EJB 分类。无状态会话 Bean 的“无状态”限定为不保留某客户端的会话状态,仍可有实例变量;也不能与下一表 CCM 的同名类别直接互换。Oracle Java EE 6:Session Beans。
CCM 四型:状态用途、身份与持久化责任分开看
CCM 是 CORBA 的构件模型,下面四类是该规范中的使用模型分类。它不能和“可组装”等五项特征排成九个互斥产品。先问状态是否用于临时会话或持久工作,再问是否有构件 home 所用主键;持久化由谁负责则是另一条轴。
| CCM 类别 | 状态/身份判据 | 容易多推的一步 |
|---|---|---|
| Service | 无会话状态,stateless 使用模型,无主键 | 不据此保证所有操作幂等、无副作用 |
| Session | 临时会话状态,非持久身份,无主键 | 不把会话类别绑定为唯一 servant 寿命策略 |
| Process | 持久状态/身份,home 无主键 | 不据“无主键”推断程序不许记录任何业务标识 |
| Entity | 持久状态/身份,home 有主键 | 不推断持久化必须由容器负责 |
CCM 4.0 明确 Process 与 Entity 均可采用容器管理或自身管理的持久化。Session 的 servant 寿命策略表列为 Any;“会话状态做什么”与“运行实现对象保留多久”不能机械一一绑定。以下图只保留可靠的分类依据,具体策略仍按相应规范检查。OMG CCM 4.0,§9.2.13.1–4、Tables 9.6–9.9。
五种外部形态:旧题在改变复用条件
再拿同一个通知实现比较:经过运行检验、可用规定命令使用,是独立成熟描述;有特定环境前提、可能装配冲突,是有限制描述;已有包装处理特定不兼容或资源差异、保留原实现,是适应性描述;位于不同系统层次并由胶水协调,是装配形态描述;允许版本替换、增功能并重测,是可修改描述。这套名单来自相关试题与学习材料,不是本版教材新设的第四小节。

看到“包装”要继续问包装处理了什么;看到“版本替换并增加功能”才有可修改的明确判别线索。适应性不保证任意环境都兼容,胶水也会服务于多种组装方式,不能见到这个词就唯一定位。
CBSE 过程:找到现成能力后怎样继续做决定
教材对应:5.6.2 CBSE 过程;构件库、旧五阶段及编程理论为记录补充。
先写系统需求概要,明确报名范围、容量、公平规则和质量约束,才能查候选。选型需要足够全面的上下文,细节仍可协商精化。候选识别后,教材特意列出“根据发现构件修改需求”,因为已有能力会影响方案成本和可行范围。接着设计体系结构、定制适配、组装创建系统。这六项是主要活动,不是六个不能回查的闸门。

例如发现某商品只会抽签。对尚在讨论的需求,团队可把取舍提交用户协商;对已经批准的 R17@1.1 / B2,就要走 受控变更。继续满足当前基线时可以另找候选,或在可实现、可集成的前提下补充顺序递补能力。包装只读构件本身无法产生取消、名额释放及一致性保证。需求修改权也不固定属于某一名称的委员会,要按项目已规定的责任和权限执行。
架构选定构件模型、部署平台和连接约束后,原候选可能不再合适,因此还能回查构件库。构件的定制、集成、扩展是不同工作着眼点:改变配置或适配特定环境,接通多个单元,追加能力。它们可在多轮开发中交错进行,不必把扩展拖到交付之后。CBSD 的演化描述这种反复选型与组装;螺旋强调风险驱动迭代,二者不能直接画等号。采用构件也不强制所有实现必须面向对象。
旧五阶段怎样与教材六活动共存
旧题开发模型使用“需求分析和定义 → 体系结构设计 → 构件库建立 → 应用软件构建 → 测试和发布”。这套口径把资产库建设和发布列为生命周期阶段;本版六活动突出可用构件与需求、架构的相互作用。比较的是不同粒度、不同关注对象,两套名字不需要一对一对应。原旧题缺完整原卷处,本册不补造选项。
检索同一通知构件,也能有三种关系
旧题的关键字分类从领域概念抽象到具体,形成树或有向无环图;刻面按多个属性组合筛选;超文本沿相关文档链接跳转。例如找校园邮件通知,第一种沿“通信 → 通知 → 邮件”定位,第二种同时选功能“通知”、数据“邮件”、语境“校园”,第三种从需求链接到接口及适配说明。它们回答访问资产库的不同问题,可以共用一个库,也不排除其它检索算法。
复用资产可包含需求、设计、代码、测试与领域知识。原型、数据模式是否值得复用取决于内容和条件,不能因为某道“最佳答案”没选它就全部排除。横向/纵向复用区分跨领域/同领域范围,也不是先后阶段。
记录补充:COP 与微观术语只在给定定义下判断
参考试题列面向构件编程(COP)需要多态性、模块封装性、后期绑定和装载、安全性四项支持。它们是语言/环境能力条件,不是四个开发阶段。旧微观题还区分模块、原子构件、构件家族,具体共享范围要按题目给出的局部定义判断。这些名单未逐条穷举原典,本册保留参考试题的来源边界;不据局部说法推广“所有构件禁止继承”或“任何跨构件资源都不能共享”。
组装与适配:箭头表示什么,答案就由什么决定
教材对应:5.6.3 构件组装;功能/数据/对象技术轴来自相关试题与学习材料补充。
现在把名册导出和压缩接起来。如果导出文件作为压缩输入,观察的是顺序组装;如果导出构件请求压缩构件的兼容服务,观察的是层次组装;如果新增一个门面,分别使用导出与压缩能力,对外提供合并后的接口,而两个原构件彼此不依赖、不调用,观察的是叠加组装。画在上面、下面还是左右都不改变判据。

旧题另问基于功能、基于数据、面向对象的组装技术,这是交互机制轴:功能着眼过程或方法调用,数据着眼共享或流动的数据,对象着眼对象契约与消息协作。某流水线可以用数据技术实现顺序连接,某层次调用也可采用对象接口。不能把两组三项拼为六个互斥选项,更不能因“数据”不像调用就当它非法。
同一个接口变化,先定位失配再决定能否修
第一种,双方操作同名,但参数类型或个数不同,是参数不兼容。需要数字 ID、提供文本 ID,可以在确定映射无歧义、无信息丢失并满足规约时转换;若还缺租户参数,必须有合法来源,不能随意补个默认值。第二种,需要 cancel、提供 withdraw,是操作不兼容的命名例子;两者语义相同才可以转发改名。若一个立即取消、另一个只提交取消申请,换名字仍没解决业务差异。
第三种,接口操作集合出现子集差异,教材称操作不完备。判断能否使用必须先固定需要方:需要“查询+取消”、供方只有“查询”,缺少取消能力;反过来,只需查询、供方还有取消,在契约及类型兼容条件下,未使用的额外操作未必引起失配。集合大小不能替代供需方向和兼容规则。
适配器可以转换名字、参数,或组合已有操作;如果底层根本没有释放名额的能力,就需要另实现、另选候选,或重新协商需求。这里可以回看 适配器与门面模式:前者帮助匹配既有契约,后者提供整合入口,采用门面不自动解决缺少能力。
签名一致后,还要核对重复调用、时序、错误恢复、性能与安全。断网重试报名是否会扣两次名额?取消成功返回时,递补是否已完成?这些约束影响可替换性。集成测试检查组合行为,黑盒选例也能使用接口契约,源码不可见不阻止执行测试。
胶水用于连接、协调交互,必要时承担适配;接口本已兼容时可直接连接,不要求每条线都手写包装层。选型需共同考虑功能、质量和替换难度;采购构件节省某些实现工作,也会带来候选评估、适配和集成工作。
回到 R17:先固定当前基线,再检查候选及平台条件,用提供/需要契约明确依赖,最后按组装后的版本取得测试证据,并关联到 配置项与版本。名额上限从 100 改为 1000,或递补规则改为抽签,都先按基线状态处理需求变更;若预计人数或并发负载随之增加,再复查性能和平台容量。变化落在哪一层,就复查该层及受影响的关系;“用了构件”本身不保证系统满足新条件。