OO第四单元总结&&课程总结
第四单元总结和OO课程总结
一、第四单元总结
题目分析
本次作业是解析UML图,难度主要集中在:1.对UML图的解读(不是用程序读,而是自己读懂)2.架构设计(需要自己构建如MyClass的类)3.算法的正确性和复杂度(本单元作业由于没有互测,没有特别要求复杂度,n的a次方的复杂度是可以接受的)。
第一次作业
先上类图:

本次作业是解析类图,我在初始化的时候先将类图解析(初始化),放入自己建立的数据结构中存储,这样在查询指令的时候可以直接对自己的数据库查询,而不用重新遍历element[]。我建立了三个类来储存数据,MyClass,MyOperation,MyInterface。由于继承、实现、关联等等关系的单位是类和接口,我就创建了自己的类和接口,向里面加入了属性、方法、直接父类、直接子类、关联列表,由于方法有参数,我就建立了自己的方法类,在里面加入参数。
这个架构的好处是我的初始化操作不太复杂,都是按照UML命令一条一条的存放,因此存放的都是直接父子类,而不会在初始化的时候通过dfs或bfs直接查询祖先。坏处就是在查询指令的时候比较复杂,需要多次dfs查询,对于如getInterfaceFathers这样的方法较多的样例时间会长于初始化直接存储所有祖先的架构,但是对于没有这类型指令的样例会大幅减少时间。
第二次作业
先上类图:

本次作业加入了解析顺序图和状态图,我在初始化的时候仍然将图初始化。顺序图比较简单,只需要建立一个MyInteraction类,其中加入lifeline和message。状态图有些复杂,需要首先建立状态机MyStateMachine类加入State,由于起始状态和终止状态的类不一样(感觉完全没有必要这么设计,在类里加入是否为init和是否为final的属性不好吗),需要在状态机中设置起始状态和终止状态;由于状态直接由转换关系,我建立了MyState类,其中加入该对象指向的状态和转化(transition),加上了对于起始和终止状态的转移;由于转化里需要条件,因此建立了MyTransition,其中加入Event,这样层层递进形成了状态图的架构。
新增的6个查询方法没有特别需要注意的点。
第三次作业
本次作业加入了抛异常机制,我并未加入新的类来管理异常,架构也没什么变化,因此遇到了class超过500行的情况,拆了好多方法,强行用static进行存储,显得特别蠢。8个异常中004费了一些时间,主要是类和接口加上多继承综合考虑,有的情况不容易考虑周全,在组内大佬分享的样例的帮助下修了好多的bug。
二、总结自己在四个单元中架构设计及OO方法理解的演进
第一个单元是第一次历练,总体来说比较失败,可能是上学期简单学习了C#加上pre给我的印象太好了,类特别少,不敢重构,直接四个类,每个类都面向过程强行过了一二次作业的强测,但是到了第三次作业问题尽显,不面向对象加上没有学习递归下降导致抛异常的时候需要讨论的地方特别特别多(多得离谱),导致强测挂了几个点。虽然比较失败,但是引起了我对面向对象的兴趣(至少比OS舒服得多)。
第二个单元在线程安全上费了非常大的劲,而且是面向程序debug(瞪眼看,动嘴推理),最终自己给自己说明白了,第三次作业终于写出了不死锁的程序。相对于大佬们在研究调度算法,我显得非常垃圾(最基础的东西到最后才学会),大概可以用血亏来形容(毕竟错过了最有趣也最有挑战性的调度环节)。不过总体来说还是度过了的多线程的控制,在重构方面也多了经验,第二次作业加了调度器,也带来了死锁和挑战。
第三个单元比较平淡,可能因为也不用自己写JML,只需要根据需求代码填空就可以,作业当作休整,顺手学了一下怎么控制复杂度来逃过大佬的hack。这个单元面向对象的思想教的还是很到位的,毕竟读代码的过程中学到了架构设计。
第四个单元不用自己画UML,但是对于架构的设计变得得心应手起来(小窃喜,没重构),可能是之前的训练让我建立类和他们的从属关系变得自然起来,UML也正让我重新审视了一下java程序架构和语法的小细节。
总的来说作业越来越舒服,难度是在降低的,也逐渐从面向对象架构设计到功能实现,也变成了对于一个工程的各种技能培训和理解,感觉四个单元的作业让我有了改变。
三、总结自己在四个单元中测试理解与实践的演进
第一个单元也是第一次知道了可以自己写测试程序,于是用了大佬给的方法(直到现在还在用的subprocess)建立了一个评测机来进行hack,自己生成数据自己测试,hack的过程中也是颇有斩获。问题在于这个单元自己评测机的样例处理基本运用了python官方包的求导程序,这就导致抛异常的第三次作业我没法进行异常的评测,也因此出了bug。
第二个单元没写评测机,主要是因为自己太菜了,没学好多线程(上文已经提过),因此别说评测机了,连自己的程序正确性验证都无法做到,因此在强测中出了很多错误。第二次和第三次作业借了大佬的评测机进行了测试,再次感谢大佬的鼎力相助帮我度过了线程安全的难关。
第三个单元和第四个单元和几位同学组了小组进行对拍,共同写评测机和测试数据。我负责维护评测机,但是感觉这6次作业写评测机并不是难点,难点在于构造测试数据。组内的大佬也非常厉害,构造阴间数据有一手的。自己刚开始的时候写了非常糟烂的评测机,没有考虑TLE的情况,数据的呈现也是在stdout,并没有转化成文本(看着特别丑),后来进行了一些改进,评测机变得人性化了一些,考虑情况也变得多样。总的来说对拍组里的大佬让我学会了很多,从数据构造到评测机的建议,在前端的设计、工程的合作上感觉自己成长了很多,感谢大佬们的帮助。
四、总结自己的课程收获
说实话,OO是我这学期上的最认真的一门课(尽管非常菜),当然也在课上获得了满满的成就感,也见识了一下强者的世界是什么样子的。第一次面向对象,第一次写评测机hack别人,对拍,作业的一步步迭代都提高了我的工程能力,当然也让我接触了许多工具。如果说之前的课是让我在学习的话,这门课我就是在实践,我也是第一次觉得我会干点什么了。当然,OO也给了我一个小惊喜,用C#写前端的时候舒服多了。
五、立足于自己的体会给课程提三个具体改进建议
1.建议开放实验结果,个人认为这样可以对自己进行纠错,更好地写作业和学习。
2.JML和UML的内容还是觉得抽象,好像浮于表面完全不知道具体应用是什么样子的,如果可以的话建议在课件中加入具体使用样例来加深工程实践中的理解。
3.指导书的题目描述着实有些难受(第三第四单元),希望可以更加严谨一些,减少阅读的难度。

浙公网安备 33010602011771号