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

系统分析与设计

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

活动名额仍是 100 个,CR08 已让 R17 从“满员拒绝”变成“允许候补”。学生取消报名后,系统应核验队首资格、按序递补,避免同一空位重复发放。这条规则获批,并没有直接给出程序:申请信息经过哪些处理?谁安排递补?队列怎样保存?设计会议上出现的几张图,分别在回答这些问题。

先确定问题,再选择方法和图

分析把业务要求、系统边界和对象关系理解清楚,形成可交流、可检查的需求规格;设计在技术、成本和资源约束下决定实现方案。前者要澄清“取消后哪些人可以递补”,后者还要安排“哪个模块处理、接口传什么、怎样避免重复”。分析与设计可以反复衔接:发现资格规则有歧义,就应回到需求,而不是由程序员悄悄补定。

结构化与面向对象属于另一条轴。结构化方法先分解功能和数据变换;面向对象方法先组织对象的状态、职责和协作。采用哪种思路,都需要分析,也需要设计。于是,同一候补需求有四种观察位置:分析数据怎样流动、分析有哪些业务对象、设计模块怎样调用、设计类怎样协作。四格没有规定项目必须依次走四遍。

同一候补需求的阶段与方法交叉
行表示分析或设计,列表示结构化或面向对象;底部模型按关注点并列。图标仅帮助定位,不作为正式 DFD/UML 图元。圆筒提示可能持久化,实体类并不等于数据库或表。

图名也不能独自决定阶段。分析中的类图可以只说明学生、活动和候补记录的业务联系,设计时再补接口、操作与存储映射。顺序图可以先表现参与者与系统的事件,再细化为内部对象的消息协作;IBM 的建模文档也分别说明其分析、设计和构建用途。教材的结构化分析还会画现状物理 DFD 和候选物理 DFD,帮助调查人、设备、介质和方案,不能见“物理”便排除分析。

从既有代码恢复理解:逆向工程(记录扩展)

如果接手的旧报名系统只剩代码,逆向工程就从现有软件恢复更高层理解。找出语句和数据细节属于实现级;找出模块、类或分量依赖属于结构级;说明一段程序如何完成资格过滤、更新队列,以及功能之间的关系,属于功能级;进一步把程序实体对应到“候补资格”“活动容量”等现实业务概念,属于领域级。层级看恢复了什么含义,同一张类图也可能表达不同抽象程度。

高层理解通常还需要规章、运行记录和历史决策,源码未必保存这些信息,所以恢复可能不完备;这不是严格的数学反比规律。从代码沿追踪链接找回 R17,是在使用既有对应关系;从代码推断“这个判断原来保护一项资格规则”,才是在恢复含义。两项工作可以配合。

数据、模块与数据库:同系统的不同模型

结构化分析(Structured Analysis,SA)把系统看作数据变换网络。教材从现状物理模型抽出逻辑模型,再按新需求建立目标逻辑模型,补数据字典和加工说明;随后提出候选物理方案,比较成本与风险、选择方案,整理需求规格。旧系统“由教务员查表”的动作,抽象后可成为“核验资格”;换成网页处理时,业务规则仍需要讲清。

数据流图(DFD)用外部实体、加工、数据流、数据存储四类元素说明数据的来源、变换和去向。以下只展开“申请候补”这一部分,并假设此例保留核验记录:资格加工读到学生资料,输出可入队的申请或拒绝结果并保存核验记录;入队加工读写候补记录,再向学生返回结果。取消和递补可在另一子图展开。

候补申请的四元素数据流关系
自绘 DFD 关系示意,采用 Mermaid 图形。箭头标签是数据内容,不是调用或执行先后;存储读取和更新均经过加工。

检查 DFD 要沿数据追问:加工有无合理输入和输出?每条数据流是否至少一端连接加工?外部实体直写存储、两个存储直接连线,都跳过了加工。教材完整模型中的存储应有读写来源;一个局部子图未画出的写入,可能在其它子图中,不能把局部只读视图直接判成整个系统错误。

