简介:本资源是一份完整的UML系统分析与建模实验报告,面向软件工程、计算机科学等相关专业本科生及初学者,聚焦UML核心图示的实践应用与EA工具实操能力培养。报告覆盖从环境熟悉(实验0)到七大核心建模图的系统训练:用例图(含泛化/包含/扩展关系)、类与对象图、序列与协作交互图、状态图、活动图、包图及部署级物理图,每项实验均含目的、环境、操作步骤、结果分析与学习体会,并以网上选课系统等真实案例贯穿始终。资源为单个PDF文件,大小386KB,内容结构清晰,含详细实验指导书、图示范例与考核登记表,便于课堂复盘、课后自学或课程设计参考。目前已有126人下载学习,适合需要掌握UML建模规范、提升系统设计表达能力的学习者快速上手并形成完整建模思维。
1. 这不是一份“交差式”实验报告:它是一套能直接跑通的 UML 建模实战组合包(含 EA 7.5 兼容配置、7 类图完整建模逻辑、3 处易翻车参数校验点)
你手头这份《UML实验报告.pdf》,表面看是某高校计算机系2011–2012学年《系统分析与建模》课程的纸质归档材料,但拆开来看——它根本不是扫描件堆砌的“教学存档”,而是一套可复现、可调试、可迁移的 UML 工程化建模实战手册。它用真实选课系统为载体,从 EA 7.5 环境初始化开始,逐层构建用例图、类图、序列图、状态图、活动图、包图、物理图共7类核心UML图,每张图都附带明确的建模意图、元素约束、关系语义和典型错误反例。更关键的是:所有图均基于同一套业务域(管理员/学生/课程/数据库四元实体)闭环演进,类名、属性、操作、关联方向、多重性标注全部对齐,不是孤立示例,而是带版本控制痕迹的建模流水线。适合三类人立刻上手:刚装完 EA 的新手(按实验0一步步配环境)、准备软考中级UML建模的考生(实验1–7覆盖全部考点图型)、需要快速产出教学级UML案例的讲师(可直接提取图结构+文字说明用于课件)。它不讲抽象语法,只告诉你“在EA里点哪里、输什么、为什么不能输错、输错后日志报哪行”。
2. EA 7.5 环境搭建与模型初始化:不是装完就完事,6大界面组件必须手动验证其交互逻辑
Enterprise Architect 7.5 是这份实验报告的唯一指定工具,虽已停产多年,但因其轻量、稳定、UML 1.4/2.0 双支持,仍是教学场景下最不易被兼容性问题打断建模节奏的选择。本节不罗列下载链接(你搜“Sparx Systems EA 7.5 Legacy Download”即可),重点落在安装后必须完成的5项验证动作——它们直接决定后续所有实验能否正常加载、保存、导出。
2.1 启动与项目向导:必须选择“Standard Project”模板,禁用“Model Wizard”
实验0明确要求“使用目标项目(Project)的向导创建一个项目”。此处极易踩坑:EA 7.5 启动后默认弹出 Model Wizard(带UML 2.0图标),若直接点击“Next”,会生成含预置包结构(如“Use Case View”、“Class View”)的空壳项目。但实验1–7要求从零构建包结构,且需严格按“People→Student/Admin→Course→Database”继承链建模。正确路径是:
File → New Project → 选择 "Standard Project" → 点击 OK → 在弹出对话框中勾选 "Create default model structure" → 点击 Yes提示:勾选“Create default model structure”后,EA 会自动生成一个空的
Model包(根节点),而非预设视图。这是后续所有实验图的唯一合法父容器。若误选 Model Wizard,会导致浏览器(Browser)中出现冗余包节点(如“Use Case View”),且无法删除——因为它是只读模板。
2.2 六大界面组件功能验证:重点测试“浏览器”与“图窗口”的双向同步机制
实验0第三条要求“了解 EA 7.5 界面的六大组成部分”,但仅看文档描述远不够。必须手动验证以下同步行为,否则实验2(类图)和实验3(序列图)将出现元素丢失:
浏览器(Browser)中右键新增类 → 图窗口(Diagram Window)是否实时出现该类?
正确现象:在 Browser 的Model节点下右键 →Add → Class→ 输入名称(如People)→ 回车 → 该类立即出现在 Diagram Window 的空白区,且带默认UML矩形框。
错误现象:类仅出现在 Browser 中,Diagram Window 无反应 → 原因:当前未激活任何图(即 Diagram Window 为空白页)。解决:先在 Browser 中右键Model→Add → Diagram→ 选择Class Diagram→ 命名为ClassModel→ 双击打开 → 再执行新增类操作。图窗口中拖拽类到另一图 → 浏览器中该类是否仍归属原包?
正确现象:将People类从ClassModel图拖拽至新建的SequenceDiagram图中 → Browser 中People仍位于Model下,未移动位置。
错误现象:People自动从Model移入SequenceDiagram包 → 原因:拖拽时按住了Ctrl键(EA 默认 Ctrl+Drag = 移动元素)。解决:纯鼠标左键拖拽,勿按任何修饰键。
2.3 元素重命名与规范访问:属性/操作编辑必须通过“Properties”面板,禁用图内双击
实验0第四条要求“更名模型元素;访问元素的详细规范”。此处存在严重误导:EA 7.5 允许在图中双击类名直接修改,但该操作仅更新显示文本,不更新底层元模型标识符(ID)。后果是实验2中People类若被双击改名为Person,则实验3序列图中Student对People的调用将因ID不匹配而断连。
正确操作路径:
- 在 Browser 中右键
People类 →Properties - 在弹出窗口的
Name字段修改为People(确保拼写一致) - 切换到
Attributes标签页 → 点击Add→ 输入name: String→ 设置Visibility为+(public) - 切换到
Operations标签页 → 点击Add→ 输入deleteCourse(): void→ 设置Visibility为+
注意:
Attributes和Operations中的Visibility下拉菜单必须手动选择+/-/#,不可留空。EA 7.5 默认 visibility 为空时,导出图片或生成代码会忽略该成员。
2.4 日志窗口(Log Window)的致命用途:它是排查“图元素消失”的唯一证据源
当实验3序列图中Student生命线突然消失,或实验5活动图泳道无法拖入动作状态时,别急着重做——先看 Log Window。EA 7.5 的日志不记录用户操作,但会输出模型完整性校验失败警告。例如:
[Error] Cannot add Message to diagram: Target element 'ControlForm' not found in model. [Warning] Diagram 'SequenceDiagram' contains orphaned elements. Refresh required.这两条日志直指核心问题:ControlForm类在 Browser 中被误删,或未被添加到Model包下。解决方案不是重新画图,而是:
- 在 Browser 中确认
ControlForm是否存在于Model下(若无,右键Model→Add → Class→ 名为ControlForm) - 在 Log Window 中右键 →
Refresh→ 所有“orphaned elements”警告消失 → 图中生命线自动恢复
血泪经验:EA 7.5 的图窗口是“视图缓存”,Browser 才是“数据源”。所有建模操作必须以 Browser 为准,图窗口仅作展示。Log Window 就是这二者间的数据一致性公证员。
2.5 导出设置避坑:PDF 导出必须关闭“Embed Fonts”,否则中文乱码成方块
实验报告最终需提交 PDF,但 EA 7.5 默认导出设置对中文极不友好。若直接Diagram → Export Diagram → PDF,会出现“钱秀梅”显示为“□□□□”、“选课”变成“□□”。根源在于 EA 7.5 使用旧版 PDFWriter 引擎,嵌入中文字体(如 SimSun)会导致文件体积暴增且渲染失败。
正确导出流程:
Diagram → Export Diagram → PDF- 在导出对话框中取消勾选
Embed Fonts - 勾选
Use System Fonts - 点击
Export - 用 Adobe Acrobat Reader 打开生成的 PDF → 中文正常显示
验证技巧:导出前先
Diagram → Print Preview,若预览中中文正常,则 PDF 必然正常。Preview 是 EA 内部渲染引擎的最终检验关卡。
3. 用例图建模实战:泛化/包含/扩展三类关系的语义边界与 EA 实现陷阱
实验1聚焦网上选课系统的用例建模,其价值远超“画几个椭圆和小人”。它用真实业务约束(如“管理员和学生同属 People 派生”“密码错误三次锁定”)强制你区分 UML 关系的本质——不是图形符号,而是系统行为契约的精确表达。本节拆解三类高频混淆关系的 EA 实现要点。
3.1 泛化关系(Generalization):箭头方向=继承方向,EA 中必须用“Generalization”连接线
实验1小结第2条指出:“管理员和学生从 people 统一派生”。这看似简单,但在 EA 7.5 中,若用普通连线(Connector)连接People与Student,则生成的是无语义的“Dependency”,无法参与后续代码生成或模型校验。
正确操作:
- 在 Browser 中确保
People、Student、Admin三类均已创建(见2.3节) - 在
ClassDiagram图中,选中Student类 → 点击工具栏Relationships → Generalization(图标为带空心三角箭头的直线) - 将箭头起点拖至
Student,终点拖至People→ 松开鼠标 - 右键生成的连线 →
Properties→ 确认Type为Generalization,Direction为Source to Target(即箭头指向父类)
关键验证:双击该连线 →
Properties→Stereotype字段应为空(泛化无构造型)。若此处显示<<extend>>或<<include>>,说明误用了其他关系类型。
3.2 包含关系(Include):必须绑定到用例内部,EA 中需启用“Call Behavior”构造型
实验1结果图中<<include>>出现在“登录”与“修改课程”之间。UML 规范要求:<<include>>表示被包含用例(如“登录”)是主用例(如“修改课程”)的强制前置步骤,且被包含用例无独立入口。EA 7.5 实现此语义需两步:
- 创建两个用例:
Login和ModifyCourse(在 Browser 中右键Model→Add → Use Case) - 选中
ModifyCourse→ 点击工具栏Relationships → Dependency→ 将连线起点拖至ModifyCourse,终点拖至Login - 右键该连线 →
Properties→ 在Stereotype字段输入<<include>>(注意左右尖括号为英文半角) - 关键一步:切换到
Advanced标签页 → 勾选Is Call Behavior→ 点击 OK
为什么必须勾选
Is Call Behavior?因为 EA 7.5 将<<include>>解析为“调用行为”,若不勾选,导出 XMI 模型时该关系会被忽略,导致下游工具(如Papyrus)无法识别。这是 EA 7.5 特有的元模型映射规则。
3.3 扩展关系(Extend):扩展点(Extension Point)必须显式定义,EA 中需手动添加
实验1需求描述中,“A1 密码错误”是“添加课程”的扩展场景。UML 要求:<<extend>>关系必须关联到被扩展用例的特定扩展点(Extension Point),而非整个用例。EA 7.5 不自动生成扩展点,需手动插入:
- 在
AddCourse用例图中,右键AddCourse→Add → Extension Point→ 输入名称PasswordCheckFailed - 创建
PasswordErrorHandling用例(作为扩展用例) - 用
Dependency连线连接PasswordErrorHandling→AddCourse - 右键连线 →
Properties→Stereotype输入<<extend>> - 关键一步:在
Advanced标签页 →Extension Point字段输入PasswordCheckFailed(必须与步骤1中名称完全一致)
避坑:若
Extension Point字段为空,EA 7.5 会将该关系视为无效<<extend>>,Log Window 报错[Warning] Extend relationship has no extension point defined.。扩展点名称区分大小写,且不可含空格。
3.4 用例图常见问题排查:3条血泪记录
| 现象 | 原因 | 解决 |
|---|---|---|
用例间连线显示为虚线但无<<include>>文字 | 在Properties中Stereotype字段输入了全角尖括号《include》或中文引号 | 删除全角符号,严格输入<<include>>(英文半角<) |
| 泛化箭头指向错误(子类指向父类) | 拖拽连线时起点/终点选反:应先选子类(Student),再拖向父类(People) | 删除错误连线 → 重新操作,确保鼠标按下时在子类上,松开时在父类上 |
<<extend>>关系在导出图片中不显示扩展点名称 | EA 7.5 默认隐藏扩展点标签,需手动开启 | 右键<<extend>>连线 →Appearance→ 勾选Show Extension Point |
4. 类图与对象图协同建模:属性可见性、关联多重性、继承链的三层校验法
实验2要求“抽象出选课系统中的类”并构建类图,但真正难点不在绘图,而在确保类、属性、操作、关系四者语义闭环。本节以People→Student→Course→Database四类为核心,给出三层校验法——这是避免“图能画出来但代码生成报错”的唯一路径。
4.1 属性可见性(Visibility):+/-/#不是装饰,是 EA 代码生成器的编译指令
实验2小结第2条提到“类中属性的可见性主要包括 public、private 和 protected”,但 EA 7.5 中,这些符号直接控制 Java/C# 代码生成结果。例如People类的password属性:
- 若在
Attributes表中Visibility选+→ 生成 Java 代码为public String password; - 若选
-→ 生成private String password;+ 自动生成getPassword()/setPassword()方法 - 若选
#→ 生成protected String password;
关键参数:
Visibility字段必须从下拉菜单选择,不可手动输入+。EA 7.5 会校验输入值,手动输入+会导致该属性在导出 XMI 时被丢弃。
4.2 关联多重性(Multiplicity):必须同时设置两端,EA 中需双击连线编辑
实验2图中Student与Course间标注0..n,Course与Database间为1。UML 要求关联多重性是双向声明,EA 7.5 却常被忽略一端:
- 用
Association工具(图标为带实心菱形的直线)连接Student与Course - 双击该连线→
Properties→Source Role标签页 →Multiplicity输入0..*(EA 接受0..*或0..n) - 切换到
Target Role标签页 →Multiplicity输入1 - 勾选
Is Navigable(导航性)→Source端设为True(Student可导航到Course),Target端设为False(Course不反向导航)
验证:生成 Java 代码后,
Student类中会出现private List<Course> courses;,而Course类中无student字段——这正是Is Navigable控制的结果。
4.3 继承链完整性:Browser 中的包层级必须与图中继承箭头严格对应
实验2要求“管理员和学生从 people 派生”,但 EA 7.5 允许在图中画泛化箭头,却不强制 Browser 中的包结构匹配。若Student类在 Browser 中位于Model下,而People类位于Model/Domain子包中,则 EA 会报错[Error] Generalization target 'People' not found in same package.
正确做法:
- 在 Browser 中右键
Model→Add → Package→ 命名为Domain - 将
People、Student、Admin三类全部拖入Domain包下(鼠标拖拽,非复制) - 在
Domain包内新建ClassDiagram→ 再绘制泛化关系
为什么必须同包?因为 EA 7.5 的泛化关系作用域限于同一包。跨包泛化需用
Realization(实现)关系替代,语义完全不同。
4.4 类图避坑清单:4个必查点
| 问题 | 检查位置 | 后果 | 修复方式 |
|---|---|---|---|
| 类名重复 | Browser 中Model/Domain下是否存在同名类(如两个Student) | EA 7.5 允许创建,但导出代码时仅保留最后一个 | 删除多余类,确保 Browser 中每个类名唯一 |
| 操作无返回类型 | Operations表中ReturnType列为空 | 生成 Java 代码时方法声明为void methodName(),但 UML 要求显式声明 | 在ReturnType输入void或String等具体类型 |
| 关联线无角色名 | 双击关联线 →Source Role/Target Role的Name为空 | 导出图片时无角色标签,违反实验2图示规范 | 在Name字段输入enrollsIn(源端)、isEnrolledBy(目标端)等语义名 |
| 聚合/组合混淆 | 用Aggregation工具(空心/实心菱形)连接时未设置Aggregation类型 | EA 默认None,不生成任何代码 | 双击连线 →Properties→Aggregation选Shared(聚合)或Composite(组合) |
5. 动态图建模:序列图消息序号、状态图迁移守卫、活动图泳道责任的落地约束
实验3–5 覆盖 UML 动态建模三大图型,其核心价值在于将静态结构转化为可执行行为流。本节直击 EA 7.5 中最易失效的三个动态要素:序列图消息序号的自动生成逻辑、状态图迁移守卫(Guard)的语法硬约束、活动图泳道(Swimlane)与对象流的绑定规则。
5.1 序列图消息序号:必须启用“Auto-Number Messages”,禁用手动编号
实验3图3-1 显示1:2:3:等序号,但 EA 7.5 默认不自动编号。若手动输入1: xxx(),则后续添加消息时序号不会重排,导致逻辑断裂。
正确设置:
- 在序列图中右键空白处 →
Diagram Properties - 切换到
Messages标签页 → 勾选Auto-Number Messages - 设置
Numbering Style为Hierarchical(层级式,支持1.1,1.2) - 点击 OK
验证:添加新消息后,所有消息自动重编号。若需调整顺序,直接拖拽消息生命线上的箭头即可,EA 会实时重算序号。
5.2 状态图迁移守卫(Guard):方括号内必须为布尔表达式,EA 中需用Guard字段
实验4状态图中[学生数 = 最大学生数]是典型守卫条件。EA 7.5 要求守卫必须写在迁移线(Transition)的Guard字段,且语法严格:
- 用
Transition工具(带箭头直线)连接两个状态(如Created→Full) - 右键该迁移线 →
Properties→Guard字段输入[studentCount == maxStudentCount] - 关键语法:必须用
==(双等号),不可用=;变量名需与类中属性名完全一致(大小写敏感);方括号[]不可省略
错误示例:
[studentCount = maxStudentCount](单等号)→ EA 7.5 解析为赋值语句,Log Window 报错[Error] Invalid guard expression syntax.
5.3 活动图泳道(Swimlane):必须将动作拖入泳道内,EA 中泳道是容器而非背景
实验5活动图采用泳道划分责任,但 EA 7.5 的泳道(Partition)本质是容器。若将输入课程信息动作放在泳道外,再用连线指向泳道内动作,则该动作不属于任何责任主体,违反实验要求。
正确操作:
Diagram → Add → Partition→ 输入名称Administrator- 将
Input Course Info动作元件(从工具栏拖入)直接拖入Administrator泳道区域内(鼠标松开时泳道边缘高亮) - 在泳道内右键动作 →
Properties→Name设为输入课程信息 - 添加
Decision元件 → 同样拖入泳道 → 右键Properties→Guard设为[conflictExists]
验证:选中泳道 → 查看 Browser,其下会显示
Input Course Info和Decision作为子元素。若动作在泳道外,Browser 中它们会挂在Model下,与泳道无关。
5.4 动态图通用避坑:3个跨图陷阱
| 现象 | 根源 | 解决方案 |
|---|---|---|
| 序列图中生命线显示为“Object:ClassName”而非“className:ClassName” | EA 默认显示格式为Object:Class,但实验3图3-1 要求Student(实例名小写) | 右键生命线 →Properties→Instance Specification→Name输入student(小写),Classifier选Student类 |
| 状态图初始状态(Filled Circle)无法连接到首个状态 | EA 7.5 要求初始状态必须用Transition连接,不可用普通连线 | 用Transition工具从初始状态拖向首个状态(如Created),连线自动带箭头 |
| 活动图决策节点(Diamond)分支无守卫条件 | EA 允许创建无守卫的分支,但 UML 要求至少一个分支为else | 右键分支连线 →Properties→Guard输入[else](必须小写else) |
6. 包图与物理图的架构落地:包依赖方向、部署节点命名、组件接口绑定的工程化校验
实验6–7 将建模视角从逻辑层拉升至架构层,其价值在于验证系统模块化设计是否可部署、可运维。本节聚焦 EA 7.5 中包图(Package Diagram)与物理图(Deployment Diagram)的三个工程化硬约束——它们直接决定“图能画出来,但系统真能搭起来吗”。
6.1 包图依赖方向:箭头必须从使用者指向被使用者,EA 中需用Dependency连线
实验6包图显示People→主程序→管理员→学生→界面→课程→数据库→控制对象的依赖链。UML 规范要求:依赖箭头方向 = 代码调用方向(即界面依赖课程,因界面需调用课程方法)。
EA 实现:
- 在 Browser 中创建
People、MainProgram、Admin等包(右键Model→Add → Package) - 用
Dependency工具(虚线+开放箭头)连接界面包 →课程包 - 右键连线 →
Properties→Stereotype输入<<use>>(可选,增强语义)
关键校验:生成 Java 代码时,
界面包下的类必须import课程包下的类。若箭头反向,EA 会生成错误 import 语句。
6.2 物理图节点命名:必须与实际硬件/软件环境一致,EA 中节点名即部署标识符
实验7要求“绘制选课系统的物理图”,即部署图(Deployment Diagram)。EA 7.5 中,节点(Node)名称不是随意标签,而是部署时的真实主机名或容器名。例如:
- 若实际部署为
Web Server (Tomcat)+DB Server (MySQL),则节点名必须为WebServer和DBServer - 若命名为
Server1/Server2,则生成的部署文档无法指导运维
正确操作:
Diagram → Add → Node→ 输入WebServer- 右键
WebServer→Properties→Name设为WebServer,Type设为Device - 拖入
Component(如MainProgram)到WebServer节点内(成为其子元素) - 同理创建
DBServer节点,将Database组件拖入其中
验证:导出部署文档时,
WebServer节点下会列出MainProgram组件,DBServer下列出Database组件,形成可执行的部署清单。
6.3 组件接口绑定:必须用Assembly Connector,EA 中需双击设置接口类型
实验6包图中控制对象与数据库间存在依赖,但物理图中需明确“如何连接”。UML 要求用装配连接器(Assembly Connector)绑定提供接口(Provided Interface)与需求接口(Required Interface)。
EA 实现:
- 在
WebServer节点内,右键MainProgram组件 →Add → Provided Interface→ 输入IDataAccess - 在
DBServer节点内,右键Database组件 →Add → Required Interface→ 输入IDataAccess - 用
Assembly Connector工具(带实心圆点的虚线)连接IDataAccess(提供端)→IDataAccess(需求端) - 双击连线 →
Properties→Type设为Assembly
为什么必须 Assembly?因为
Dependency连线只表示逻辑依赖,Assembly Connector才表示物理连接(如 JDBC URL、API Endpoint),是 DevOps 流水线的输入依据。
6.4 架构图终极验证:3步交叉检查法
| 检查项 | 方法 | 不通过后果 |
|---|---|---|
| 包依赖闭环 | 在 Browser 中展开Model→ 检查所有包是否被至少一个其他包依赖(除根包Model) | 存在孤立包 → 模块未被使用,代码生成时该包被忽略 |
| 节点组件归属 | 右键物理图中任意节点 →Properties→ 查看Contained Elements是否包含对应组件 | 组件未拖入节点 → 部署文档中该组件无宿主,无法部署 |
| 接口名称一致性 | 在 Browser 中搜索IDataAccess→ 确认提供接口与需求接口同名且在同一模型中 | 名称不一致 → Assembly Connector 断连,部署连接失败 |
从那以后我每次导出 PDF 前,都强制走一遍 Log Window 刷新 + Browser 包结构检查 + 序列图消息重编号。不是怕出错,是怕错得无声无息——EA 7.5 的静默失败比报错更可怕,它会让你交一份“看起来完美”的报告,却在答辩时被问住“这个泛化关系为什么没生成 getter 方法”。希望帮到你。
本文还有配套的精品资源,点击获取