系统架构设计师 · 第 2 版 · 5.6

基于构件的软件工程

沿校园活动报名系统,辨认概念的职责、条件与关系。案例为自编教学场景。

校园活动报名已经能处理容量 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。

CCM使用模型的状态与主键分类及独立策略
先区分持久与临时/无会话状态,再在持久分支区分 home 主键。持久化责任与 servant 寿命策略另列,不成为四类的同轴互斥选项。

五种外部形态:旧题在改变复用条件

再拿同一个通知实现比较:经过运行检验、可用规定命令使用,是独立成熟描述;有特定环境前提、可能装配冲突,是有限制描述;已有包装处理特定不兼容或资源差异、保留原实现,是适应性描述;位于不同系统层次并由胶水协调,是装配形态描述;允许版本替换、增功能并重测,是可修改描述。这套名单来自相关试题与学习材料,不是本版教材新设的第四小节。

同一通知构件在五种旧题外部形态下的条件对照
适应性强调已处理差异后原实现不改,可修改强调版本演进与功能增加。环境范围、胶水与版本是不同条件,实际产品可兼具某些描述。

看到“包装”要继续问包装处理了什么;看到“版本替换并增加功能”才有可修改的明确判别线索。适应性不保证任意环境都兼容,胶水也会服务于多种组装方式,不能见到这个词就唯一定位。

CBSE 过程:找到现成能力后怎样继续做决定

教材对应:5.6.2 CBSE 过程;构件库、旧五阶段及编程理论为记录补充。

先写系统需求概要,明确报名范围、容量、公平规则和质量约束,才能查候选。选型需要足够全面的上下文,细节仍可协商精化。候选识别后,教材特意列出“根据发现构件修改需求”,因为已有能力会影响方案成本和可行范围。接着设计体系结构、定制适配、组装创建系统。这六项是主要活动,不是六个不能回查的闸门。

教材六活动、选型反馈及已批准需求的限制
主要活动顺序之外,架构约束候选,需求可经认可精化。商品只支持抽签时不能私改 B2 的先进先出;旧五阶段名单另列,避免逐项硬配。

例如发现某商品只会抽签。对尚在讨论的需求,团队可把取舍提交用户协商;对已经批准的 R17@1.1 / B2,就要走 受控变更。继续满足当前基线时可以另找候选,或在可实现、可集成的前提下补充顺序递补能力。包装只读构件本身无法产生取消、名额释放及一致性保证。需求修改权也不固定属于某一名称的委员会,要按项目已规定的责任和权限执行。

CBSE六活动与需求架构候选的反馈
主链说明活动推进;虚线回查说明新条件如何影响先前决定。基线变化先经批准,自研、适配器及组装结果都需相应测试,名单没有测试二字不等于省略测试。

架构选定构件模型、部署平台和连接约束后,原候选可能不再合适,因此还能回查构件库。构件的定制、集成、扩展是不同工作着眼点:改变配置或适配特定环境,接通多个单元,追加能力。它们可在多轮开发中交错进行,不必把扩展拖到交付之后。CBSD 的演化描述这种反复选型与组装;螺旋强调风险驱动迭代,二者不能直接画等号。采用构件也不强制所有实现必须面向对象。

旧五阶段怎样与教材六活动共存

旧题开发模型使用“需求分析和定义 → 体系结构设计 → 构件库建立 → 应用软件构建 → 测试和发布”。这套口径把资产库建设和发布列为生命周期阶段;本版六活动突出可用构件与需求、架构的相互作用。比较的是不同粒度、不同关注对象,两套名字不需要一对一对应。原旧题缺完整原卷处,本册不补造选项。

检索同一通知构件,也能有三种关系

旧题的关键字分类从领域概念抽象到具体,形成树或有向无环图;刻面按多个属性组合筛选;超文本沿相关文档链接跳转。例如找校园邮件通知,第一种沿“通信 → 通知 → 邮件”定位,第二种同时选功能“通知”、数据“邮件”、语境“校园”,第三种从需求链接到接口及适配说明。它们回答访问资产库的不同问题,可以共用一个库,也不排除其它检索算法。