展开父加工时,核对的是边界数据内容。父图的一条“候补申请=学生编号+活动编号”,在子图边界可以拆成两条,只要数据字典给出了这项组成,且内容没有丢失或凭空增加。箭头数量可以不同。加工编号表达层级和标识,不规定谁先运行;实际是否同步、并行,还要看实现与数据依赖。

数据字典(DD)给粗标签补语义:学生编号的类型和取值,候补申请的组成,候补记录的字段、存量和访问,数据流的来源和去向等。加工说明再写“满足哪些条件,应产生什么结果”。例如资格不符应拒绝入队;这一业务约束尚未指定哈希表或某种排序代码。DFD 看关系,DD 看定义,加工说明看转换规则,三者共同形成需求表达。

进入结构化设计(Structured Design,SD),问题转为模块。概要设计决定模块划分、接口与调用结构,模块结构图(SC)表达模块之间的控制关系;详细设计落实模块内部算法和局部数据结构。“调用资格模块”是模块结构,“读取资格后按条件选择”是内部控制,“资格信息送入加工”是数据流。看见箭头时,先读箭头的含义。

程序模块的三种基本属性分别问:功能“做什么”,逻辑“内部怎样实现”,状态“调用时需要哪些环境和条件”。资格模块的功能是给出资格结论,逻辑是按规则查询和判断,状态条件可以是资格资料已可访问。这里的状态属性与 UML 对象状态机各有语境。结构化程序设计(SP)用顺序、选择、循环组织控制,基本结构保持单入口、单出口。程序流程图表现控制步骤,NS 盒图和 PAD 强调结构化表达;PDL 用较固定的控制语句包住业务操作描述。当多个条件共同决定动作,判定表或判定树更方便检查组合;若有 n 个独立布尔条件,完整展开为 2n 种组合,业务约束和无关条件可以让规则合并,不能只按条件数机械填表。

ER 先说明业务联系,随后才决定表和索引

候补信息还要长期保存。数据库设计沿需求分析→概念设计→逻辑设计→物理设计→实现→运行维护推进,这条工作线可与模块设计配合。概念设计用 ER(实体联系)模型说明对象和联系,逻辑设计再映射为数据库支持的数据模型,物理设计才处理索引、文件组织等。数据库的“逻辑设计”与全系统的“逻辑分析模型”使用了相似词,各自处于不同工作线。

学生与活动的候补联系和联系属性
自绘陈氏风格关系示意:矩形实体、菱形联系、椭圆属性。此例允许学生候补多个活动、活动有多名候补者,双方最少都可为零;尚未指定物理表和索引。

此图约定每一学生—活动组合只表示一条当前候补关系。“入队时间”属于这项联系:学生参加另一活动可以有另一个时间,不能只挂在学生实体上;多次退出再入队的历史要另加事件标识或历史结构。当前 M:N 联系在关系模型中通常用关联表,保存两端标识和联系属性。

若每项活动最多分配一个专用房间,房间也最多分配一项活动,该条件是 1:1;若一个院系可举办多项活动,每项活动只属一个院系,就是 1:N;学生与活动的候补则是本例 M:N。这里比较双方最大基数,是否必须参加是另一个最小参与度问题:1:1也可以允许暂未分配房间,不能读成双方必有一个。简单静态 1:N 联系常能在 N 端加外键;有历史、多次联系或不同约束时,独立联系表仍可能需要。最少表是特定转换题的条件,不能普遍当作数据库质量标准。

模块之间怎样连接,模块内部为何放在一起

模块边界定下来,还要检查两个指标:耦合看不同模块如何依赖,内聚看一个模块的活动为什么组成一体。把资格判断拆出去,并不自动得到低耦合:若递补模块直接改它的私有数据,边界依然脆弱。反过来,一个单一职责模块也可能依赖许多共享环境。高内聚、低耦合需要分别检查。

