2025第四单元总结博客 [BUAA-OO]
[BUAA-OO] 2025 第四单元总结博客
总结自己在四个单元中架构设计思维的演进
总结自己在四个单元中测试思维的演进
总结自己的课程收获
一、本单元正向建模与开发实践
hw13的架构设计是本单元正向建模最重要的环节,通过阅读题目要求和参考往届博客,从图书馆相关业务场景中提炼出系统抽象,初步设计出 UML 模型,并在后续迭代开发中根据新增需求不断完善和细化。
- 厘清模块职责:举个例子,图书馆系统中的书籍管理广泛存在于书架、借阅处、预约处、用户、和阅览室,而书籍也包括了序列号和副本号这样的多级索引结构,使用简单的数据结构存储效率并不高。而书籍的管理过程可以抽象成增删查这几种类型,因此可以提取出储存
Book
的Books
类,从原始的Bookshelf
等模块中解耦。Books
类对内使用多级HashMap提高效率,对外提供了增删查等方法的接口,增强了代码的复用性和职责清晰性。其他类的设计也是类似的思路,比如ReservationInfo
类,就是将和预约相关的状态和方法封装成一个类,再由User
类和AppointmentOffice
类同时持有引用。 - UML模型构建:在有了初步的模块划分后,使用UML类图、状态图和顺序图等工具,将系统抽象为可视化的模型(当然我觉得简单画画草图就好,知道一个类大概有哪些属性,管理哪些对象,怎样交互,不用精确到有什么方法),明确各模块之间的关系和交互流程。
- 具体代码实现:将抽象的模型转化为具体代码,在实现过程中,还是要注意模块之间的职责分离和实现的高效性,保持架构设计的清晰度和可维护性。
二、架构设计及UML与代码设计之间的追踪关系
架构设计
关于本单元的架构设计,顺序图能够清晰地展示各模块之间的交互流程,展示如下:
在本单元中,架构设计与代码实现应该致力于实现 “设计先行、实现随进” 的思路。由于图评测的存在,我们的UML图不仅作为设计蓝图,还需要与代码实现保持一致,确保设计理念在代码中得到贯彻。
追踪关系分析
- UML设计:应该在关注代码实现之前首先明确各模块的职责、交互流程;
- 代码实现:基于模块划分,将模型转化为具体代码实现,确保每个模块的功能与UML设计一致;
- 迭代分析:在每次迭代过程中,通过对比已有UML模型与新增需求,考虑现有架构是否能够较好实现需求,如果新增代码会导致模块职责混乱、耦合过高等问题,则选择重构或新增模块。
三、大模型辅助正向建模的体验与引导策略
大模型的三重角色
- 翻译桥梁:将抽象的设计理念转为具体代码框架,在建模阶段启发开发者的设计思路,提供合理的模块划分建议。
- 代码顾问:在面对复杂代码或数据结构的需求时,大模型能够提供优化建议,提升性能和设计清晰度。
- 测试工程师:辅助完成测试代码,构造测试数据和思路,帮助搭建评测机,验证系统的健壮性和正确性。
引导技巧
- 任务描述清晰:可以参考本单元在实验中提到的ROSES方法,设定大模型的角色,再提供任务描述、任务情境、期望结果、具体步骤等提示,来引导大模型们从业务场景中提取出初步架构设计;
- 反馈与迭代:大模型生成的架构大多数情况下并不符合我们的需求,需要不断
调教引导,通过不断完善提示语和明确需求来迭代优化大模型的输出。
四、架构设计思维的演进
-
第一单元
从OOpre到解析表达式,我们开始更关注功能分解和模块职责划分,尤其是递归下降的思想要求我们将表达式分解成项、因子等对象,展示出面向对象的设计思维。 -
第二单元
我们通过多线程电梯这样的场景设计开发,开始注重模块间交互、多线程并发以及整体协同,设计中引入生产者-消费者模型,并在代码实现中学习掌握锁、线程同步等并发编程技巧。 -
第三单元
通过JML,我们开始思考如何在代码开发前就完成规格化设计,这对于大规模写作和工程开发很有帮助。虽然JML仍然是一种精确到代码的规格化,但它促使我们在项目开发初期就考虑系统的整体架构和设计,而不是直接依照JML来编写每个方法的实现。 -
第四单元
在UML建模中,我们强调了架构设计对于工程开发的重要性,要求我们自由实现模块职责分离和系统整体协同。本单元的图评测还要求我们能够清晰地展示系统的结构和类之间的交互流程,确保设计与实现的一致性。
五、测试思维的演进
-
从单元测试到集成测试
OOpre中编写的Junit测试主要聚焦于代码覆盖率单个功能或方法的正确性;而在OO正课的第一单元,我们需要实现表达式化简这一比较复杂的功能,因而转向了数据生成器+借助sympy库/对拍实现的简易评测机,此时的测试仍然是随机生成数据,全靠长时间和高复杂度的测试数据来验证代码的正确性。 -
并发测试与压力测试
在第二单元的电梯调度中,项目复杂性进一步上升,而且bug触发成功率也存在随机性,我开始尝试多线程并发的测试(那几周真是苦了我的电脑),并使用压力测试来验证系统在高负载下的稳定性和性能。通过模拟大量电梯请求,观察电梯的响应和处理能力。 -
自动化Junit测试与JML规格化
在第三单元中,我们开始使用JML进行规格化设计,并通过Junit测试来验证代码是否符合规格约束。我采用了手动构造极端数据(比如空图、完全图等)+自动化生成随机数据的方式来应对中测的Junit评测,我也在此过程中感受到了JML规格化对于测试的指导作用,只需要完全按照前置条件、后置条件、副作用限定来检测代码的正确性,就能较好完成单元测试的要求。 -
数据池维护与动态生成数据
经过第三单元纯随机数据无效的经历,我最终在checker中依据输入手动维护数据池,我在第四单元中也遵循了这一方法。并且我尝试根据题目要求动态生成测试数据,确保生成的数据多样性和覆盖率。
OO课程让我真正开始尝试搭建评测机,也让我认识到测试思维对于验证程序功能与反馈指导系统优化的重要性。
六、课程整体收获与反思
- 大模型辅助开发的应用
我体验到了大模型在架构设计、代码实现和测试构造中的多角色价值,使整个开发流程更为高效和灵活。 - 架构设计与实现的精进
在OO课程的学习中,我学会了如何将设计理念转化为可执行的系统架构,并在迭代中不断优化和完善。 - 测试思维的提升
在中测-强测-互测的环节中,我学会了设计更加全面的测试策略,从随机测试到压力测试,再到注重数据质量和覆盖率测试,逐步提升了测试思维和实践能力。
OO课程用OOpre的Java与面向对象思维的先导以及OO正课的一学期理论课和16次作业带领我们完成了面向对象设计与构造的入门引导,但这甚至不是结束的开始,而是开始的结束,让我们继续面向对象!