2025_BUAA_OO_Unit4博客总结

赵栩栩-23371281 2025-06-15 21:33:02

2025_BUAA_OO_Unit4博客总结

正向建模与开发

正向建模与开发是从需求出发,通过设计模型逐步构建系统的过程,通过抽象模型指导具体编码,以设计驱动实现,有助于构建结构清晰、可维护的软件系统。

在本单元中,我们需要构建一个图书馆管理系统,具体实践如下:

  1. 需求分析:明确系统需要支持的核心功能,如书籍管理(借阅、归还、预约)、用户管理(信用分机制)、图书馆区域管理(书架、借阅处、阅览室)等。
  2. UML建模:通过绘制不同的UML图,来描述系统的核心功能和数据结构。
    • 类图:定义了系统的静态结构,体现系统中的核心类、类的核心属性和方法以及类之间的关系。
    • 状态图:描述了系统的动态行为,即一个对象在其生命周期内所有可能的状态以及状态之间的转换条件和行为。
    • 流程图:展示对象间的交互时序,按时间顺序呈现对象之间的消息传递过程。
  3. 代码实现:依据UML图实现代码,确保架构的一致性。

架构设计总结

总体架构概述

img

img

架构设计

  1. Library类:管理所有地点类、书本类和用户类,设计方法处理开闭馆、整理操作和各种读者请求。
  2. 地点类:用于储存书籍,并进行书籍的增删操作。
    • 预约处AppointmentOffice:储存用户的预约书籍,并清理逾期书籍。
    • 普通书架BookShelf&热门书架HotBookShelf:负责管理书架上的书籍,包括查找、添加、移除书籍等。
    • 借还处BorrowAndReturnOffice:管理借还处书籍,将还书处的书籍整理回书架。
    • 阅览室ReadingRoom:管理阅览室的书籍,处理用户的阅读和归还请求。
  3. Book类:存储书本的书籍号、位置、移动轨迹、预约信息和借阅信息等内容。
  4. User类:存储用户的ID、信用分以及借阅、预约、阅读书籍的信息。

整体而言:Library类是整个系统的核心,它负责管理所有的地点和用户,并调用地点类的方法进行操作。各个地点实现相应操作的添加、删除书籍。BookUser则聚焦于自身的状态与行为逻辑。

代码设计与UML模型设计的追踪关系

  1. 类图与代码:静态结构的“蓝图—实现”映射

类图聚焦系统的静态结构,描述类、属性、方法、关系(关联、依赖、继承等)。代码则是类图的 “落地执行”,追踪关系体现在:

  • 的对应:类图里的每个 Class(如User、Book、Library),都会在代码中转化为同名的类文件。
  • 属性的对应:类图中定义的属性(如 UserstudentId),会变成代码里的成员变量,类型、可见性(public/private等)与类图设计一致。
  • 方法的对应:类图中标注的方法(如 User.borrowBook()、Library.open()),会在代码中实现为函数,方法名、参数、返回值需与设计匹配。
  • 关系的代码落地:
    • 关联关系:类图中 Library 关联 Bookshelf,代码里会体现为 Library 类持有 Bookshelf 的实例(成员变量),实现 “整体—部分” 关系。
    • 继承/实现:若有抽象类或接口(类图中特殊标识),代码里会用 extends(继承)、implements(实现)语法复现,保证多态、抽象的设计被执行。
  1. 状态图与代码:对象行为的“逻辑—执行” 映射

状态图聚焦单个对象的生命周期行为,描述对象在不同状态间的转换。在本单元中重点关注Book在不同地点之间的状态转换,Book中的Location属性是其状态的体现,每个移动轨迹箭头上的 Trigger 与代码中涉及书本移动的方法函数名一致,guard 与方法中可能有的条件判断语句一致。

  1. 顺序图与代码:多对象交互的“流程—调用”映射

顺序图聚焦多对象间的交互流程,描述 “谁在什么时间、调用谁的方法、传递什么数据”。第三次作业要求画出预约书籍的顺序图:

  • 参与者映射:顺序图中的 “角色”,对应代码里的类实例。
  • 消息传递→方法调用:顺序图中,LibraryAppointmentOffice发 “orderNewBook”消息,代码里体现为 Library.orderNewBook等。
  • 时序控制:顺序图中消息的先后顺序(如 “先检查读者预约条件,再执行预约书籍”),代码里通过方法调用的顺序保证。

大模型辅助