模块间耦合与模块内聚的独立判据
左边是教材耦合的弱到强顺序;右边三个编号只用于对照内聚条件,不表示强弱排序或执行步骤。强弱不是集合包含。

接口传学生编号,是简单数据;传完整学生记录,是复合结构,对应教材的标记耦合;传一个命令让对方选择“取消”或“入队”,就涉及控制耦合。布尔参数要看用途:把“已具备资格”当业务事实传入,与用开关指挥对方内部流程,判据不同。共享全局公共数据区是公共耦合,越过接口访问对方内部代码或数据则是内容耦合。

本教材七级中的通信耦合指多个模块共享输入或组合输出;非直接耦合允许模块经上层联系。其它资料常把共同受外部格式、设备或协议约束称为“外部耦合”,那是另一套常见谱系,不要悄悄换掉本教材表中的“通信”。同名的通信内聚则发生在一个模块内部。

判断内聚时,先看是否共同完成一项单一完整功能;功能内部自然存在执行顺序,仍可以是功能内聚。若题目只给出若干处理的输出接力关系,上一活动结果供下一活动输入,就是顺序内聚;若只要求先核验列表、后打印另一份报告,没有输出输入链,线索指向过程内聚;若两项处理都围绕同一组数据,线索指向通信内聚。不要用一个较弱特征推翻已经满足的更完整职责。

初始化配置、打开日志因为同一启动时机放一起,体现时间内聚,它们可以顺序执行。“各类输出功能放一起,由调用者选择哪一种”,体现逻辑内聚;随意拼凑无关操作,才是偶然内聚。换掉的是活动结合的理由,结论才随之改变。完整强弱序列留在速查,正文用这些条件帮助定位。

对象的责任:从分析模型到设计协作

面向对象把状态和相关操作组织起来。候补记录知道自己是否仍在排队,并提供合法的状态变更;外部通过接口操作它,这体现封装。类描述共同特征,对象是运行中的基本单元;对象之间发消息协作。继承表达一般与特殊关系,多态让同一接口根据具体对象执行相应行为,例如通知接口可分别交给邮件或短信实现。

教材采用 Coad/Yourdon 的 OOA(面向对象分析)五层:主题、对象类、结构、属性、服务。它们从不同关注面组织同一模型:主题把报名与通知分组,对象类识别学生和活动,结构说明分类及整体部分,属性描述状态,服务描述操作。这里没有五层运行时调用栈。教材五项活动从识别对象类开始,再识别结构、定义主题、属性和服务;它们可迭代,层次的列举顺序不等于工作步骤。

结构中的 is-a 分类与整体部分关系也要分开:“讲座活动是一种活动”表达分类,“活动具有候补记录”表达组成或关联,要进一步给出所有权等条件。设计阶段 OOD 延续分析模型,加入软件职责、接口、信息隐藏和可扩展机制;不能把每个现实名词直接翻译成一张表或一个实现类。

教材 OOA 九项原则还解释怎样控制模型复杂度:抽象保留本质特征,封装把状态与服务组织并隐藏细节,继承承接一般特征,分类把相同属性和服务的对象归为类;聚合组织整体部分,关联表达事物联系,消息通信把对象协作放在接口上。粒度控制让我们先看活动与候补整体,再进入记录细节;行为分析检查对象怎样响应事件、对象行为怎样相互影响。它们是建模原则,与五层组织、五项活动各自回答不同问题。

“界面控制”与“用例控制”中的控制,指向不同责任

窗口、外部协议或界面控制的职责分类,要看工作落在哪条边界。报名页面收取取消请求、检查输入格式、转换协议、显示结果,承担边界职责;候补协调器安排取消、资格核验、递补和通知,承担控制职责;候补记录维护入队时间、状态和合法变更,承担实体职责。

边界、控制和实体的同场景职责对照
消息箭头只表示本例协作,未规定所有 OO 系统必须采用同一调用链。对外协议适配和窗口交互属于边界;职责与类是否抽象是两条轴。

