301
社区成员
发帖
与我相关
我的任务
分享本单元的三次作业均要求实现一个小型图书馆的运作模拟,并在逐次迭代中为图书馆增加新的功能和规定,使得图书馆的运行更加稳定有序。然而与前几个单元不同的是,在本单元中,我们需要先自行设计代码的,利用uml类图等表达自己的设计思路,并最终完成代码的实现。在本单元中,我采取的策略是首先仔细阅读要求,并且在草稿纸上进行初步的设计,然后利用类图等进行建模。拿类图来说,在设计阶段我通常不会将类图画得很详细,只是初步勾勒出大致的代码架构。比如:有多少类,每个类的供用是什么,类与类之间的关系是什么。在实现阶段,才根据可能出现的新的问题修改设计细节,并完成类图。

最终的代码架构基本是遵循类图的设计的。由于本单元先进行相对完整的设计再实现代码,所以在设计时会尽量将方法名和属性名设计得令人一眼能看出其功用。这样的话,在后续进行实现时就不会出现看到类图也想不起来当时是如何设计的了。先进行设计带来了更好的大局观。如果先实现代码的话,很可能刚看到一个需求就实现了相应的功能,写好了相应的方法等,但是或许后续的需求不能和现在的实现兼容,就需要更改很多代码。但如果先进行设计,往往会先仔细阅读所有需求,这样才能搭建起一个合理的框架。哪怕后面发现某一需求与现在的设计不兼容,修改的也只是设计。所以,在本单元中,我的代码与模型是实现和蓝图的关系。
第一单元实现表达式的括号拆解,一方面需要理解递归下降的算法,另一方面要自行将解析好的表达式拆掉括号。在这一单元中,主要是理解递归下降算法和理解JAVA中类与对象的概念。在这一单元中,使用“因子”类和“表达式类”可以化繁为简,使得各种各样的因子可以统一进行相加、相乘的操作。
第二单元实现的是电梯运行的模拟。这一单元主要训练的是多线程的基本概念、基本实现。随着电梯的构造越来越复杂,不同线程间难以维持信息的单向流动,需要进行信息的交流。这就导致程序中可能会出现死锁的情况。同一版程序提交两次结果不同也是不足为奇的。这一单元实现了从单线程到多线程的演变,使得架构设计思维变得立体。
第三单元学习了JML,这是一种代码规格,主要的作用是规范代码,规避自然语言二义性带来的误会。在这一单元的学习中,不需要自己构建代码架构,而是需要通过代码规格理解代码架构,并进行细节实现。同时,这一单元要求一定的时间复杂度,尽量不能出现二重、三重循环等。我认为这主要是希望我们不严格按照规格的写法来实现,而是自己
理解规格的含义。这一单元从代码的自行设计变为理解规格,从新的视角来看待代码架构。
第四单元学习了UML。主要的学习内容是正向建模。在这一单元中,要先搭建好代码的架构,再去进行代码的实现。这一单元让我对类与类之间的关系、类与类消息的传递更加了解,感觉对自己的代码“更加了解了”。同时,先进行设计、再实现代码,开始还不太适应,后来就发觉了这样做的很多好处,在上文有所提及。这一单元训练了我们的正向建模和设计。
在第一单元中,测试的思路主要是尽量覆盖到不同的情况,尤其是特殊的和边界情况。比如多层括号、是否乘以-1等。并且各种各样的因子和不同的排列组合都需要测试。
第二单元是多线程,我主要会测试不同的情况下程序是否都能正常结束,然后测试特定的功能是否正确实现。比如:不能超过最高楼层、乘客人数不能超过限制等。比起第一单元,本单元的测试更多元和复杂。
第三单元JML,由于架构已经被给出,主要测试的是各个方法是否被正确实现。最严谨的方式就是为每一个方法编写test测试,严格按照规格写test。另一方面,要检查程序有没有多重循环,能够动态修改的地方有没有实现动态修改,保证时间复杂度达到要求。
第四单元UML,主要测试的是图书馆要求的各项规则有没有被正确地实现,尤其要测试一些临界情况。比如结束期限当天还书等等。
在第一单元的学习中,我复习了JAVA程序设计的基本规范,了解到了递归下降算法,并且成功写出了一个能拆解括号的程序。这一单元主要锻炼了我的理解能力和思维能力。
在第二单元中,我首次写出了多线程程序,对多线程的运作有了更深的了解,也对多线程debug的困难和debug的基本方法有了一定的了解。
第三单元中,我首次接触了代码规格这一概念,了解到了代码规格的作用,能够阅读并理解代码规格。
第四单元中,我实现了利用uml正向建模,减少了可能出现的程序中的重构和bug,感受到了设计的重要性。
经过了一学期OO的学习,其间经历了很多次迷茫和少次的慌乱。在做作业的过程中,我对JAVA语言和各种设计架构思路和方法更加了解,也逐渐产生了兴趣。非常感谢OO课程组的助教们和老师们。