利用大模型辅助建模最关键的一点就是一口吃不成胖子,要分阶段循序渐进地引导大模型来完成任务。

  1. 提供全面信息:指明大模型的角色,给出指导书中完整的要求,以及需要完成的任务。
  2. 分段拆解任务:将大问题拆解为多个模块,针对每个模块来精准地向LLM进行提问。
  3. 使用有效Prompt:使用实验中给出的ROSES/COT等框架结构化提问,确保大模型理解任务的目标和输出要求。
  4. 多次迭代修改:在生成结果后,明确指出评判指标与修改标准引导大模型进行自我检查,并且结合人工反馈进行修改优化。

课程总结

架构设计思维推进

  • U1:层次化设计:第一单元的核心任务是计算并化简表达式。在结构方面,采用梯度下降的方法,实现对于表达式从复杂到简单的解析,将复杂的表达式递归地拆解为 Expr (表达式) -> Term (项) -> Factor (因子) 的清晰层次结构;在计算方面,将每个因子化作Poly多项式,在多项式层面上统一进行计算。总体实现了表达式的结构与计算逻辑的分离,自顶向下进行结构解析,自底向上进行计算,两部分逻辑分离,清晰明了,体现“高内聚低耦合”的思想。
  • U2:多线程设计:第二单元要求设计电梯系统,实现电梯的合理运行和调度,关键点在于如何在多线程并发时保证线程安全。这单元的架构主要采用了生产者—消费者模式解耦任务,建立起多个线程之间的交互关系,处理线程同步、数据竞争等问题。同时,学习了很多关于多线程并发的内容,例如synchronized锁、信号量、线程安全类等机制来进行多线程的交互设计,学会在多重指标评估系统下找到性能的最佳平衡解。
  • U3:契约式设计:第三单元要求严格遵照JML精准地设计一个社交网络系统,同时要注意具体的实现细节。这一单元我们严格遵守JML规格语言实现代码,理解例如@requires@ensures等关键字带来地无歧义的前置条件和后置条件的约束;体会规格与实现的分离,在实现JML语言描述的功能前提下,思考如何优化算法、选择容器来进行具体的实现。
  • U4:模型化设计:第四单元要求进行正向建模与开发,以图书管理系统为背景,通过类图、状态图和顺序图进行正向建模,在编写代码前对系统进行全局思考,宏观把控架构,再具体落实细节,设计思路更加清晰。

总体而言,经过四个单元的联系,我逐步实现了从局部功能拆解到宏观系统设计、从基础编程到复杂架构开发、从自由实现到规范约束的能力提升,深化了对“高内聚低耦合”“规格与实现分离”等核心设计理念的理解。

测试思维演进

  • U1主要是手动构造数据进行测试,一方面要有覆盖多种分支下的常见数据,检验基础运算的正确性;另一方面要设计极端数据,包括各种边界数据以及复杂的嵌套数据等。
  • U2为多线程设计,需要着重进行线程并发测试。针对多线程场景,设计测试用例验证线程同步、数据竞争和死锁问题。由于多线程的不确定性,需要通过大量重复测试来复现小概率的死锁或线程安全问题,在本地测试过程中使用print大法来输出关键数据,可以在出现随机错误时精准利用输出来定位信息。
  • U3为JML契约设计,基于JML的无二义性,我们设计Junit进行单元测试,针对JML语言的前置条件、后置条件以及副作用编写测试,进行从空图到完全图的增量式数据构建方法,让测试变得更有依据,极大提升了测试的全面性和严谨性。
  • U4的评测为交互式设计,因此我们需要关注的是系统的整体功能和各个模块之间的交互是否正确。基于UML设计测试数据,通过类图针对核心类开展属性与方法契约验证,分析类间依赖,设计跨模块集成测试用例;依据状态图覆盖状态转换路径;基于状态图验证对象之间的交互逻辑;依照顺序图模拟全链路流程,确保系统业务逻辑与设计规范的一致性。

课程收获

OO课程完结撒花!通过这16周4个单元的磨练,我不仅对面向对象编程的思想有了更加深入的了解,也提升了Java代码的编写能力。当然,除了能力方面的提升,OO也教会了我如何抽象问题,如何进行宏观架构设计再到具体细节落实的问题解决流程,以及如何更好地更轻松的引导大模型完成任务。

尽管写OO真的很痛苦,但不可否认这是一门很棒的课程,感谢课程组!

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

272

社区成员

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

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