页面要“控制按钮是否可点”,仍在对接外部交互;协调器要“控制是否开始下一次递补”,涉及用例流程。把页面名字改成 UIController,责任不会随名字改变。某项资格规则可以放在实体或领域服务中,由控制对象安排调用;“做判断”本身不专属于控制类。

一次取消和递补的对象消息顺序
自编示例,假设队首资格通过。生命线按职责标识;纵向是消息先后,执行区间不表示其它所有对象等待。并发安全还需实现中的事务及约束,图本身不是证明。

实体可以有方法,控制对象可以持有重试次数等属性;教材“通常持久”“通常方法较多”等倾向不能当语言禁令。抽象或具体则在问类能否直接实例化、怎样承接共同契约;边界类、控制类和实体类都可以选择相应实现形式。系统外的学生参与者,与系统内的学生业务对象,也不必一一对应。

OOP(面向对象程序设计)落实到对象、消息、封装、继承和多态。单继承/多继承按父类型来源数量区分;教材又按内容列取代、包含、受限和特化:取代强调继承能力后承接父对象的位置,包含强调完整承接父对象能力并获得其它能力。该段对受限和特化仅列名称,未给足操作定义,不能凭名字补成各语言通用规则。这套历史分类也不能据名称保证行为符合 LSP。多继承可能产生歧义,结果要看语言和继承结构。“包含继承”与 UML 用例的 include 各处于不同分类问题。

服务重启后,候补记录还要在

仅放在进程内存里的队列不会跨进程运行自动保留,持久化机制把需保留的状态保存到持久存储。采用关系数据库时,ORM(对象关系映射)协调对象属性、联系与关系数据访问,帮助分离业务操作和存储细节。一类可以映射多表,多类也可共用一表,具体映射取决于继承和数据结构。

持久层是承担保存与读取责任的逻辑层,业务代码通过它访问数据,减少对存储细节的依赖;ORM是在关系存储条件下协调对象与关系模型的一种映射机制。持久层可以采用 ORM,也可以采用其它数据访问方式,二者不等于两层必然相连的运行节点。

教材举 Hibernate 自动生成 SQL、iBatis 手写 SQL 映射、JDO 标准 API 等例,分别说明持久化支持方式,不代表当前使用量排名。持久化也不限关系库;概念 ER、设计类图和关系表可以对应,却不是三种完全相同的图。

UML:同一系统可以有多种提问(记录扩展)

UML(统一建模语言)提供共同表达语法,选择图时仍需选问题。用例看参与者目标和系统能力,类图看类型及联系,对象图看某时刻具体实例;活动图看动作和控制/对象流,状态机图看对象响应事件,顺序图看一次交互的消息先后,通信图突出协作连接和消息编号。4+1 视图从架构关注点组织模型,构件图则着重接口依赖,部署图表现运行节点与制品部署。

结构图/行为图按关注内容分类,与分析/设计的轴不同。活动图形似流程图,仍属于 UML 行为图;用例图属于行为类,但椭圆间连线不表达整套执行时序。活动语义使用节点、边与令牌流,不能简单定义成“高级状态机”。OO 方法也不绝对排除 DFD:OMT 功能模型就是反例。方法、图、观察目的,需要结合题干。

顺序图和通信图可以对照简单交互,但不能宣称任意复杂图无损互换。UML 2.5.1 §17.9把通信图对应到不含 InteractionUse/CombinedFragment 的简单顺序图,并给出消息超车无关等假设。通信图也可用编号等表示条件或迭代;区别不能缩成“一个有顺序,一个没有”。

用例的箭头先找端点,再读关系

申请候补与取消候补若都在适用步骤中执行账户检查,可把这项公共必需行为抽出,用 include 从基础用例指向被包含用例。如果账户已登录只是前置条件,就不必把“重新登录”强加为每次操作步骤。extend 从扩展用例指向基础用例,在扩展点插入附加行为,基础本身可独立完整;可声明触发条件,也可以省略显式条件。泛化从特殊者指向一般者,表示继承和特化,例如不同候补申请方式是一般申请方式的特殊实现。

