OO第四单元总结 && 课程总结

周晋磊-24371053 2026-06-19 22:02:38

OO第四单元总结 && 课程总结

一、正向建模与开发的实践总结

1.1 正向建模的核心思想

本单元的主题是正向建模——"先建模,后编码"。先建立完整的UML模型(类图、状态图、顺序图),再以此指导代码实现。本单元的任务是构建图书馆管理系统,涵盖借书/还书、预约取书、阅览室、信用分系统、每日开闭馆整理等功能。

1.2 两阶类图在正向建模过程中的作用

第一阶段类图:宏观架构设计

在编码前,先设计核心类及其关系,例如:

  • Library 作为全局协调者,持有 BookshelfTreasuredBookshelfBorrowAndReturnOfficeAppointmentOfficeReadingRoom 五大物理地点
  • BookBookCopy 的聚合关系(一书多副本)
  • UserBookCopy 的借阅/阅读/预约关联

这一阶段的作用类似建筑蓝图——先确立骨架,明确每个类的职责边界。例如 Bookshelf 仅负责物理存储和查找,借阅规则(B/C类数量限制)完全归属 User 处理。

第二阶段类图:细化设计与模型追踪

编码完成后,类图进一步细化,例如:

  • BookCopy 中引入 Guard 变量(isBorrowableisHighScoreisHeldByUserhasReadingcanPick),直接映射状态图的守卫条件
  • 新增 LibraryHelper 静态工具类,抽离整理逻辑
  • 设计 @Trigger@SendMessage 注解,在代码层面标记状态转移和顺序图消息

第二阶段类图的核心价值是建立UML模型与代码的追踪关系——精确描述每个方法归属、每个状态转移由哪个方法触发、每条顺序图消息对应哪个方法调用。

跳过第一阶段直接编码容易失去全局视角;只停留在第一阶段则无法指导具体实现。两阶递进是正向建模的完整链条。


二、架构设计与UML模型追踪关系分析

2.1 架构设计

最终架构采用分层 + 委托设计:

Main(输入解析层)
  ↓
LibraryManager(门面层,委托给Library)
  ↓
Library(核心业务逻辑层)── 持有 ── Bookshelf / TreasuredBookshelf
                                  BorrowAndReturnOffice / AppointmentOffice
                                  ReadingRoom
  ↓
LibraryHelper(静态辅助逻辑层)
  ↓
Book / BookCopy / Isbn / BookCategory / User / MovingRecord / OrderRecord(数据模型层)

关键设计决策:

  • Library 作为中心调度器:集中持有全部地点和用户数据,跨模块操作(如"书架取下→送预约处→标记配送")在同一上下文中完成,避免多对象间复杂的消息传递。
  • LibraryHelper 静态工具类:整理逻辑涉及大量跨模块操作,抽离到 LibraryHelper 既保持 Library 简洁,又通过 Library 参数方便访问全局状态。
  • Guard 变量驱动状态转移BookCopy 中的 isHeldByUserhasReadingcanPick 等布尔变量不仅是业务逻辑判断,更直接对应状态图守卫条件,使状态转移逻辑在代码中精确复现。
  • @Trigger / @SendMessage 注解:标注方法对应的状态转移和顺序图消息,形成"活的文档"。

2.2 代码与UML模型的追踪关系

通过以下机制建立双向追踪链:

(1)状态图 → @Trigger 注解 → 代码方法

@Trigger(from = "BS", to = "USER")
@Trigger(from = "TBS", to = "USER")
void triggerBorrow(BookCopy copy) { move(copy, Location.USER); }

(2)顺序图 → @SendMessage 注解 → 代码方法

@SendMessage(from = "Main", to = "Library")
public boolean orderNewBook(User user, Isbn isbn) { return handleOrder(user, isbn); }

(3)完整追踪示例(用户借书场景):

UML层: 状态图 BS → USER [Guard: isBorrowable && !isHeldByUser]
       顺序图 Main → Library → Bookshelf → User

代码层: Main.handleBorrowed()Library.handleBorrow()  // @SendMessage
         → findAvailableBookOnShelf()Bookshelf.findAvailableBook()User.canBorrow()
         → triggerBorrow(copy)  // @Trigger

三、大模型辅助正向建模的体验与引导策略

3.1 使用体验

本单元大模型的使用重心转向UML建模辅助

擅长: 类图结构快速生成、状态图完整性检查(如提醒"闭馆后阅览室的书也需要处理")、注解设计方案建议。

