
简介本资源是一份面向高校软件工程与UML建模初学者的实验教学资料聚焦图书管理系统中状态图与活动图的核心建模实践助力学生掌握系统行为建模的关键技能。文档完整呈现实验目的、内容分析、绘图步骤及Rose工具实操指引详细梳理了图书可借/被借/被预约/删除与借书证可用/不可用/删除的状态转换逻辑以及管理员处理还书、借书、罚款三类核心活动的流程建模方法。资源为单个Word文档.doc格式文件大小233KB结构清晰、图文结合便于课堂学习、课后复盘与作业参考。已有5256人下载学习内容覆盖状态机语义理解、UML图形规范表达及Rose建模实操要点是UML行为建模入门阶段不可多得的精炼笔记型参考资料。1. 图书管理系统里为什么“被预约”不能直接跳到“被借”——状态图不是流程图活动图也不是操作手册在实际教学和课程设计中UML 实验4常被误当作“画图作业”学生照着模板拖几个圆角矩形、连几条带箭头的线交差了事。但真正卡住人的是状态迁移逻辑的合理性——比如图书从“被预约”状态能否不经验证直接进入“被借”答案是否定的。因为状态图刻画的是对象生命周期中受约束的合法状态变迁而“预约成功后必须由管理员确认借阅资格、检查逾期记录、核对押金”这些约束决定了“被预约→被借”之间必须插入一个隐式守卫条件guard condition如[预约已确认且用户无欠款]。这正是状态图区别于活动图的核心前者描述“能变成什么样”后者描述“怎么一步步做”。本实验用图书管理系统为载体把抽象的状态机理论落到可验证的业务规则上——适合刚学完类图/用例图、正要进入动态建模阶段的本科生也适合需要快速复现教学案例的助教或培训讲师。它不依赖特定编程语言但要求你理解“状态”“事件”“动作”“守卫条件”四要素如何映射到真实业务语义。2. 状态图建模从“可借→被借”迁移背后的三重约束解析2.1 状态图本质有限状态机FSM在UML中的可视化表达状态图不是美化后的流程图而是对对象生命周期的形式化建模。其数学基础是有限状态机Finite State Machine包含五个核心要素状态集States、初始状态Initial State、终止状态Final State、事件Event、迁移Transition。在图书管理系统中“书”是一个典型的状态持有者Stateful Object它的实例如ISBN 978-7-04-051234-5在系统中存在明确的生命周期每个状态对应一组可执行操作与禁止操作。例如处于“被借”状态的书不允许再次被借出但允许触发“还书”事件而“删除”状态是终止态不可逆。这种约束无法用类图表达必须靠状态图显式声明。提示Rose 工具中状态图的起始点是实心黑圆终止点是带圆圈的实心黑圆。若漏画初始状态工具可能默认第一个状态为起点但语义上不严谨——因为“New book”必须是显式创建事件触发的而非自然存在。2.2 书的状态建模四个状态与五条迁移路径的业务推导根据实验要求书的状态包括可借Allow borrow、被借Borrowed、被预约Reserved、删除Deleted。但仅列出状态名远远不够关键在于迁移事件与守卫条件的绑定。我们逐条分析2.2.1 “可借 → 被借”迁移借书事件 可用性校验Event: borrow() Guard: [book_copy_count 0 AND user_status active] Action: decrease_copy_count(); record_borrow_log()这条迁移不是无条件触发。borrow()事件发生时系统必须检查两个守卫条件该书副本数是否大于0避免超借借阅者账户状态是否为活跃排除黑名单用户。动作部分则执行具体业务逻辑扣减副本数、写入借阅日志。在 Rose 中需在迁移线上标注borrow() [book_copy_count 0 and user_status active] / decrease_copy_count(); record_borrow_log()。2.2.2 “被借 → 可借”迁移还书事件 损坏检测Event: return() Guard: [damage_level minor] Action: increase_copy_count(); update_last_return_date()还书不是简单回退。若归还书籍破损严重damage_level severe应迁移到“待审核”状态实验未要求但实际系统必备而非直接回到“可借”。此处守卫条件damage_level minor是业务规则硬约束必须显式写出。Rose 中若忽略守卫会导致模型无法反映真实风控逻辑。2.2.3 “可借 ↔ 被预约”双向迁移预约机制的原子性保障预约行为本身不改变书的物理可用性但需锁定资源。因此“可借 → 被预约”由reserve()事件触发守卫为[reservation_quota 3]单用户最多预约3本而“被预约 → 可借”需cancel_reservation()事件且无额外守卫——因为用户取消预约不涉及其他校验。注意此迁移不可与“被预约 → 被借”合并否则将混淆“预约成功”和“借阅成功”两个语义完全不同的业务节点。2.2.4 “被预约 → 被借”迁移预约转借阅的强校验链这是实验中最易出错的迁移。学生常画成直接连线但实际需经三重校验用户当前无逾期未还书籍[user_overdue_count 0]预约记录未过期[reservation_expiry now()]该书当前副本数仍 ≥1[book_copy_count 1]三者缺一不可。在 Rose 中必须将这三个条件用AND连接写在迁移线上而非仅写borrow_from_reservation()。否则模型将允许已过期预约直接借出违反图书馆管理规范。迁移路径触发事件守卫条件关键字段动作典型实现可借 → 被借borrow()book_copy_count 0, user_status activedecrease_copy_count(), log_borrow()被借 → 可借return()damage_level minorincrease_copy_count(), update_date()可借 → 被预约reserve()reservation_quota 3create_reservation_record()被预约 → 可借cancel_reservation()—delete_reservation_record()被预约 → 被借borrow_from_reservation()user_overdue_count 0, reservation_expiry now(), book_copy_count 1consume_reservation(), decrease_copy_count()2.3 借书证的状态图从“可用”到“不可用”的权限降级逻辑借书证状态虽仅三类可用、不可用、删除但“不可用”的触发场景多样需在状态内部分解。Rose 中可使用复合状态Composite State表达[Available] └── substates: └── Normal (default) └── Overdue (on entry: send_reminder()) └── Suspended (on entry: lock_account()) [Unavailable] └── entry / check_suspension_reason() └── do / monitor_reactivation() [Deleted] └── exit / purge_user_data()“不可用”不是单一状态而是聚合态当用户产生逾期Overdue或违规Suspended均落入“不可用”外框但内部子状态决定恢复路径——逾期用户缴清罚款后自动恢复违规用户需管理员人工解禁。实验文档中简写为“不可用”但建模时若不分层将丢失关键业务分支。Rose 绘制时先画大状态框标注“Unavailable”再在其内用虚线分隔区域填入子状态及入口动作。3. 活动图建模管理员操作流中的并发与决策点落地3.1 活动图 vs 状态图谁描述“做什么”谁描述“是什么”活动图Activity Diagram聚焦系统行为流程本质是带控制流的高级流程图用于建模用例的业务逻辑。它不关心对象状态变迁而关注动作序列、并行分支、决策判断。在本实验中“管理员处理借书”是一个典型用例其活动图需体现三个关键特征决策点Decision Node验证借阅者信息是否正确分支为“正确→执行借阅”和“不正确→提示错误”并发分叉Fork Node处理罚款与处理借书可并行如用户有欠款但不影响本次借阅泳道Swimlane明确动作责任主体如“输入图书条形码”属管理员“验证用户信息”属系统服务。注意活动图中的“动作”必须是可执行的原子操作如“调用用户验证API”而非模糊表述“检查用户”。实验文档中“输入借阅者信息”需细化为“输入借书证号→调用auth_service.validate()→接收返回布尔值”。3.2 管理员活动图从“输入条形码”到“添加借书信息”的七步闭环按实验步骤管理员活动图主流程为进入系统 → 输入条形码 → 查找书籍 → 输入借阅者信息 → 验证 → 正确则添加借书信息。但完整建模需补全异常路径与系统交互细节。以下是 Rose 中可直接复现的活动节点序列3.2.1 起始与系统交互节点Start → [Enter Library System] → [Input ISBN Barcode] → [Call book_search_service.find_by_isbn(isbn)] → [Receive Book Entity or null]关键点book_search_service.find_by_isbn()是系统服务调用需标注为调用行为节点Call Behavior Action而非普通动作。Rose 中右键节点选择“Properties → Stereotype → ”并在Name栏填入服务名。3.2.2 决策节点与双路径处理[Receive Book Entity or null] ↓ [Book Found?] ├─ true → [Input Borrower ID] └─ false → [Display Book Not Found] → End此处决策节点必须标注守卫条件[book_entity ! null]。若省略模型将无法区分“未找到”与“找到但无库存”两种失败场景。3.2.3 用户验证的嵌套决策结构输入借阅者ID后验证环节需两层判断[Input Borrower ID] → [Call auth_service.validate(borrower_id)] → [Validation Result] ↓ [Is Valid?] ├─ true → [Check Reservation Queue] └─ false → [Display Invalid Borrower] → End [Check Reservation Queue] → [Call reservation_service.get_queue_position(borrower_id)] → [Queue Position 0?] ├─ true → [Notify You are #X in queue] → End └─ false → [Proceed to Borrow]实验文档仅写“验证进行验证借阅者信息不正确添加借书信息正确”但实际系统中验证通过后还需检查预约队列——这是图书管理特有的业务规则必须体现在活动图中。3.2.4 并发处理罚款与借阅登记当用户验证通过且无预约排队进入最终操作[Proceed to Borrow] ↓ [Fork Node] ├─ [Charge Fine if overdue] → [Call fine_service.calculate(user_id)] → [Update Fine Record] └─ [Create Borrow Record] → [Call borrow_service.create(borrower_id, book_id)] [Join Node] ↓ [Send Borrow Confirmation SMS] → EndFork/Join 结构确保罚款计算与借阅登记并行执行提升响应速度。Rose 中使用粗黑线表示 Fork粗黑菱形表示 Join节点间连线标注«fork»和«join»构造型。4. Rose 工具实操从新建模型到导出 PNG 的六步避坑指南4.1 创建状态图与活动图的工程级配置Rose 不是即开即用的绘图工具需正确初始化模型结构。常见错误是直接新建图表导致元素无法关联到类。正确流程新建物理模型Physical ModelFile → New → Model → Physical Model命名为LibrarySystem_Model添加逻辑视图Logical View右键模型 →New → View命名为Dynamic_Modeling在视图中新建状态图右键Dynamic_Modeling→New → Statechart Diagram命名为Book_State_Diagram关联类将Book类从Logical View拖入状态图画布右键该类 →Open Specification→ 在General标签页勾选Is Active表明它是主动对象拥有自身状态机设置初始/终止状态从工具栏拖入Initial State和Final State元素连线时确保箭头起点为初始状态终点为首个状态如Allow borrow导出为 PNGDiagram → Export Diagram → Format: PNG勾选Include Legend和Scale: 100%避免截图失真。提示若状态图中无法为迁移添加守卫条件检查是否在Tools → Options → Diagram → Statechart中启用了Show Guard Conditions选项。未启用时迁移线上只显示事件名守卫条件将被隐藏。4.2 迁移线标注的语法规范与常见错误Rose 中迁移线文本格式严格遵循 UML 规范event-name [guard-condition] / action-list。三部分用空格分隔方括号和斜杠为必需符号。典型错误示例及修正错误写法问题分析正确写法borrow [book_copy_count0]缺少斜杠分隔动作且比较符周围无空格borrow [book_copy_count 0] / decrease_copy_count()return() {damage_levelminor}守卫条件误用花括号且字符串未加引号return() [damage_level minor] / increase_copy_count()reserve [quota3] create_res()动作名含空格Rose 解析失败reserve [quota 3] / create_reservation_record()动作名必须是合法标识符无空格、无特殊字符建议采用下划线命名法。Rose 对大小写敏感decrease_copy_count()与Decrease_Copy_Count()被视为不同动作。4.3 活动图泳道划分与责任归属标注实验要求“分析管理员的活动状态”但活动图需明确动作执行主体。Rose 中泳道Swimlane定义责任边界添加泳道Diagram → Add Swimlane输入名称Administrator左侧和System右侧分配动作将Input ISBN Barcode、Input Borrower ID拖入Administrator泳道将Call book_search_service.find_by_isbn()、Call auth_service.validate()拖入System泳道跨泳道连线从Administrator中的Input Borrower ID连线至System中的Call auth_service.validate()标注send构造型表示消息发送返回消息从System的验证节点连线回Administrator标注receive并注明返回参数validation_result: Boolean。此举使活动图具备可追溯性——任何动作都能定位到执行者为后续开发分工提供依据。5. 验证与调试用三类测试用例反向检验状态图与活动图的完备性5.1 状态图验证基于迁移覆盖的穷举测试法状态图是否完备取决于是否覆盖所有合法迁移路径。以“书”状态为例构造三类测试用例驱动验证5.1.1 正向迁移测试模拟正常业务流用例1新书入库 → 可借 → 被借 → 还书 → 可借执行步骤创建Book实例触发create()事件进入Allow borrow触发borrow()进入Borrowed触发return()进入Allow borrow。验证点所有迁移线上守卫条件应全部满足无未定义状态跳转。5.1.2 边界条件测试触发守卫失败的迁移用例2用户逾期时尝试借阅已预约书籍执行步骤设user_overdue_count 1触发borrow_from_reservation()事件。验证点迁移应被阻断停留在Reserved状态且系统需记录拒绝日志可通过动作log_rejection(overdue)验证。5.1.3 终止态保护测试防止非法退出用例3对Deleted状态的书触发borrow()执行步骤将书设为Deleted尝试调用borrow()。验证点无迁移发生状态保持DeletedRose 应报错“no transition defined for event borrow() in state Deleted”。5.2 活动图验证基于路径覆盖的决策点检查活动图验证聚焦决策节点的分支完整性。针对管理员借书活动图设计以下测试测试路径触发条件预期结果Rose 中验证方式主成功流ISBN存在、用户有效、无预约排队执行Create Borrow Record并发送确认短信跟踪从 Start 到 End 的完整路径检查所有决策节点均走 true 分支书籍不存在输入无效ISBN显示“Book Not Found”后结束在Book Found?决策节点强制走 false 分支确认Display节点被激活用户无效借书证号不存在显示“Invalid Borrower”后结束在Is Valid?决策节点走 false 分支验证错误提示动作执行用户有预约queue_position 5显示排队位置后结束在Queue Position 0?走 true 分支确认通知动作输出正确序号提示Rose 自带Diagram → Validate功能可检查语法错误如未连接的节点、缺失初始状态但无法验证业务逻辑。上述测试必须人工模拟或导出 XMI 文件后用 Python 脚本解析迁移规则。5.3 模型一致性检查状态图与活动图的交叉验证技巧最终交付前需确保两类图在关键节点上语义一致。例如状态图中borrow()事件必须在活动图的“处理借书”流程中作为最终动作出现活动图中Call auth_service.validate()的返回值true必须对应状态图中borrow()迁移的守卫条件user_status active状态图的Deleted终止态在活动图中应表现为“删除书籍”用例的独立流程而非借书流程的分支。交叉验证方法提取状态图所有事件名borrow, return, reserve...在活动图中搜索同名动作或服务调用反之提取活动图中所有系统服务调用book_search_service,auth_service在状态图中确认其触发的迁移是否定义了相应守卫。不一致处即为模型缺陷需修正。本文还有配套的精品资源点击获取