301
社区成员
发帖
与我相关
我的任务
分享正向开发其实就是在开始写代码前,先构思好需求并设计好框架,预先想清楚程序的主要类和方法,使结构更清晰。
本单元的正向建模主要体现在先仔细阅读指导书,明确题目要求,构思好程序的大体架构后画出UML类图、顺序图、状态图。
1.读题:首先我们需要认真阅读指导书,总结出题目里头新增了什么功能和要求,构思好需要添加什么类和方法,提前设想一些容易出现的bug并在写程序时特别关注。
2.画类图:绘制类图时我们会规划程序的主要类和方法,如BookCase类、Student类等等,使每个类的功能更加集中,还可以通过设置继承、关联等关系来说明类之间的关系,使程序结构的构思更加清晰,帮助我们在后续快速建类写方法。
3.画状态图:状态图描述了对象通过各个类的各个方法来完成状态的转换的过程,在这次作业中体现在Book可以分为在书架、在借还处、在预约处等状态,需要我们设计各种方法来完成书的传递。
4.画顺序图:顺序图可以表示程序的行为顺序,展示了类与类之间的交互。
5.编写代码及debug:在画完图之后,我们就可以开始按设计编写代码,写代码时难免会发现之前的设计有地方有错误或者过于复杂,我们可以及时调整。在出现bug之后也可以通过检查UML图来判断是否是架构设计上出现了问题。
好处:正向开发可以让我们的架构设计更加清晰,提前构思好程序的大体结构,明确各个类的功能和类之间的关系,设计好对象状态转移所用到的函数,用顺序图检查程序可按流程实现功能,减少在写代码过程中的bug,使代码更加的简洁精炼。

在hw13中,我们需要写一个有借书、还书、预约书等基础功能的图书管理系统,我按图书可能在的地点建了类并给它们设置了addBook()和removeBook()等方法。图书的调度实现放在了Library类中,通过case2student()、case2borrow()等类来完成图书的转移。

hw14新增了图书漂流角,学生可捐献图书给漂流角,漂流角的图书在借阅俩次后会升级为正式图书,另外此次作业还增加了各类图书的借阅期限和续借功能。为实现这些新增功能,我新建了漂流角类Draft,在Student类中增加了记录借阅日期的Hashmap和判断是否逾期的函数,通过Library类中的draft2borrow()等方法来完成漂流角与其他位置的图书流动。对于漂流角图书转正功能,我选择在Draft类中建一个Hashmap来存放书的借阅次数,在每天图书馆CLOSE时移动借还处书时判断是否需要转正。

hw15添加的功能很少,就是添加了信用分系统和对预约的限制,类图对比hw13变化不大。其中难点主要在于如何在每日闭馆之后及时扣除手里有逾期未还的书籍的学生的信用分,对此我选择在Student类中设置tags来标记哪本书已扣过信用分来防止同一本书多次扣分,并在每次OPEN时遍历Student查找是否有逾期书籍。
第一单元
第一单元时我对面向对象这个概念比较陌生,在写程序之前并未对架构有比较仔细的构思,只是简单想了一下就开始写了,写出来的程序更像是“面向过程”而不是面向对象,这也导致我在写代码时bug层出不穷,浪费了许多时间,最后呈现的代码架构也十分混乱,将过多的方法放入了main函数中导致main的复杂度过高。对继承等关系的理解不到位也导致我的各个类之间的相似度非常高,有很多复制粘贴的代码,结构过于复杂。
通过第一单元的三次训练,我对面向对象思想有了初步的理解,明白了写程序之前需要先构思合理的架构,开始关注类的耦合和复杂度等指标,努力实现程序的模块化,从一开始的小白完全懵圈慢慢适应了oo的学习节奏和主要的流程和方法。
第二单元
第二单元的主题是电梯的多线程实现,目的是让我们对多线程、线程安全、生产者-消费者模型有一个初步的认识。有了第一单元的经验,我第二单元的架构构思比较完善,类的复杂度比较平均且功能比较集中。这种做法大大减少了我在编程中出现的bug,但我并没有仔细考虑性能,这也导致我在这单元的性能分较低。
第二单元后,我在架构设计时会在确保架构正确性的同时认真考虑可扩展性和性能,思考该使用什么算法什么数据类型才能更好更快的完成各种需求。
第三单元
第三单元是我强测出错最多的一个单元,要求根据JML完成代码的编写,我出错的主要原因是我一开始仅仅是用最简单的循环完成了JML要求实现的功能,导致了TLE。通过这个单元,我不光学会了阅读JML,还明白了JML知识最基础的功能要求,并没有对代码的具体实现做限制,要在完成要求的同时尽可能减少时间复杂度,根据输入数据量判断一下应该将复杂度控制在多少,并选择合适算法,如动态维护等等。
第四单元
第四单元主要锻炼了我们正向建模的思想,通过画UML类图、顺序图、状态图,我们的程序架构构思会更加的清晰,与第一单元的随写随想相比,我在第四单元时的架构设计思维有了较大的进步。
第一单元
在第一单元中,我主要通过自己手动构造一些样例来检测程序的正确性,但我在第二次作业时构造的数据并没有考虑到一些特殊情况,这也导致我没有查出程序中的一个小bug,在强测时出了错。在测试时,可以将题目的功能分为几个模块,一个模块一个模块的测试,多多留意一些特殊极端数据。
第二单元
第二单元的多线程使测试调试的难度增加,我采取了在程序重要节点添加一些额外输出来检查程序的正确性的方法,并构造了电梯系统在极端情况下的各种数据。
第三单元
第三单元我们学习了用Junit来测试方法的正确性,构造Junit时需要严格按照JML的ensures和requires语句来写判断条件,并用数据生成器生成数据,为了保证覆盖性还可以自己手动加一些极端数据点。但我当时并没有进行压力测试,因而在强测时t掉了。
第四单元
在第四单元中,图书馆的要求比较细节,有很多小地方需要留意,我在检查大体架构没有问题后用评测机测试了程序,同时对于每一个新增功能都手搓了一些特殊情况的数据来检查,总算没有在强测中出现bug。
oo可以说是目前为止我印象最深的一门课了,从一开始没学过oopre极其痛苦的熬过了第一单元,到后面逐渐适应后完成作业的速度越来越快,我在此过程中学习到了很多知识,比如java语法、面向对象思想、多线程编程、UML图绘制等等。在做作业的时候会遇到很多问题很多bug,也有一些大大小小的重构,这锻炼了我编程的耐心、抗压能力,积累了宝贵的经验,在完成每个作业的时候还是蛮有成就感的,快乐和痛苦并存。虽然oo增加了我的课业负担,但同时我能感觉到自己的编程思路和测试经验有了很大的提升,互测和研讨课时和同学们互相hack和互动也带来了很多欢乐。
最后,感谢老师和助教们为我们不断的改进指导书、改进题目、答疑解惑,oo完结撒花!