301
社区成员
发帖
与我相关
我的任务
分享在正向建模开发中,需要遵循以下几个步骤。
需求分析:明确系统需要实现的功能和用户需求。
系统设计:利用UML进行系统的架构设计,包括类图、顺序图、状态图等。
代码实现:根据设计模型进行代码编写,遵循面向对象的设计原则。
测试与调试:对系统进行单元测试和集成测试,确保各模块功能正确。
我在开发的过程中主要遵循前三个步骤完成了开发,在测试部分可能完成的并不到位,这也导致了我在强测中没有拿到满分。我的开发过程如下:
首先,阅读指导书的要求,了解到需要实现的功能。我们需要实现书架、预约处、借还处、和用户,要实现借书,还书,查询,预约,预约取书,续借和图书漂流等功能。
根据指导书的要求,我给图书馆设计了Library类,在Library类中调用书架(Bookshelf)、预约处(AppointmentOffice)、借还处(BorrowAndReturnOffice)、和用户(Student)四个类,实现了图书在图书馆中各处的转移。又根据指导书中对于借书,还书,查询,预约,预约取书,续借和图书漂流的具体要求,细化了每个类需要的属性,特别关注了他们对应的数据结构。同时,设计了四个类所需的一些比较基本的调用方法。
接着,根据我的类图设计,和指导书要求,编写代码。
类图如下

main(args: String[]),用于初始化 Library 对象,并处理图书馆相关的操作请求。BorrowAndReturnOffice、AppointmentOffice 和 BookDriftCorner。在这一次作业中,加入了续借、图书漂流、借阅期限限制的新需求。我新增了图书漂流类,来处理漂流书。 图书漂流类中的borrowCount,用来计算被完整借阅了几次,如果达到两次,就会在完成第二次借阅后,把图书放入书架,成为正式书籍,不再以漂流书书号出现(所以需要注意在加入书架时,要新建BookID)。
在这次的作业中,加入了用户的信用积分计算。我在Student类中,加入了许多属性来完成本次作业。比如信用积分、B书拥有量、C书拥有的书籍号。关于信用积分的计算,由于只会在白天进行信用积分查询,所以我在每天开门的时候计算过期书籍的扣分。

最终的代码和UML类图是完全一致的,因为我在最后整体对照着都修改了一遍。但是和最初的UML设计还是有一些不同的,最开始设计的时候忽略了每个类用于数据交互的方法,比如add方法之类的。每个方法传递的参数也都有修改,因为设计的时候脑容量不够,不是很清楚需要传哪些参数(eg.一开始完全没写LocalDate)。
刚刚接触Java,其实在这个单元我主要学习和熟悉了Java的用法,没有做太多的架构设计,而且很幸运的是,我第一周的架构就能很好的适应后面几次迭代,所以在这周也没有意识到架构设计的重要性。
电梯单元,我在这个单元的设计出现了比较大的问题,中间进行了一次小重构,也意识到架构设计的重要性,要先想好了整体的架构思路,确保是有一定迭代空间的,再写代码。
在JML单元,我们从已有的架构设计上,把JML转换成代码实现,我发现这样的设计理解起来非常方便,而且很清晰,这也是我第四单元很想尝试正向建模开发的原因。
本单元的重点就是架构设计,我先实现了UML类图的设计,再根据类图设计完成了代码书写,体会了一次正向建模开发。这次实践让我深刻理解了如何通过UML进行系统设计,并将设计转换为代码,实现了从理论到实践的完整过程。
本单元的测试还是比较好写的,我自己写了数据生成器,和小评测机,自己用。
这个单元我的设计出现了比较多的问题,没有过多了精力进行测试,主要依赖公测的数据点,手动书写一些极端数据来实现了测试。
在JML单元,整体的功能实现不需要过多的测试,主要的问题是性能问题,要保证每个方法的复杂度不超过O(N),所以我主要做的是代码的静态检查,比对JML来做检查,同时结合junit来做测试。
本单元的重点侧重需求实现,对性能没有要求,我没有做太多的测试,主要是针对指导书中提到的各种情况,书写了边界条件上的测试样例,手捏数据测试的。
OO课程就这样要结束啦,怎么还有点小不舍。从第一单元没学oop直接硬刚java的艰难,第二单元多线程本地无法稳定复现死锁,第三单元每次交上去信心满满,一看强测没进互测的恐慌,还有友好的第四单元,一个学期投入到OO这一门课上的时间和精力,基本和我其他课程的加起来一样多。但总的来说还是收获了很多,对java的掌握更熟练了,明白了jml这样的文档的重要性,感受到了架构设计的魅力,一个好的架构设计是事倍功半的。整了学期结束了再回过头去看,感觉助教们都好辛苦,重写jml规则,就为了方便我们的阅读,要时刻盯着消息修改指导书的问题。谢谢课程组,老师,助教们的辛苦付出!!OO真的是爵士浩克!!