同一通知构件的概念定位、刻面筛选与超文本关联
三个图各用自己的关系,不将树、属性筛选、文档链接都画成上下级。同一候选通过三种路径可被找到;命中候选后仍要检查契约和质量。

复用资产可包含需求、设计、代码、测试与领域知识。原型、数据模式是否值得复用取决于内容和条件,不能因为某道“最佳答案”没选它就全部排除。横向/纵向复用区分跨领域/同领域范围,也不是先后阶段。

记录补充:COP 与微观术语只在给定定义下判断

参考试题列面向构件编程(COP)需要多态性、模块封装性、后期绑定和装载、安全性四项支持。它们是语言/环境能力条件,不是四个开发阶段。旧微观题还区分模块、原子构件、构件家族,具体共享范围要按题目给出的局部定义判断。这些名单未逐条穷举原典,本册保留参考试题的来源边界;不据局部说法推广“所有构件禁止继承”或“任何跨构件资源都不能共享”。

组装与适配:箭头表示什么,答案就由什么决定

教材对应:5.6.3 构件组装;功能/数据/对象技术轴来自相关试题与学习材料补充。

现在把名册导出和压缩接起来。如果导出文件作为压缩输入,观察的是顺序组装;如果导出构件请求压缩构件的兼容服务,观察的是层次组装;如果新增一个门面,分别使用导出与压缩能力,对外提供合并后的接口,而两个原构件彼此不依赖、不调用,观察的是叠加组装。画在上面、下面还是左右都不改变判据。

三组装方式、三种失配及供需方向对照
上排看连接关系,下排定位失配。提供方缺少需要的取消能力与提供方多一个不用操作,条件不同;适配器只在转换有依据且契约兼容时成立。

旧题另问基于功能、基于数据、面向对象的组装技术,这是交互机制轴:功能着眼过程或方法调用,数据着眼共享或流动的数据,对象着眼对象契约与消息协作。某流水线可以用数据技术实现顺序连接,某层次调用也可采用对象接口。不能把两组三项拼为六个互斥选项,更不能因“数据”不像调用就当它非法。

顺序层次叠加连接与适配能力边界
三小图保持相同构件尺度,用“结果输入”“服务调用”“门面合并”标注箭头。下方补出供需方向:转换已有行为与补造不存在能力的边界。

同一个接口变化,先定位失配再决定能否修

第一种,双方操作同名,但参数类型或个数不同,是参数不兼容。需要数字 ID、提供文本 ID,可以在确定映射无歧义、无信息丢失并满足规约时转换;若还缺租户参数,必须有合法来源,不能随意补个默认值。第二种,需要 cancel、提供 withdraw,是操作不兼容的命名例子;两者语义相同才可以转发改名。若一个立即取消、另一个只提交取消申请,换名字仍没解决业务差异。

第三种,接口操作集合出现子集差异,教材称操作不完备。判断能否使用必须先固定需要方:需要“查询+取消”、供方只有“查询”,缺少取消能力;反过来,只需查询、供方还有取消,在契约及类型兼容条件下,未使用的额外操作未必引起失配。集合大小不能替代供需方向和兼容规则。

适配器可以转换名字、参数,或组合已有操作;如果底层根本没有释放名额的能力,就需要另实现、另选候选,或重新协商需求。这里可以回看 适配器与门面模式:前者帮助匹配既有契约,后者提供整合入口,采用门面不自动解决缺少能力。

签名一致后,还要核对重复调用、时序、错误恢复、性能与安全。断网重试报名是否会扣两次名额?取消成功返回时,递补是否已完成?这些约束影响可替换性。集成测试检查组合行为,黑盒选例也能使用接口契约,源码不可见不阻止执行测试。