包含、扩展与泛化的端点方向对照
Mermaid 关系示意保留语义端点及标签;正式 UML 泛化使用空心三角,本图实心箭头仅示意指向。泛化例假设两种申请方式继承一般规约并各有行为特化,仅换界面不必泛化;三组连线不能读成调用先后。附加通知是另设的可选功能,R17 要求的递补通知仍须完成。

整体部分的聚合/组合关系不是这些用例关系的替代名称。泛化可以连接类、参与者或用例,要按端点理解;“某章只列三种关系”也不等于语言中只有三种关系。另一套“结构事物、行为事物、分组事物、注释事物”在分模型元素;它与结构/行为两类图、14 种图类型属于不同分类问题。

还有一种“层”在描述语言自身:M0 是实际实例,M1 是所画业务模型,M2 定义 UML 的 Class、Association 等元模型,M3 用 MOF 等元元模型描述建模语言。这与业务模型内部的 OOA 五层分开。历史 UML 2.0 的 Infrastructure/Superstructure 都在描述语言元模型,不能望文生义映成 M2/M1。速查的 14 图清单明确采用 2.5.1;Profile 在清单中,Artifact 是制品元素,不能拿它补成独立第 14 类。

变化落在哪里,模式才有选择依据(记录扩展)

模式保存的是特定条件下处理重复问题的组织办法。架构模式处理系统组织,设计模式处理类与对象协作,惯用法处理特定语言实现;GoF 又按创建、结构、行为划分目的,按类/对象划分作用范围。前一组的“设计模式”并不等于后一组的“行为型”,Adapter 还同时存在类和对象实现。原书出版者的 Adapter 节选给出了继承与组合两版。

模式分类与同场景条件变化
问题范围、GoF 目的和作用范围分别判断;以下模式可以在同一项目中配合,示例条件不代表已批准改变 R17 的业务规则。

假设另一个活动需要换候补排序算法,可以把算法族封装成 Strategy;同一取消操作因记录处于排队、预留或确认状态而产生不同响应,可以用 State 组织行为。判据是算法替换和状态驱动行为,谁来选择不是唯一依据;普通条件语句也能实现这些规则,采用模式还要衡量变化频率与复杂度。

Bridge 面对两个需要分别演化的维度,例如活动类型与通知实现。抽象侧持有实现接口,加入一种活动或一种通知通道,可以分别扩展。Adapter 面对已有接口不匹配,例如把旧通知接口转换为系统期待的接口。Bridge 不要求图上一定有空心菱形;两种模式可以同时使用,不能只按使用早晚排除。

Decorator 在同一接口外增加附加职责,例如加一层通知;Proxy 控制访问,例如权限检查或延迟取得真实对象。它们的包装形状很相似,要看包装解决的困难。Decorator 即使“增加行为”,仍属于 GoF 结构型,不能把日常用词当目的类别。

Command 把请求封为可排队、记录和执行的对象;Memento 保存可恢复的状态而保护封装。撤销可能同时用到两者,只看到“撤销”不能唯一选择。Iterator 提供遍历接口,Visitor 为相对稳定的元素类型增加新操作,两者可以合作;若元素类型频繁增加,访问者的改动成本也会增加。

Factory Method 让子类决定具体产品类型;Builder 分离复杂构建过程,使同一构建过程得到不同表示。Mediator 集中封装对象间复杂交互,Observer 组织变化通知。题干只有“一个后端连接多个前端”,不足以唯一指定中介者,仍须交代交互是怎样发生的。

原则检查契约和变化代价

把候补业务与通知模板放在一个类,两项独立变化都会迫使它修改,SRP(单一职责)就提醒我们按变化原因分责任。OCP(开闭)通过扩展点减少稳定代码的修改,ISP(接口隔离)让客户端只依赖需要的接口,DIP(依赖倒置)让高层规则和低层机制共同依赖抽象。它们指导设计选择,不是禁止维护原代码的口令。

