OO Unit4 Summary

刘发源-19373612 2025-06-10 07:47:27

一、正向建模与开发

正向建模是指从需求或功能规格开始,逐步推进设计、开发、测试等阶段的软件开发过程。

本单元通过图书馆管理系统实现了完整的正向建模与开发流程:基于图书借阅、预约、逾期管理等核心需求,抽象出BookAppointmentStudents等关键实体类,每个类聚焦单一职责(如Appointment专管预约逻辑)。在抽象出类之后,我为每个类分配了明确的职责。以Library类为例,它作为整个图书馆管理系统的核心,负责协调各个子系统的工作。Students类则专注于管理学生的借阅信息、信用积分等。

正向建模并不是一次性完成的,而是一个迭代的过程。在开发过程中,每次作业我都根据实际情况对模型进行了多次调整和优化。在开发过程中,我们遵循了面向对象的设计原则,如单一职责原则(每个类负责一个明确的部分)、开闭原则(通过组合和扩展,而不是修改已有代码)等。

二、架构设计

系统的核心是Library类,它整合了所有子模块:

- BookShelf`和HotBookShelf`:分别管理普通图书和热门图书。

- Appointment:处理预约逻辑,记录预约信息,并在预约过期时进行清理。

- BorrowReturn:临时存储归还的图书,等待每天开馆整理。

- ReadingRoom:管理当天在阅览室阅读的图书。

- Students:管理学生的状态,包括借阅的图书、预约信息、信用积分等。

本作业的架构设计采用了分层架构的思想,将系统分为多个层次,每个层次负责不同的功能。主要层次包括:

  • 数据层:负责数据的存储和管理,如BookShelfHotBookShelf类负责图书的存储,Students类负责学生信息的管理。
  • 业务逻辑层:处理具体的业务逻辑,如Library类负责图书馆的整体管理,BorrowReturnAppointment类负责借阅和预约业务的处理。
  • 控制层:负责接收用户的输入,调用业务逻辑层的方法进行处理,如Main类负责读取用户的命令,调用Library类的相应方法。

在开发过程中,我先根据需求绘制了 UML 模型图,明确了类的结构和关系,然而,在实际开发过程中,由于一些细节的调整和优化,也会进行修改。最后的UML类图如下所示:

 

三、大模型辅助

1、场景拆解与渐进式引导

就像在实验中所练习的那样,我们需要拆解问题,逐步引导大模型。对于复杂的架构设计任务,不要期望大模型一次性给出完整的解决方案。可以将问题分解为多个小问题,逐步引导大模型进行思考。例如,先让大模型设计系统的整体架构,然后再让它设计各个模块的具体实现。

  • 错误示范:
    “设计一个图书馆系统” → 模型生成泛化代码

  • 正确做法:
    分步提示
    (1) “如何实现预约超时自动取消?” → 得到Appointment类框架
    (2) “信用分如何关联预约行为?” → 补充Students.updateCredit()

2、prompt设计

借用一些JML的思想,让大模型设计单独的方法,自己设计整体架构,效果会更好,如:

设计方法:boolean ordered(String studentId, LibraryBookIsbn isbn)
前置条件:学生信用分≥100 且 无重复预约
后置条件:更新热门书队列(hbs.addOrderMessage())

模型据此生成高匹配度代码,避免过度设计。

3、整体流程

需求分解:将复杂的图书馆管理系统分解为多个子需求,如借书、还书、预约、取书、阅读、整理等,并针对每个子需求进行详细描述。

模块化设计:引导大模型为每个子需求设计独立的模块(类),并明确模块的职责和接口。

类关系设计:明确类之间的关联关系(如Library聚合多个子模块),并让大模型生成类图草稿。

关键算法逻辑:对于复杂的业务流程(如开馆整理arrange方法),逐步描述流程步骤,让大模型生成伪代码,再转化为具体实现。

迭代优化:根据测试反馈和设计原则,对大模型生成的代码进行优化调整。例如,我们发现初始的预约管理逻辑需要处理过期预约,于是引导大模型在Appointment类中增加了removeOutDateBook方法。

四、架构设计思维的演进

1、第一单元:聚焦于多项式化简,这是我接触面向对象编程思想的起点。最初,对 Java 语法和面向对象思维的陌生,让我不自觉地依赖面向过程的方式解决问题。但随着学习的深入,通过递归下降法实现语法解析,我逐渐领悟到层次化设计的精妙之处。从项 — 因子 — 表达式,单项式 — 多项式的结构设计,结合递归调用,能够巧妙处理复杂的表达式,这种思想不仅适用于编译前端语法解析,更为后续解决同类型问题提供了思路。同时,我也认识到将功能不同的类单独提出,能够增强代码的可拓展性,为新功能的添加奠定良好基础。​

2、第二单元:多线程学习堪称 “噩梦” 与成长并存。作为四个单元中最难的部分,其内核的复杂性让人望而生畏。在保证线程安全的前提下提升并发效率,需要对多线程机制有深刻理解。采用生产者消费者模型设计电梯作业时,尽管对多线程部分有一定掌握,但类间过高的耦合度成为后续迭代和调试的巨大阻碍,这让我深刻记住了高内聚低耦合原则的重要性。不过,也正是在不断的摸索和请教中,我构建起自己的逻辑,学会了多线程之间的协调调度,形成了 “一个调度器类,多个被调度的执行类” 的基本架构,这一架构在后续学习中持续发挥作用。​

3、第三单元:围绕 JML 展开,相对而言,其思维难度较低,只需依据 JML 架构进行代码编写。但部分方法对时间复杂度的高要求,使得算法成为主要难点。并查集算法路径压缩与按秩合并的实现,让我在算法学习上更进一步。同时,我也掌握了如何依据 JML 规格要求编写代码,这种 “按图索骥” 的方式,培养了我精准解读需求并转化为代码的能力。​

4、第四单元:以 UML 图绘制和正向建模为核心,标志着我在编程思维上的重大转变。我真正实现了先设计再编码,通过 UML 图清晰呈现架构设计。在这一过程中,虽然初期为类的构建和容器的选择绞尽脑汁,且容器在后续作业中多次更改,但稳定的架构为功能实现提供了保障。测试方面回归功能验证,简洁高效地确保代码正确性。

5、测试思维演进:首先根据作业提供的样例进行基础测试,再直接提交,根据公开的样例检查代码,在公开样例基础上,自己构造一些更极端的样例进行测试。

五、课程收获

OO重修第二次终于通过了,原先觉得复杂的大规模代码任务能够自己完成了。最大的收获是能够顺利毕业。

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

302

社区成员

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

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