胶水用于连接、协调交互,必要时承担适配;接口本已兼容时可直接连接,不要求每条线都手写包装层。选型需共同考虑功能、质量和替换难度;采购构件节省某些实现工作,也会带来候选评估、适配和集成工作。

回到 R17:先固定当前基线,再检查候选及平台条件,用提供/需要契约明确依赖,最后按组装后的版本取得测试证据,并关联到 配置项与版本。名额上限从 100 改为 1000,或递补规则改为抽签,都先按基线状态处理需求变更;若预计人数或并发负载随之增加,再复查性能和平台容量。变化落在哪一层,就复查该层及受影响的关系;“用了构件”本身不保证系统满足新条件。

5.6 速查

构件/接口/函数

交付实现单元看构件;命名操作及使用规约看接口;具体算法体看实现。一个操作也可形成接口。

回看契约与依赖

独立仍可有依赖

提供接口向外承诺,需要接口显式声明外部条件。可部署也需要符合条件的平台;五特征可同时成立。

回看五项特征

黑盒/状态/属性

不需看内部实现≠所有对象无状态;get/set公开访问契约≠裸改内部字段;源码不可见仍能测试。

回看状态层次

同叫模型,问题不同

共同构件模型管标准,基础设施管支撑;逻辑/物理模型观察本系统功能/部署。没有一条统一父子轴。

回看模型分轴

CCM 分类条件

Service无会话状态;Session临时会话;Process/Entity持久,再按home主键分。持久化责任另选,Session寿命策略不固定。

回看规范限定

适应性/可修改

包装处理特定差异且原实现不改,看适应;版本替换、增功能、重测,看可修改。胶水和产品来源不唯一定位。

回看旧题五形态

六活动/五阶段

本版六活动强调需求与候选反馈;旧五阶段另列资产库与发布。架构限制候选;基线改变须受控;仍需测试。

回看过程反馈

库检索三种关系

关键字沿概念层次;刻面组合属性;超文本沿关联文档。同库可并用,不排除其它检索技术。

回看复用资产

技术/方式

功能、数据、对象看机制;顺序看输出输入、层次看服务请求、叠加看合并新接口且原构件互不调用。

回看同场景三图

失配先看需要方

参数、操作名称、操作集合分别查。缺需要的能力须补;多余操作在契约兼容时未必失配。签名相同仍查语义与质量。

回看反向条件

5.6 自测

选择后显示解析。题源性质逐题标明;作答进度仅保存在当前浏览器。

已答 0 / 28
01 / 改编题 · 命名操作集合

IRegistration规定报名、取消和查询的名称、参数、返回及使用条件。题目问这组已命名操作的契约,应判断为?

02 / 改编题 · 显式依赖

报名构件独立交付,声明需要IAuth;部署时接入身份校验构件。怎样评价独立性?

03 / 改编题 · 五特征

同一通知构件有公开接口、部署包装、文档和显式依赖,并遵循共同模型。五项特征怎样组织?

04 / 自编迁移题 · 部署单元与运行状态

调用者只看接口,报名运行对象内部保存候补队列。两项是否矛盾?

05 / 自编迁移题 · 公开属性访问

接口允许getRemaining查询余量。调用者据此直接把私有remaining写为999。哪里出了问题?

06 / 改编题 · 模型分类轴

某规范约定接口、命名元数据和部署包装,另一份图描述报名功能与节点部署。二者怎样联系?

07 / 自编迁移题 · 基础设施提供什么

容器提供认证和某些事务服务。能否直接认定报名重试幂等与名额并发更新都正确?

08 / 改编题 · 旧CCM类型判断的条件变式

按CCM4.0,构件使用持久状态和身份,home不声明主键。应优先判断哪类?

09 / 改编题 · 旧CCM持久化责任推断

同为CCM4的Entity或Process,持久化责任能否由构件自身管理?

10 / 自编迁移题 · CCM同名望文生义

因为类型叫Session,就认定servant寿命只能与单次会话严格相同。按本页规范边界怎样判断?