LSP(里氏替换)要求子类型维持客户端依赖的行为契约。例如通用资格检查接受正常学生编号,特化检查额外要求 VIP 令牌,就加强了调用前提;若原接口保证给出明确结果,子类型只返回未定义状态,又削弱了返回保证。Liskov 与 Wing 原论文还讨论状态和历史约束。语言允许的协变返回另有规则,不能要求结果必须完全相同;声明共同抽象基类,也不自动修复行为冲突。

组合可以通过接口保留多态,适合分别演化的协作对象;继承适合能满足替换契约的分类关系。LoD(最少知识)减少对无关对象内部结构的依赖:通知模块若一路穿过学生、院系、负责人再取得办公室,修改中间结构就会牵连它。私有属性、不可变对象和减少调用链是可能的手段;流式配置接口的链式调用不因长度自动违规。

回到那一项候补需求:先用分析把数据、规则和责任说清,再用设计决定模块、类、存储及协作机制。每张图选定一个问题,却用同名需求、状态和接口相互核对。能解释这些对应关系,才方便在5.4 测试中选择检查对象,判断方案和实现是否满足要求。

5.3 速查

先判正在回答的问题,再判方法、阶段和细化层次。回到两轴解释。

分类轴判别线索边界
分析/设计理解需求与业务关系/决定实现机制图名不固定阶段;现状物理DFD也能用于SA
结构化/OO功能数据分解/对象状态职责协作均有分析与设计;OMT功能模型可用DFD
DFD/DD/加工说明数据变换关系/数据语义/业务转换规则编号非时序,箭头非控制;父子平衡核内容,可依DD拆合复合流
概要/详细设计模块、接口、调用/模块内部算法与局部结构SC控制结构与DFD数据流分开;模块功能问做什么、逻辑问怎样实现、状态问调用环境/条件
数据库工作线需求→概念ER→逻辑模型→物理组织→实现→运维ER概念不等于表/索引;联系属性、历史和多重性改变转换方案
ER数量轴最大基数1:1/1:N/M:N;最小参与度可为0或11:1不等于双方必须有一个;同一双方多次联系的历史要额外标识
ECB/抽象具体外部交互/用例协调/业务状态规则;是否可直接实例化不同轴可同时成立;界面相关控制仍属边界,控制可有属性、实体可有方法
教材步骤与工具对应

SA七步:现物理DFD→等价现逻辑→目标逻辑+DD/加工说明→候选物理/界面→比较成本风险→选择→需求规格。DFD五步:目标与范围→顶层→一级分解→层次展开→检查。教材把目标/范围同列一步,拆成两个教学动作不等于标准步数变成六。

详细工具:流程图控制步骤,NS盒图/PAD结构化表达,PDL外层固定控制+内层业务描述,判定表/树条件到动作。独立布尔条件n个完整组合2n;约束/无关项可使规则合并。

耦合与内聚

教材耦合弱→强:非直接→数据→标记→控制→通信→公共→内容。先后是强弱顺序。内聚强→弱:功能→顺序→通信→过程→时间→逻辑→偶然。看同条件比较。

易混点换哪个条件,结论会变
数据/标记/控制耦合简单数据/复合记录/指挥内部逻辑。参数类型或是否布尔不够
通信/公共耦合教材通信共享输入或组合输出;公共依赖公共环境。其它谱系的外部耦合不要替换通信
功能/顺序/过程内聚单一完整功能/输出输入链/仅控制次序。完整功能内有顺序不自动降级
通信/时间/逻辑内聚同一数据/同一时机(可顺序)/同类功能由控制选择

OO 的层、活动与持久化

Coad/Yourdon五层:主题、对象类、结构、属性、服务;五活动:识别对象类→结构→定义主题→属性→服务,可迭代。OOA九原则:抽象、封装、继承、分类、聚合、关联、消息通信、粒度控制、行为分析。is-a分类与整体部分分开。单/多继承按来源数,取代/包含/受限/特化按内容;多继承是否冲突要看语言及结构。持久化保存跨运行状态,持久层负责存取,ORM是对象与关系访问的映射机制,不要求一类一表。对应解释。