不擅长: 类图/状态图/顺序图之间的引用一致性(如 Guard 变量在三种图间不统一),精细业务规则(如"B类书一人只能持有一本")容易被简化或遗漏。

3.2 引导策略

策略一:分阶段递进式 Prompting。 先要求列出核心实体类→设计类间关系→设计状态图→设计顺序图→交叉验证一致性。每阶段输出作为下一阶段输入,保持聚焦、早期发现错误。

策略二:约束注入。 在 prompt 中显式列出全部约束条件(如"信用分>80才能借阅B/C类"、"每个用户一次只能阅读一本书"),迫使大模型在设计时逐条考虑。

策略三:反例驱动验证。 让大模型构造异常场景(如"用户持有B类书时再借B类"、"预约过期不取")攻击已生成的设计方案,检查模型是否覆盖。

策略四:人工审查作为最终防线。 大模型的最佳角色是加速器而非自动驾驶仪。本单元中 LibraryHelper 是否独立成类、注解粒度如何确定等关键架构决策,由我在大模型给出多种建议后结合可维护性自主决定。


四、四个单元架构设计思维的演进

第一单元:解析-计算分离

将 Lexer/Parser/AST 和 Poly 彻底分开,通过 Factor 接口实现多态求值。核心收获:好架构让复杂度被隔离在少数核心类中。

第二单元:并发分层

输入层→调度层→执行层→数据层,层间通过线程安全队列通信。引入影子电梯 Simulator 做预判调度。核心收获:架构设计要考虑动态的线程交互和时序。

第三单元:契约驱动

通过 JML 的 requires/ensures/assignable 先写契约后写实现。核心收获:架构不仅包含类结构,还应包含行为契约。

第四单元:模型驱动

融合前三单元的思维,形成 UML模型 → @Trigger/@SendMessage注解 → 代码实现 的三层映射。核心收获:先设计模型,再让代码印证模型。

演进轨迹:

怎么把代码组织好 → 怎么在并发下组织好 → 怎么让代码被验证好 → 先设计模型,再让代码印证模型

五、四个单元测试思维的演进

单元测试重心核心方法关键认知
第一单元功能边界黑盒 + TLE构造性能和正确性同等重要
第二单元并发时序极简样例 + 日志不可复现Bug需要新测试范式
第三单元规格验证JUnit + 逐条ensures规格就是测试用例的答案
第四单元模型一致性注解验证 + 状态覆盖测试不仅验证代码,更要验证模型

从"测试代码"→"测试规格"→"测试模型一致性",测试的抽象层次不断提升。第四单元不仅要验证功能正确,更要验证代码实现与UML模型的一致性:状态转移是否都有对应方法、顺序图消息是否有正确注解、Guard 条件是否在代码中实现。


六、课程收获总结

1. 架构设计是核心竞争力。 四个单元反复证明:好架构让迭代扩展轻松自如(第一单元新增求导只需Poly加一个方法),坏架构让需求变更变成灾难。

2. 抽象层次的提升比代码量重要。 从处理字符串到管理线程,从阅读形式化规格到设计UML模型,每一阶段都推动我上升一个抽象层次。注解驱动追踪机制让我认识到:代码不仅是给机器执行的,更是给人阅读的文档。

3. 迭代开发中的兼容性思维。 每次新需求不是"推翻重来",而是"优雅扩展"——Factor接口多态、异步解耦打破死锁、NetworkHelper提取、两阶类图渐进细化。

4. 大模型是工具,掌控力在人。 认知从"大模型什么都能做"到"多线程Bug搞不定"再到"最适合做结构规划和知识答疑,具体实现和模型一致性必须人把关"。引导的关键:明确约束、分阶段输入、让人掌握架构决策权。

5. 从"写对代码"到"写对的代码"再到"写对且可追溯的代码"。 第一单元追求"代码能跑"、第二单元认识"并发正确更难"、第三单元学会"正确的标准是什么"、第四单元学会"如何让别人相信代码正确"——通过UML模型、注解追踪、Guard变量的显式映射,正确性有了可验证、可追溯的证据链。

这门课程不仅教会了面向对象编程技术,更重要的是培养了从分析、设计、实现到验证的完整工程思维,以及与大模型等工具有效协作的方法论。

...全文
10 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

308

社区成员

发帖
与我相关
我的任务
社区描述
2026年北航面向对象设计与构造
java 高校
社区管理员
  • 孙琦航
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