OO第四单元总结 & 课程总结
一、本单元两次作业的架构设计
第一次作业
- 架构
在UML类图中,各个元素组成一棵树,但是如果真的按照树来组织数据结构的话,个人觉得有些复杂。而且实际上UmlClass和UmInterface具有很多相似之处,我就索性把二者统称为节点Node,用自己写的类来储存,每个Node类的成员变量为这个UmlClass/UmlInterface的成员变量、操作、父类、实现的接口、关联对端等。
这样实际上就__构成了一个图__。图中节点就是这里的Node,每个节点自身存储着一些信息(如这个UmlClass的成员变量和成员方法)。而节点之间的边有三种,我分别称之为__实现边__、继承边、关联边。这三种边都是有向的,分别是子类指向(直接继承的)父类、类指向(直接实现的)接口、类指向与其关联的类。
在这样的数据结构下,查询、搜索算法都可以使用。我的程序类图如下:
- Bugs
在getImplementInterfaceList()
中采用dfs的方法,递归寻找这个类实现的所有接口和继承的所有类。但是开始时我没有给搜索过的点打上标记,所以遇到循环继承的时候当场爆炸。修改后只需在dfs方法的开头给当前搜索的点打上标记并且不再搜索加了标记的点即可。
yzqk同学的一句话——"为什么你们dfs的时候都不加标记的啊?"或许这就是素养的差距吧......
第二次作业
- 架构
原来的代码几乎不动,新增状态图和顺序图。在我实现的时候,顺序图实际上不是图,只需要存好相应的包含关系诸如每个UmlInteraction下有多少UmlLifiline、多少UmlMessage等。状态图是以UmlState为节点,UmlTransition为单向边的图,只是我在实现时为了方便查询又新建立了一个MyStateMachine保存这个stateMachine下的所有所有节点及关系,显然MyStateMachine之间是没有边相连的。类图如下:
- Bugs
本次作业在强测中未发现bug
二、四个单元中架构设计及OO方法理解的演进
架构设计
- 第一单元:基本还是面向过程,所以在第三次作业的时候痛不欲生。
- 第二单元:好不容易弄明白一个"生产者-消费者模式",前两次作业中意外的表现不错,但是到了第三次作业中对于信息的处理太过混乱,再加上对多线程的理解根本不到位,于是死锁了......
- 第三单元:架构已经基本确定,我们只需要按着框架进行补全,难得的休息一下。
- 第四单元:由于需要自己设计整套的数据结构,又涉及到很多图论相关的东西,整体上其实难度还是可以的,所以采用了如上文所述的架构,三次作业的迭代性超好。
OO方法
- 第一单元:请跟我念三遍——"高内聚低耦合,高内聚低耦合,高内聚低耦合"。同时见识到了工厂模式,并且初步尝试使用Python为自己和别人的代码构建评测机,也初步认识到了性能分的重要性。
- 第二单元:写了这么多年的程序头一次接触到“多线程”的概念,真的是直接重塑思维方式。特别有意思的是就是这段时间OO和OS都讲到了多线程,我也从很多方面加深了理解。在这一单元里,虽然简陋,但我已经有意识的在使用一定的设计模式了,此外还以Jprofiler为辅助进行调试。
不过第三次作业还是把我干蒙了 - 第三单元:闻所未闻的JML,离散数学大复习。虽然我们仅仅是level0的JML规格,但是有了规格的要求,写起代码来是真的清晰,至少不会发生“写到一半忘记自己该干什么了”的情况。这一单元里我学习着使用Junit对自己的代码进行单元测试。
- 第四单元:当时第一单元的时候就让在博客里放上自己程序的类图,到现在终于明白类图是干什么用的了。有了UML,就真的很方便看明白程序的架构,无论是在静态的角度(类图),还是在动态的角度(状态图),还是在类之间协作的角度(顺序图)。
三、测试理解与实践的演进
- 以前写代码:随便做几组小数据,基本就面向评测机编程
- 第一单元:因为Python是在过于强大,直接使用Python库依据正则表达式生成多项式,再由Python库直接计算。
- 第二单元:多线程由于涉及到线程调度,再采用printf大法就不可靠了。这一单元我在测试上我也十分被动,基本只能目力debug或者看Jprofiler有没有监测到哪个线程出了问题,课程组下发的debug-logger我没学会怎么用,在此认错。我曾经想过自己编写一个程序,实现定时投放输入数据并且监测自己的输出是否合法,在第一次作业里也确实做到了,但是在后两次作业实在太复杂,加上自己能力有限于是放弃,心有不甘啊。
- 第三单元:使用Junit单元测试只能初步检测自己程序的某个部分是不是出现了问题,而且自己编的小数据在强测面前简直不值一提,所以我认为仅靠Junit是会有很多问题发现不了的。在自己写代码的时候用了Junit初步检测,对于大量是输入数据,索性与大佬同学对拍。
- 第四单元:这下子连输入数据都难以自动构造了,只好手动画几个复杂的类图交给程序去跑......如果看到这里的同学或者助教大大或者老师有什么批评建议的话烦请给俺说说。
- 总而言之这四个单元下来,自己确实是使用了许多之前没有用过的测试方法。加上课程组安排的中测、强测、互测这些有梯度的测试,深感自己仍需努力。
四、课程收获
- 面向对象的思想,继承、实现、设计模式、协作......我不敢说面向对象和面向过程哪个更高级,但显然面向对象是极大拓展了我的思维方式。
- 代码能力,什么一天500行啊、代码架构设计啊、迭代开发啊、测试驱动啊,现在的我已经经历过了最雏形的雏形。
- 心态。OO课程体系真的相当完善了,绝对不算慢的进度,DDL的驱动,补给站和内卷的压力,我也多少算是能挺住了。我还记得据说往年曾有前辈深夜两点OO自闭哭着给家里打电话,想想都害怕。不过把压力放在平时、摆正心态的话,问题也不是十分的大,当然也绝对不算小。
五、改进建议
- 电梯作业的难度非得一年胜过一年的吗,那岂不是会越来越卷。相信咱们课程组肯定能把控好。
- 关于JML工具,如openJML、JunitNg等的使用,无论是PPT还是指导书似乎都没有给出多少指引,网上一搜资料全是往年的OO博客。博客当然有用,但毕竟对于工具的说明还是比较片面,我还是依靠焦哥的整理才勉强弄好了这些工具,而且我身边大骂这些工具不好用的同学应该不在少数。难道是我们的自学能力全都不行吗?真心建议课程组多少给些关于JML工具使用方法的指引,真的。
- 如果能看到自己实验的结果,就更好了,至少自己能做到心里有数。
六、碎碎念
一学期又恍惚之间消逝而去,真诚感谢老师们、助教们的指导和我的同学们的支持,谢天谢地没进补给站,这学期的线上授课模式竟然意外的适合这门OO课程。
同时深知自己和大佬差距过大,真是力有未逮。总之这“昆仑课程”,我也算是有幸得以亲眼见证,还得继续努力啊。