UML 2.5.1 与记录扩展

图组清单与问题
结构图7种类(类型),对象(实例),构件(接口依赖),组合结构(内部部分/连接),包(组织),部署(节点/制品),轮廓Profile(扩展语言使用)
行为图7种用例(目标能力),活动(动作流),状态机(事件状态),交互子组:顺序、通信、定时Timing、交互概览
容易混轴Artifact制品元素不是独立第14类;四种事物与两图组分开;图型不固定开发阶段或逆向层级
关系箭头include基础→被包含;extend扩展→基础,扩展点可有条件/可省显式条件;泛化特殊→一般。先读端点,不能读成时序
顺序/通信简单交互可对照;任意复杂图无损互换不成立;执行区间非全局锁
M0—M3实例/用户模型/语言元模型/元元模型。OOA五层在业务模型内;历史Infra/Super皆描述语言元模型

回到关注点与条件;逆向四级解释。

GoF 目的清单与条件

23个名称用于定位,目的≠作用范围

创建5:Abstract Factory抽象工厂、Builder建造者、Factory Method工厂方法、Prototype原型、Singleton单例。

结构7:Adapter适配器、Bridge桥接、Composite组合、Decorator装饰、Facade外观、Flyweight享元、Proxy代理。

行为11:Chain of Responsibility职责链、Command命令、Interpreter解释器、Iterator迭代器、Mediator中介者、Memento备忘录、Observer观察者、State状态、Strategy策略、Template Method模板方法、Visitor访问者。

类/对象范围另轴,Adapter两版均有。架构/设计/惯用法按问题尺度与语言依赖分类。清单不替代条件。回到模式比较。

Bridge看两维分别变化;Adapter看既有接口转换;Decorator添职责、Proxy管访问;Command请求对象、Memento状态快照;Visitor类型相对稳定而操作变化、Iterator遍历;Builder构建不同表示、Factory Method子类决定产品。Mediator封装交互、Observer变化通知,多个前端不足唯一选型。

SOLID:SRP变化原因,OCP扩展稳定边界,LSP行为契约,ISP按使用者拆接口,DIP共同依赖抽象。LSP不加强前置/不削弱后置,兼顾状态历史;组合仍可接口多态。LoD减无关结构知识,不靠链式长度/私有/不可变机械判。契约例子。

5.3 自测

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

已答 0 / 24
01 / 自编迁移题

团队用领域类图澄清学生与活动的业务关系,尚未决定接口和存储。哪项判断最有依据?

02 / 改编题 · 物理DFD

分析人员先画旧系统中教务员、表格和设备的处理,再抽出业务逻辑。按本教材 SA,这一步怎样理解?

03 / 自编条件题

DFD 中加工编号为1和2,但二者之间没有数据流连线。可以直接推出什么?

04 / 自编迁移题

父图输入为“候补申请”,DD定义它等于学生编号与活动编号。子图边界将它拆成这两条输入且未增加或丢失内容,如何判断?

05 / 改编题 · 数据字典

DFD写了“候补申请”。希望统一其中字段的类型、组成、取值和含义,优先补哪项?

06 / 改编题 · 软件结构设计

需求已明确,当前要划分资格核验、候补登记和通知模块,并约定接口与调用关系。哪项最贴切?

07 / 中级支撑改编 · 控制参数

调用者传入mode='cancel'或mode='enqueue',直接指挥被调用模块执行不同业务分支。该条件最直接体现哪种耦合?

08 / 改编题 · 共享专用数据区

两个模块直接访问同一个公共数据区,彼此依赖该区的全局格式和状态。按教材最贴切的是?

09 / 改编题 · 过程与顺序内聚

区分顺序内聚与仅因控制次序结合的过程内聚时,哪条新增条件最关键?

10 / 自编迁移题

