首页 / 资讯中心 / 文章详情

UML图书管理系统建模拆解:从用例图到代码框架

UML图书管理系统建模拆解:从用例图到代码框架 ★ FEATURED ARTICLE
简介以UML建模的图书管理系统需求分析报告面向软件工程、面向对象课程学习者、毕业设计学生及系统设计人员完整展示从需求分析、用例模型、静态模型、动态模型到实现模型的建模全过程。报告针对借书者、图书管理员和系统管理员三类角色梳理了个人信息查询、图书搜索、预订、借阅、归还以及借书处理、还书处理、取消预订、系统维护等核心用例并结合Item、Title、Loan、Reservation、Borrower等主要类设计类图通过顺序图、活动图和协作图刻画借书模块及其他业务场景的对象交互与时间顺序展示对象间消息传递和动态行为。资源包内为1个doc文档大小265KB文字与图示集中便于打印或按章节查阅已有2496人学习下载。文档还进一步延伸到出版社信息管理、客户信息管理、库存信息管理、图书销售统计等功能模块并说明利用Rational Rose根据构件图自动生成VB代码框架、进而完成系统实现的过程。对于需要完成UML课程设计或理解业务系统建模步骤的读者是一份可直接参考的完整需求分析案例。1. UML需求分析报告拆解这份图书管理系统建模笔记能直接用吗严格说这份“图书管理系统需求分析报告”不是能直接运行的代码也不是一套完整源码而是一份建模过程记录从需求描述出发依次建立用例模型、静态模型、动态模型和实现模型最终落到 Rational Rose 2003 生成 VB 代码框架。对正在准备 UML 课程设计或刚接触面向对象建模的从业者来说它的价值在于把“需求→用例→类图→顺序图→代码框架”这条链路完整走了一遍篇幅不大适合照着复现。我拆这份报告时反复对照材料后确认真正值得借鉴的不是某一张图而是它建模顺序和粒度控制的方式先圈定角色再定义用例然后才是类和交互。下面按这个顺序把每一步的做法、参数细节和常见坑逐一展开方便你拿同一套思路去建自己的系统模型。2. 用例建模三个角色的边界决定图书管理系统的功能范围用例模型是整份报告的地基。报告里明确确定了三个角色借书者、图书管理员和系统管理员。这一步看着简单但在实际作业里最容易出问题很多初学者会把“数据库”“系统日志”这类非交互主体当作角色或者把角色直接当成具体的某个人。下面把这部分拆开讲。2.1 角色识别借书者、图书管理员、系统管理员不是同一个级别参与者Actors的定义是“与系统有交互作用的人或事务”它代表交互时的身份而不是岗位本身。借书者对应一类使用系统查书、借书、还书、预定的用户图书管理员是操作借书处理和还书处理的操作员系统管理员则负责读者信息管理、图书信息管理和系统状态维护。三者的交互目标完全不同在用例图上分别触达不同用例所以必须拆成三个角色即使真实场景里管理员自己也会借书该场景应该由借书者角色去表达。判断一个候选对象是不是角色我一般看两条标准是否直接向系统发起请求是否接收系统的输出。借书者向系统提交查询请求符合管理员执行借书处理属于系统内部操作执行方符合出版社、客户这些外部实体在借阅主流程里不直接交互不需要作为用例图上的角色。这条边界画清楚系统的外部范围就定了——所有在边界外的交互方都不可能成为你的用户故事。类与角色的关系也要预先区分。用例图上的角色是系统外部的东西而后面类图里的 Borrower 是系统内部记录借书者信息的类两者同名但层级不同。建模时不要试图“把用例图角色映射成类图上的类”在实现层面外部角色由登录认证和操作权限去识别内部类只是数据载体强行一一对应会导致后续设计时不知道该把登录校验放哪。2.2 用例分解把需求描述翻译成用例图元素报告的需求描述部分给出了清晰的功能清单对借书者查询个人信息、查询图书信息、预定当前正被借阅的图书、借阅图书、归还图书对图书管理员借书处理、还书处理、取消图书预定对系统管理员读者信息管理、图书信息管理、系统状态维护。把每句话翻译成用例时有三个细节值得注意。第一用例名用动宾短语不要用菜单名。需求原文里的“读者信息管理”在用例图上最好拆成“新增读者”“修改读者信息”“删除读者”三个用例因为管理类操作背后通常有独立的校验逻辑和权限控制合并成一个用例会在后续画顺序图时无从下手。“库存信息管理”同理它对应的是管理员对图书库存数据的增删改查和查找拆开画更清楚。第二“预定当前正在被别人借阅的图书”要拆出状态判断。查询图书信息时系统不仅要返回书目还要返回每本副本的当前状态在馆、借出、预定中只有当状态为借出时才允许发起预定请求。这个约束放在用例描述里写清楚比在用例图上画一条“包含”更有操作性。第三用例的粒度判断标准是“一个操作单元”而不是“一个功能模块”。查询图书信息算一个用例查询个人信息算一个用例统计图书馆藏量这种跨模块报表单独算一个用例。很多人把整块“图书管理”画成一个大用例评审时说不清系统到底提供了什么后面做类图也找不到依赖对象。2.3 用例关系include 与 extend 在预订场景里的用法用例之间常见三种关系包含include、扩展extend和泛化generalization。这份报告没有标注关系但预订场景天然适合用 include 来拆公共流程。“借阅图书”用例必然包含“验证借书者身份”和“登记借出记录”“预定图书”用例也包含“验证借书者身份”公共校验可以抽取为被包含用例箭头从主用例指向被包含用例并带《include》标记。extend 用于可选流程。“查询图书信息”查到目标图书后发现已被借出此时扩展出一个“提交预定请求”的可选分支。箭头方向相反从扩展用例指向被扩展用例这是最容易画反的地方。Rational Rose 2003 里 include 和 extend 都是依赖关系加 Stereotype画的时候选中用例间的依赖箭头再在属性面板设置 Stereotype 为 include 或 extend不要把两者画成普通关联。报告的用例图没有附带用例描述文本但实际建模时强烈建议对每个核心用例补一段三段式描述前置条件、主事件流、异常事件流。以借阅图书为例前置条件是借书者身份有效且图书状态为可借主事件流是校验借书证、校验图书副本状态、创建借出记录、修改副本状态为借出异常事件流是证无效、书被借走、借书者超限时分别终止流程。这段文字是后面画顺序图、活动图和写测试用例的公共依据它的价值不亚于图本身。3. 静态建模五个核心类与类图关系从 Item 到 Loan 的映射进入静态模型阶段系统的“名词”要被固定下来有哪些类、类的属性操作是什么、类之间是什么关系。报告给出的五个核心类 Item条目、Title标题、Loan借出、Reservation预定、Borrower借书者信息是通用借阅系统的标准拆分值得逐类拆开讲。3.1 五个核心类的职责与关键属性先把最容易被搞混的 Item 和 Title 讲透。Title 代表一本书的书目信息对应 ISBN、书名、作者、出版社、出版日期Item 代表这本书在馆里的物理副本对应条码号、馆藏位置、当前状态在馆、借出、预定中。同一本 Title 可以有多个 Item采购三本就建三条 Item 记录。这个拆分是借阅系统的关键不做拆分的话馆藏多副本时数据会大量重复也无法区分是哪一本被借走了。Loan借出记录一次具体借阅行为属性至少包含借出时间、应还时间、实际归还时间、续借次数。Loan 与 Item 在未归还状态下是 1 对 1 关系某个 Item 同一时刻只能有一条未归还的 Loan 记录。这个约束在类图上用关联多重性标注在数据库层面还应该用唯一索引兜底建模与实现双重保证这是课程设计里很加分的细节。Reservation预定记录预定行为属性包括预定时间、状态等待中、已取消、已完成。多个借书者预定同一本被借出的图书时Reservation 实例有多条按预定时间排队书归还后依次通知。报告里提到管理员在图书借出给预定者后取消预定这个“取消”操作本质上是一次状态更新不是删除记录状态流要保留。Borrower 代表借书者信息属性包括借书证号、姓名、联系方式、最大可借数量、当前借出数。最大可借数是业务规则字段建议放在系统配置里当前借出数不建议持久化而是通过 Loan 实时计算否则任何一次还书漏更新这个字段就成了数据黑洞。五个核心类的职责与关键属性可以整理成下表类名职责关键属性Title书目信息一本书的抽象ISBN、书名、作者、出版社Item馆藏副本可借出的物理实体条码号、馆藏位置、当前状态Loan借出记录一次借阅行为借出时间、应还时间、归还时间Reservation预定记录等待队列预定时间、状态Borrower借书者档案借书证号、姓名、联系信息3.2 类间关系关联、聚合与依赖的连线规则类图画完类框真正的工作在连线。五个类的关系在报告里没有展开但从业务规则可以明确推导Loan 关联 Borrower 和 ItemReservation 关联 Borrower 和 ItemTitle 与 Item 是聚合关系Item 是 Title 的组成部分但 Item 可以独立存在——下架报废时移除 Item 而不删除 Title所以用空心菱形。多重性标注是类图的灵魂。一个 Borrower 可以有多条 Loan1 对多一个 Loan 对一个 Item 且未归还时 Item 只能对应一条 Loan1 对 1一个 Borrower 可以有多条 Reservation一个 Title 聚合多个 Item1 对多。这些数字标注是后续生成数据库表结构和写查询语句的直接依据。我复查别人类图时第一件事就是扫多重性多重性不对意味着业务规则有漏洞比如忘了标注同一本副本同一时间只能被一条 Loan 占用实现时就会出现重复借出。依赖关系里有一个容易漏画的地方Borrower 和 Reservation 之间有“取消预定”操作取消动作依赖当前时间但这类纯逻辑依赖在类图上可以不用画线在顺序图里通过消息体现。类图应保持“名词和关系的静态结构”把所有动态判断塞进类图整张图的关联线会多到没法读评审时反而说不清重点。3.3 将类图映射到 VB 代码框架的生成准备报告提到用 Rational Rose 2003 根据构件图生成代码框架生成语言选 VB。实际操作路径是在构件图中为每个类建立组件右键组件选择 Assign To 将类分配给组件再对组件执行 Generate Code生成一批 .cls 类文件。VB 类模块默认按类图的属性 Visibility 生成 Public 字段或 Property Get/Let 封装Loan 类生成的骨架大致如下 Loan.cls - Rational Rose生成的VB代码框架示例 Option Explicit 属性借出时间 Private mLoanDate As Date 属性预计归还时间 Private mDueDate As Date 属性实际归还时间未归还时不赋值 Private mReturnDate As Date Public Property Get LoanDate() As Date LoanDate mLoanDate End Property Public Property Let LoanDate(ByVal vNewValue As Date) mLoanDate vNewValue End Property这段框架代码的逻辑说明Rose 把类图里的私有属性 mLoanDate 生成为 Property Get/Let 对属性范围来自类图属性窗口的 Visibility 设置标为 Private 生成封装读写标为 Public 则生成公有字段。参数要点日期字段一律用 Date 类型ReturnDate 归还未赋值时判断逾期应比较 DueDate 与当前日期而不是依赖 ReturnDate 是否为空避免空值判断混乱。生成框架后类图上的操作只生成方法签名方法体要自己补。比如 Borrower 类有 GetLoanHistory 操作代码框架里只有声明遍历 Loan 集合筛选当前借书者记录的逻辑要自行实现。这一步是模型变系统的交界处也是很多人卡住的地方——模型画得很大生成代码时发现三分之一的类没有实际职责又不敢删。我的习惯是生成代码前先做职责检查每个类至少有一个能说清“为什么存在”的操作说不清就回类图调整不要带着空类往下走。4. 动态建模借书模块顺序图把交互画到消息级静态模型回答“系统有什么”动态模型回答“系统怎么协作”。报告选择顺序图展示借书模块的交互同时提了活动图和协作图。顺序图是全报告最值得复现的部分它把借书从发起到完成的每一步消息都画了出来也是从模型过渡到代码的最后一层抽象。4.1 生命线与激活顺序图的两个基本要素顺序图纵向看时间、横向看对象。每个参与交互的对象画一条垂直生命线顶部标注“对象名类名”比如“:Borrower”“librarian:图书管理员”。报告里描述的生命线规则要理解到位对象存在期间用虚线激活期间变成双道线实际工具里是细长矩形消息用从一个生命线指向另一个生命线的箭头表示。时间轴上消息只能从激活块出发或指向激活块不能凭空画一条跨生命线的线。用 Rational Rose 2003 创建顺序图的操作流程是在 Use Case View 下右键用例选择 New → Sequence Diagram把 Actor 和对象从工具栏拖入图面再选择 Message 工具栏按钮画消息。工具栏里总共有三种箭头Message、Reverse Message 和 Return Message画错了消息的实心和虚线标识导出文档时语义就完全错位。画完以后把每个对象与类图关联双击对象名在 Class 下拉框选中对应的类这一步不做Rose 生成代码时无法从顺序图推导对象类型框架代码就没法自动补全。借书模块的参与者包括借书者、图书管理员两个外部角色以及内部的借书窗口、借阅记录、图书条目等对象。对象的选择要与类图对应顺序图里消息的接收者最终要映射为类图上某个类的一个操作。比如“创建 Loan 记录”消息最终对应 Loan 类的新增操作如果消息发给一个类图上不存在的对象这条线就是实现模型里的孤儿生成代码时找不到落点。激活块嵌套有讲究激活开始于接收消息结束于返回消息给调用方期间可以嵌套其他消息嵌套的激活块要缩进一格。嵌套层数超过三层时优先考虑把内部逻辑抽成独立对象否则激活块层层包裹图面越画越乱最后连自己都看不明白。工具里激活块的长度可拖拽调整长度不代表耗时只代表消息处理的起止别在这个细节上纠结。4.2 借书流程的消息序列与消息类型借书场景的消息序列按报告功能可以整理为下面这组步骤。业务假设是借书者把书交给管理员由管理员在系统内操作因此消息起点是管理员而不是借书者直接触发系统管理员向“借书窗口”发送“扫描借书证”消息借书窗口向 Borrower 对象发送“查询借书者”消息校验身份有效性Borrower 对象返回借书者信息包含当前借出数量借书窗口判断未超限向“图书条目”对象发送“查询副本状态”消息Item 对象返回状态为“在馆”借书窗口创建 Loan 对象设置 LoanDate 和 DueDateLoan 对象向 Item 对象发送“更新状态为借出”消息借书窗口向管理员返回借书成功结果每一步消息都要注意箭头规矩同步消息是实线实心箭头返回消息是虚线箭头。消息名用动词短语括号里写参数返回类型写在冒号后。这条消息序列在后期可以直接转成测试用例每个消息节点就是一个断言点比如步骤 2 断言借书证有效、步骤 5 断言图书可借。事务边界在这里很关键步骤 5 到步骤 7 之间如果 Item 被其他并发请求改状态就会出现超借。顺序图不画事务边界但可以通过嵌套关系暗示比如在借书窗口内部加一个“借书事务控制器”对象把检查状态、创建 Loan、更新状态包在一个事务里。课程设计通常不做并发但要知道边界在哪老师追问时能答出“这里需要事务保护”就够了。4.3 活动图与协作图动态模型的另外两个视角活动图适合表达带分支的业务流程。还书流程就是个典型管理员扫描条码系统判断是否逾期逾期先缴纳罚款再登记归还未逾期直接登记同时更新 Loan 记录的归还时间、更新 Item 状态为在馆。这种带菱形判断的流程活动图比顺序图直观得多分支条件写在线路标注上比在文字里描述清晰。协作图与顺序图表达的信息完全等价差异只在于协作图不强调时间轴按对象空间分布画连线并在线上编号消息顺序。报告提到协作图但没展开实际工作中我很少单独建协作图顺序图足够表达时序。如果需要展示对象间的静态消息通道Rational Rose 里可以在顺序图窗口直接把图转换为协作图一键生成且保证两图一致别手工重画。动态建模的时间分配建议顺序图占七成、活动图占两成、协作图占一成或省略。顺序图是后期写代码、写测试用例、排查并发问题的主要依据值得把每条消息核对到类图的操作上活动图只在流程分支明显时使用给每个模块都画活动图只会堆出一堆没有信息量的框白白增加报告篇幅。5. 避坑UML 建模中五个高频问题与排查记录UML 建模的坑集中在“图与图不一致”和“粒度失控”两类。下面五条按踩坑频率排序每条按现象、原因、解决三步整理照着检查能省下大量返工时间。5.1 现象用例图把登录当成核心用例功能边界失控现象用例图上“登录”“退出”和“借阅图书”“归还图书”平级并列整张图每个功能都在但评审时说不清系统到底解决了什么问题。原因登录是大多数用例的前置条件不是一个业务功能。借书者在执行“借阅图书”之前当然要证明身份但需求方不会为“登录”单独验收验收的是登录之后的业务闭环。解决把“登录”处理为公共前置条件写在用例描述里不画成用例。如果系统存在特殊认证场景比如管理员需要二次验证可以单独建一个“管理员认证”用例让其他管理用例 include 它。检查方法是对每个用例问一句“去掉它业务会不会断”——登录断了但借书业务不断说明登录不是用例只是入口。5.2 现象类图画了类却不画关系数据流全断现象类图里摆了 Borrower、Loan、Item 几个类框属性和操作都填了但类与类之间没有连线。评审的人完全看不出借书者和借出记录是怎么关联的整张图成了一堆名词的黑匣子。原因画图时只做了名词归类没有做关系分析。关系分析依赖业务规则“一本书同时只能有一条未归还的借出记录”这类规则必须通过 Loan 与 Item 之间的 1 对 1 关联表达少一条连线就少一个业务约束。解决强制走三步先列业务规则再画多重性最后连线。类图完成后做一致性核对类图的每条关联都能在用例描述里找到依据用例描述里的每个数据动词登记、查询、更新都要落在某条关联或操作上。三步走完连通性问题自然消失。5.3 现象顺序图画成流程图消息箭头方向画反现象顺序图里没有对象生命线只有一排标注框消息用从上到下的箭头连接步骤实际画成了流程图部分消息从对象指向发起者箭头方向完全反了。原因没理解消息一定是“某个对象向另一个对象发出请求”箭头方向从请求方指向接收方。流程图的箭头表达时间先后两种图的思维方式不同混在一起必然翻车。解决按“谁发起、谁执行”原则重画。借书场景里管理员发起“查询借书者”箭头从管理员指向借书窗口再延伸到 Borrower 对象不是从 Borrower 指向管理员。画完后把每条消息念一遍主语是发送方、动词是消息名、宾语是接收方主谓宾通顺图就基本对了。5.4 现象需求文档前后功能描述不一致出现两套系统现象报告前半段在讲借书者查书、借书、还书、预定后半段忽然出现出版社信息管理、客户信息管理、库存信息管理、统计图书销售情况像在一份图书馆系统报告里混进了一套图书销售系统。原因需求分析阶段没有收敛业务范围把不同来源的功能诉求堆到一起。这类问题在课程设计里常见参照了多份材料最后没统一需求一散后面的图全都跟着散。解决建模前先圈定核心业务对这份报告应明确“本系统解决图书馆借阅管理”出版社、客户、销售模块要么移除要么单独建模。如果老师要求保留至少要在范围说明里写清楚“属于后续扩展方向不在本期建模范围”并保证用例图、类图只画本期元素。检查方法是用例图上的每个用例在需求描述里必须有原文依据需求描述里出现但用例图没有的就是范围没对齐。5.5 现象生成代码框架后与类图不一致修改全靠手工现象用 Rational Rose 2003 生成 VB 代码后类里的属性类型、范围声明与类图对不上后续只能手工改代码久而久之模型成了摆设没有后悔药可吃。原因生成代码前没有检查代码生成属性类图的 Visibility 与 VB 默认映射不一致另外 Rose 对 VB 的 Date 类型、集合类型映射有默认规则不配置直接生成偏差很大。解决生成前逐类检查 Visibility公有用 Public、私有用 Private、受保护用 Friend。关联多重性影响生成代码是否包含集合属性1 对多关联会在“1”端生成集合对象不想让框架代码臃肿就在关联属性里关闭生成。生成后抽查三个类把类图属性与生成的 .cls 文件逐项比对确认类型、范围一致再继续补业务代码不要改了模型反而让图和代码越走越远。6. 从模型到代码框架三个验证技巧让生成结果不再返工报告在实现模型阶段提到建模完成后可由 Rational Rose 2003 根据构件图生成系统代码框架。这一章不重复操作步骤只讲三个能让生成结果更可靠的验证技巧每一步都对应我在前面章节踩过的真实问题。第一个技巧是生成代码前做“模型出口检查”确认用例图、类图、顺序图三个模型的对象完全对得上。具体做法是把顺序图每个生命线对应的对象名去类图里找类找不到就补类或改对象名把类图每个类的核心操作去用例描述里找依据找不到就删操作或补用例。这份报告里借书模块顺序图涉及的对象都能映射到五个核心类检查起来很快但这五分钟能避免生成框架后出现大量空类和死代码。第二个技巧是生成代码后做“三三抽查”随机抽三个类核对生成的属性类型、范围声明和关联集合三个点。VB 语言下Rose 对 Date、String、Integer 都有默认映射类图设置不当会在生成的代码里出现 Object 类型后续业务代码写不下去只能返工。三三抽查五分钟完成能堵住九成以上的不一致。第三个技巧是用“顺序图消息清单”验证方法覆盖把借书模块顺序图的每条消息写成“接收对象 方法名”清单再去生成的类模块里逐个确认这些方法签名都存在。顺序图画了八条消息类图却只有两个方法这种翻车我在检查别人的建模作业里见过很多次——图各画各的系统根本没法落地。从那以后我每次交建模作业或项目设计文档都强制走一遍“角色→用例→类→消息”的逐层检查并且把需求原文里每一个功能动词逐条对应到图上凡是没有对应图的动词就是漏项。这套检查方法来自对这份报告的完整拆解希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站