11 / 改编题 · 反向条件

通知构件v1已有包装处理特定参数差异,复用时原实现不改。按旧题外部形态描述,最直接线索是?

12 / 改编题 · 版本演化

构件支持v1替换为增加新功能的v2,随后重新测试。旧题形态最直接对应?

13 / 改编题 · 需求概要

尚未查候选,团队先明确报名范围、容量和公平约束,以判断哪些现成能力值得搜索。教材六活动中对应?

14 / 自编跨节迁移题 · B2与商品能力

B2批准先进先出递补,候选商品只支持抽签。怎样继续符合当前需求责任?

15 / 改编题 · 旧过程迭代误解变式

体系结构选定平台后,原候选不再兼容。可以返回识别阶段查替代品吗?

16 / 改编题 · 构件库阶段

旧题给出需求分析定义→体系结构设计→构件库建立→应用软件构建→测试发布。与本版六活动比较,正确认识是?

17 / 改编题 · 2010下Q35相关转录的测试推断变式

二进制身份构件不提供源码。团队可以怎样检验它及组装结果?

18 / 改编题 · 2023下软设Q14跨科支撑

开发反复选型、适配和组装,某些构件内部采用过程式实现。能否仅因不是OO实现就排除CBSD?

19 / 改编题 · 关键字与刻面的反向变式

同时选功能=通知、数据=邮件、语境=校园,以过滤候选,属于旧题哪种访问关系?

20 / 改编题 · 复用范围

组织有可适用的需求模式、数据模式、原型和测试资产。怎样决定能否复用?

21 / 改编题 · 组装方式同场景变式

导出文件直接成为压缩构件输入;题目特别问这一输出输入连接,最直接是哪种方式?

22 / 改编题 · 组装方式名单迁移

导出构件需要压缩服务,由另一个构件提供兼容接口。题目问主调与服务提供关系,应判断?

23 / 改编题 · 三组装方式反例

新增门面分别使用导出与压缩,对外合并入口;两个原构件彼此不依赖、不调用。对应?

24 / 改编题 · 组装技术

某数据流水线采用共享/传递数据机制,将前输出送后输入。基于数据与顺序能同时成立吗?

25 / 自编迁移题 · 参数转换需要条件

同名checkUser,一方要数字ID,一方要文本ID。何时可以用适配器转换?

26 / 自编迁移题 · 名称相近不保证语义

需方cancel要求立即释放名额,供方withdraw仅提交人工取消申请。只转发改名是否足够?

27 / 改编题 · 连接失配变式

需要查询和取消,供方只有只读查询。包装层能否仅凭转换名称就得到取消能力?

28 / 自编迁移题 · 上题反向条件

只需要查询,供方具有查询和取消。在契约及类型兼容前提下,能否仅因多了取消就认定不可组装?

尚未启用本地进度。

教材对应与来源

《系统架构设计师教程(第 2 版)》第五章5.6,印刷p.210–213;正式对应5.6.1构件和构件模型、5.6.2 CBSE过程、5.6.3构件组装。库检索、五外部形态、CCM、COP与经典平台题为相关试题材料的补充,不造教材第四小节。

参考试题的部分状态标答存在争议;缺原卷的年份未核实。自测逐题标改编/自编,不冒充完整官方原题。

参考的完整试题转录含2010下高级上午Q35、2017下高级上午Q37和2023下软件设计师上午Q14;只核转文本身份,不声称已核官方扫描及标答。残缺选项和相互矛盾题未补造。

外部原典定向核验:Sommerville作者补充:构件与对象;Szyperski,Component Software,§4.1.1–2公开副本;UML2.5.1接口§10.4.3–5、§11.6.3–4;CCM4.0,§9.2.13.1–4及类型表;COM包含与聚集;Oracle JavaEE6会话Bean。只读所列目标节页,不声称全面审完规范。

校园报名与名册例子为自编,图片为教学生成图,Mermaid为手工关系模型;本页作答独立保存在当前浏览器。