学生可候补多个活动,每次入队时间不同;活动也可有多名候补者。哪项模型最有依据?

11 / 改编变式题 · 1:N转换条件

一项转换题把简单静态1:N联系合并为N端外键。后来要求保留同一双方多次联系的历史,应该怎样迁移原结论?

12 / 改编题 · OOA五层

同一模型按主题、对象类、结构、属性、服务整理。怎样避免与M0—M3混淆?

13 / 改编变式题 · 边界与控制

类名叫WindowController,负责表单格式检查、转换外部请求和显示结果,不安排跨实体递补流程。按ECB职责应归?

14 / 改编迁移题 · 协议适配

系统通过适配类把外部通知平台的协议转为内部通知接口。它有重试计数,也可能定义为抽象类。哪项正确?

15 / 自编迁移题

应用重启仍需恢复候补状态,设计采用ORM。哪项能从这些条件合理推出?

16 / 改编题 · 模型关注点

要解释一条候补记录收到邀请、确认、超时等事件后如何改变状态,最直接选哪类图?

17 / 改编题 · include与泛化

申请与取消用例都在适用步骤中执行公共账户检查;不同申请方式则继承一般申请行为。哪项方向正确?

18 / 自编条件题 · 规范扩展

一张顺序图包含复杂CombinedFragment和InteractionUse。依据本节核验的UML2.5.1,哪项表述稳妥?

19 / 改编变式题 · Decorator目的分类

同接口外包装一层通知职责,按Decorator意图设计;实现通过对象组合。哪项分类正确?

20 / 缺图旧题改编 · 不复造原图

活动抽象类型和通知实现需要分别扩展,抽象侧持有通知接口;类图没有空心菱形。哪项最贴切?

21 / 旧标答纠偏迁移 · LSP

父接口允许正常学生编号查询,子类型新增VIP令牌要求。仅提取共同抽象基类后,这项行为仍未改。如何判断?

22 / 改编题 · 逆向功能级

从旧代码恢复出某程序段负责过滤资格、更新候补状态,并解释它与递补功能的关系;尚未映射到学校规章。最直接属于哪级?

23 / 自编迁移题 · OOA原则

先只保留活动与候补的关键业务特征,再切换到记录细节;对象通过接口协作隐藏内部数据。哪项对应最贴切?

24 / 自编条件题 · 持久层与ORM

候补系统改用文件保存状态,业务代码仍通过独立存取层调用。如何判断持久化、持久层和ORM关系?

尚未启用本地进度。

教材对应与来源

教材正式对应:第2版 5.3.1“结构化方法”和5.3.2“面向对象方法”(教材p193–205)。前者含SA/SD/SP、数据库设计,后者含OOA/OOD/OOP、持久化;UML、逆向、GoF、SOLID/LoD为本节扩展。

  • 《系统架构设计师教程(第 2 版)》第 5.3 节。
  • 参考2014Q27、2017Q26、2023回忆题的模型/模式考法,以及数据库、演化维护、用例与DFD相关材料。题库原卷身份未独立验全;缺图、缺选项或标答冲突不补造原题。
  • 24道自测:16道改编与8道自编条件/迁移题(题源性质逐题标明);没有复刻真题原图。控制耦合据中级2023上Q31改编,DD与ECB按相关知识点改编,缺图模式仅改编可核机制。

一手校准:IBM 顺序图跨阶段用途;OMG UML2.5.1原规范定向读取附录A图A.5、§15.2.3活动、§17.9通信、§17.12.8执行区间、§18.1.3用例,不声称全规范逐页审读;GoF原书目录及Adapter出版者节选;Liskov/Wing原论文§5.2.1等。

校园项目、类名、关系图和数据流均为自编教学场景。参考材料中的残缺图没有作为原图重绘。耦合严格保留本教材“通信”条目;历史框架例不宣称实时使用排名。跨节链接按解释主题关联;本页作答只在当前浏览器保存,进度仅保存在当前浏览器。