272
社区成员




hw13的架构设计是本单元正向建模最重要的环节,通过阅读题目要求和参考往届博客,从图书馆相关业务场景中提炼出系统抽象,初步设计出 UML 模型,并在后续迭代开发中根据新增需求不断完善和细化。
Book
的Books
类,从原始的Bookshelf
等模块中解耦。Books
类对内使用多级HashMap提高效率,对外提供了增删查等方法的接口,增强了代码的复用性和职责清晰性。其他类的设计也是类似的思路,比如ReservationInfo
类,就是将和预约相关的状态和方法封装成一个类,再由User
类和AppointmentOffice
类同时持有引用。关于本单元的架构设计,顺序图能够清晰地展示各模块之间的交互流程,展示如下:
第一单元
从OOpre到解析表达式,我们开始更关注功能分解和模块职责划分,尤其是递归下降的思想要求我们将表达式分解成项、因子等对象,展示出面向对象的设计思维。
第二单元
我们通过多线程电梯这样的场景设计开发,开始注重模块间交互、多线程并发以及整体协同,设计中引入生产者-消费者模型,并在代码实现中学习掌握锁、线程同步等并发编程技巧。
第三单元
通过JML,我们开始思考如何在代码开发前就完成规格化设计,这对于大规模写作和工程开发很有帮助。虽然JML仍然是一种精确到代码的规格化,但它促使我们在项目开发初期就考虑系统的整体架构和设计,而不是直接依照JML来编写每个方法的实现。
第四单元
在UML建模中,我们强调了架构设计对于工程开发的重要性,要求我们自由实现模块职责分离和系统整体协同。本单元的图评测还要求我们能够清晰地展示系统的结构和类之间的交互流程,确保设计与实现的一致性。
从单元测试到集成测试
OOpre中编写的Junit测试主要聚焦于 代码覆盖率 单个功能或方法的正确性;而在OO正课的第一单元,我们需要实现表达式化简这一比较复杂的功能,因而转向了数据生成器+借助sympy库/对拍实现的简易评测机,此时的测试仍然是随机生成数据,全靠长时间和高复杂度的测试数据来验证代码的正确性。
并发测试与压力测试
在第二单元的电梯调度中,项目复杂性进一步上升,而且bug触发成功率也存在随机性,我开始尝试多线程并发的测试(那几周真是苦了我的电脑),并使用压力测试来验证系统在高负载下的稳定性和性能。通过模拟大量电梯请求,观察电梯的响应和处理能力。
自动化Junit测试与JML规格化
在第三单元中,我们开始使用JML进行规格化设计,并通过Junit测试来验证代码是否符合规格约束。我采用了手动构造极端数据(比如空图、完全图等)+自动化生成随机数据的方式来应对中测的Junit评测,我也在此过程中感受到了JML规格化对于测试的指导作用,只需要完全按照前置条件、后置条件、副作用限定来检测代码的正确性,就能较好完成单元测试的要求。
数据池维护与动态生成数据
经过第三单元纯随机数据无效的经历,我最终在checker中依据输入手动维护数据池,我在第四单元中也遵循了这一方法。并且我尝试根据题目要求动态生成测试数据,确保生成的数据多样性和覆盖率。
OO课程让我真正开始尝试搭建评测机,也让我认识到测试思维对于验证程序功能与反馈指导系统优化的重要性。
OO课程用OOpre的Java与面向对象思维的先导以及OO正课的一学期理论课和16次作业带领我们完成了面向对象设计与构造的入门引导,但这甚至不是结束的开始,而是开始的结束,让我们继续面向对象!