2019OO第四单元作业总结&OO课程整体总结
第四单元作业总结
第四单元的作业主题是UML图的解析,通过对UML图代码的解析,我对UML图的结构以及各种元素之间的关系的理解更加深入了。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第一次作业
第一次作业的主题是UML类图的解析,要求输入一个UML类图的代码,程序能通过代码解析出其大致结构,并提供一些关于类图的基本的查询功能。显然本次作业的重点是类,类的属性、方法、参数等都是存在一个类下面的,因此我自己创建了一个MyUmlClass类,用以记录类及属于该类的信息,还创建了一个MyUmlOperation类,用以记录方法的参数信息。在MyUmlInteraction中,我采用了两个HashMap来记录输入的类:一个id2myclass的HashMap,使用id索引其对应的myclass,这是为了在确定类的属性、方法等时通过其parentid找到属于的类;一个name2myclass的HashMap,使用类名索引该类,这是因为输入的查找信息都是以类名来查找的。
本次作业的类图如下:
第二次作业
第二次作业在第一次作业的UML类图基础上,增加了有关UML顺序图和状态图的查询指令,还增加了基于一些Uml规则的类图合法性检查。与第一次作业类似的,我为状态机和顺序图分别创建了两个HashMap,分别能通过id和name找到对应的状态机和顺序图。
本次作业的类图如下:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OO课程整体总结
一学期的OO课程在不知不觉中已经接近了尾声,接下来我就总结一下我在本学年的OO课程中的收获。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、我在四个单元中架构设计及OO方法理解的演进
第一单元:第一单元的主题是多项式的求导。在第一单元,由于刚接触OO这门课,我对于java这门语言并不那么熟练,对“类”的思想也没有深入的理解。在我的架构中,前两次作业我的类分的还是比较清楚的:将多项式分为了一个个的项,项作为一个单独的类提取出来,这样对多项式求导的问题就变为了对每项求导,使得问题简化了很多。但第三次作业,由于加入了复杂的嵌套,我的类分的就相对混乱了,我实际上是从求导的角度出发,根据根据求导公式的不同,将多项式分为了基本项、嵌套项等几类,这样对于求导来说是简单了一些的,但是由于嵌套的存在,每个类里面还可能包含其他类,这给我在debug的时候带来了一些麻烦。在第一单元,我对OO的理解就是建立一些类,同一类里面的对象有着逻辑上相似的地方,这些类可以有自己的属性、自己的方法。
第二单元:第二单元的主题是模拟电梯调度。第二单元我认为是对我对OO的认识有了很大提高的一个单元。如果说第一单元的求导,不用OO而用面向过程的思想也能做出来的话,那么第二单元仅仅用面向过程是不太可能做出来的了。第二单元涉及到了多线程的知识,多线程就必然涉及到多个类之间的协作。在本单元的作业中,涉及到的主要是电梯和调度器之间的协作。我采用了电梯依照算法,从调度器中取请求的方式,这样将请求的分配分到每个电梯中进行,而调度器只是充当一个容器的作用,此外调度器还负责接收和给电梯发送停止信号,以确保三部电梯能正确地停止。本单元我对OO的理解更加深入了,每个对象的内部可以实现一些方法,这些方法对外部一般不可见,外部只需要传递一个信息给这个类,这个类就能返回正确的值,至于如何实现的,外部类是不关心也无法关心的。此外,我还学到了很多模型和设计模式,例如生产者-消费者的模型、单例模式、工厂模式、观察者模式等等,这些设计模式也是OO的重要组成部分。
第三单元:第三单元的主题是JML语言,作业是地铁线路图的相关处理和查询。在第三单元的架构中,考虑到图结构变更指令远少于查询类指令,我采用了很多冗余的数据记录,这些数据只在变更图结构的时候更新,以确保时间复杂度上不会超时。本单元的内容对我的启发主要是在测试方面的,这些内容会在下面谈到。
第四单元:第四单元的主题是UML语言,有关UML类图、顺序图和状态图的解析。架构方面在上文已经谈过,这里就不多赘述了。本单元结合UML类图,使我对OO在理论上有了更细节方面的认识,也让我简单了解了UML图的基本元素和逻辑,这些知识以后可能用得到。
二、我在四个单元中测试理解与实践的演进
第一单元:第一单元的测试实际上和我们大一写的程序在测试方面是差不多的。都是构造几组测试数据,利用脚本同时输入到测试屋内成员的程序中,然后手动检查输出是否正确。这个方法在前两次作业中用的还比较顺利,但第三次作业,由于可化简的部分很多,化简的方式也很多,导致肉眼难以快速判断结果是否正确,这也是这种方法的局限。
第二单元:第二单元的测试相比第一单元,困难了很多,因为多线程带来的很多不确定性导致以往的直接输入数据、观察输出的方式在组内对拍中并不能很好的达到要求,所以我就采用了对每个人的程序进行单独测试的方式。当然,构造测试数据时是需要注意一些策略的,尤其是第三次作业,在电梯停靠楼层不同的情况下,根据一些特殊楼层组合来构造测试数据,如果对一些算法不够严密的程序,可以很快找出bug。
第三单元:第三单元比较注重的是单元化测试,这也是JML语言的优势所在。在方法的JML语言是正确的的前提下,只需要根据JML语言的前置条件和后置条件,来构造测试数据,即可对每个方法进行有针对性的测试,这样可以帮助我们快速定位bug。但是,在第三次作业的最低票价、最少换乘、最小不满意度的这些算法上,JML语言是仍然无法准确描述的,因而对这些算法的正确性检测也只能依靠构造一些特定的测试数据来解决。
第四单元:第四单元的特殊性在于它的测试数据需要通过StarUML来构造,构造测试数据本身和以往并没有很大区别,但是通过使用StarUML构造测试数据,我对StarUML的使用更加熟练了、对类图、状态图、顺序图的理解也更加深入了。
三、我在本课程中的收获
这学期的OO课程可以说是非常充实了。从开学一直到考试周之前,基本上每一周都有OO代码的作业,而且写完作业以后还有紧接着互测环节和bug修复环节。首先,就像老师说过的那样,编程就是要多练,代码量上去了,编程水平自然就会上去。如此多的练习量让我的编程水平提高了很多,现在学期结束了再重新看我寒假预习OO时写的作业、甚至是第一单元写的作业,都会觉得当时的水平和现在查得很远,这就是一种提高吧。此外,我还了解了很多实用的设计模式,并且不仅仅是在理论层面的了解,更是在实践中应用了这些设计模式,比如电梯调度中的调度器使用单例模式、后面多电梯调度的时候使用观察者模式等等,这些设计模式都是前人们经过不断摸索而形成的,学习这些模式可以让我们在写代码时少走很多弯路。最后,OO的互测机制也让我对代码测试变得熟练了起来。我以前在写代码的时候,写完了自己都不怎么测试就交上去,因为评测机会给出实时的反馈,但在OO课程中,互测的机制鞭策我们在提交前给自己的程序找bug、在互测中给其他人找bug,找bug的过程其实就是不断构造测试数据测试的过程,而且在找到高质量测试数据(可以一刀刀中很多人的数据)的时候,我们的测试水平也得到了提升。总之,这一学期的OO课程对我来说是收获很大的。
四、对课程的改进建议
整体来说我对本学期的OO课程还是很满意的,但是这门课还是有一些可以提升的地方的,以下是我个人的一些建议:
1、关于实验课:实验课所做的内容有时候和课程不那么同步,又有时候太同步了导致同学们上午刚刚学完的知识,下午就要考,希望在实验课的时间安排上的能更合理一些。另外实验课的代码有时候会有问题(主要是JML那部分的代码),这些问题可能会影响同学们的实验,甚至产生误导效果,希望课程组在代码放出来之前再审核一次。
2、还是关于实验课:希望实验课每次的结果如何,能有一个反馈,虽然可能无法给出标准答案,但是可以给出一部分同学比较漂亮的解答,这样能让我们知道自己在哪些地方的理解还有问题。像现在这样一点反馈都没有的实验课我认为效率不是很高。
3、关于作业:希望在每一单元的作业结束之后,都能有一个标程来给我们参考,标程最好能体现从该单元的第一次作业到第三次作业的扩展性,这样更加有助于我们学习如何架构自己的程序、如何在保证程序正确性的前提下使程序有尽可能良好的扩展性。
五、结语
从本学期的OO课程中,我看到了课程组从老师到助教对于课程改革的决心和信心,不管是老师还是助教都为这门课尽心尽力、付出了大量的心血,作为课程的众多参与者之一,我也确实感受到了这门课在往好的方面发展,而不是像知乎上往届的学长学姐们说的那么魔鬼了。在此感谢所有OO课程组的老师和助教们的付出,并且真心的祝愿北航OO课程能变得更好!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
BUAAOO,完结撒花~🎉🎉🎉