BUAA_OO_第四单元总结 && 学期总结

OO第四单元总结&&学期总结

第四单元的任务是实现一个UML解析器,难度相比前两个单元来讲小了很多,架构设计也较为简单。在学习这一单元之前,我仅仅是将UML作为一种画图的工具,却没有深刻的理解它的本质,UML也是一种语言,是一种统一建模的语言,这一单元的三次作业,就是要求我们准确理解类图、状态图、顺序图三者之间的关系以及他们中的一些元素,从而在理解的基础上进行建模。

第四单元架构设计

这个单元的整体思路就是建立自己的每一个元素的类,第一次作业只涉及了类图,第二次作业增加了顺序图和状态图,然后根据需要的属性以及指令的特性来安排这些类的具体的属性与方法,首先是我三次作业的一个UML图。

这次作业总体上没有什么大问题,难点在于理解指导书,可以说我这次作业前期出现的bug都是对指导书的理解不够透彻造成的,每个具体函数的实现,基本上是它怎么说的就怎么写就没有问题。除此之外,对于多个重名对象的问题,我建立了HashSet用来储存所有出现过的名字和所有带有重复的名字,在给定一个名字时候,判断在不在这两个HashSet里就可以。关于查找,在几个涉及查找的方法里,我借鉴的思路是第三单元的思路,建立Father关系进行查找。

最后,这次作业我遇到最大的问题应该就是代码风格了,因为文件行数太长,所以几乎每次都要被扣掉一半的代码风格分。其实这个问题也是可以解决的,比如将所有涉及类图、顺序图、状态图的结构方法分别单独建类,同时将查询指令的具体实现从MyImplementation类移到对应的类里,就可以减少每个文件中的代码行数(不过由于忙着复习所以也没有动手改Orz)。

OO课程总结

架构思维演进

好的架构设计可以减轻很大的工作量,这是荣文戈老师在第一节oo课时就强调的。如今经过四个单元oo的历练,动辄几千行的代码,使我对这句话有了更深刻的理解。

第一单元,表达式去括号,由于开学前几天忙着准备考试,所以没有做pre,于是开学第一周便陷入了Java一点也不会,一边学语法,一边做pre,一边还要赶在周六晚上之前把第一次作业交上去的窘境(感觉第一周是这学期最难熬的一周了)。因为时间不够,所以第一次作业的架构也没有好好设计,而且依旧是面向过程的一套写法,导致第三次作业的时候根本没法迭代,于是重构,从头写了一遍。

第二单元,电梯,吸取了第一次作业的教训,所以这次作业花了好长时间研究架构才开始动笔写。多线程的概念比较难理解,我花了不短的时间去接受它,第五次作业是模仿上机实验的代码来写的,觉得学长给的代码架构挺好的,所以我在第六次第七次作业的时候都是在第五次作业的架构之上完成的。不过我比较死脑筋,因为第五次作业的时候用的ALS算法,所以虽然研讨课上跟同学交流知道look算法更优,但是还是坚持写自己的ALS,但是ALS算法本身是有很大的缺陷的,它的性能也和输入内容有很大的关系,所以我一直在试图做出改进消灭这种影响,最后真的改进出了一版性能更优的“ALS”。(后来有助教告诉我这个改进版的“ALS”其实是“SSTF”)

第三单元,JML,经过第二单元的折磨,第三单元的难度明显小的很多,在这一单元架构设计的重要性没有前两单元那么突出了,因为每个方法是相对割裂的,基本是题目怎么说,我就怎么写。不过这一单元采用并查集,建树的一系列操作应该也算是一个比较小型的架构设计吧,并查集和树搭建好了对于部分查找的方法来说也是很方便的,并且性能的优良跟查找的设计有很大的关系。

第四单元,UML,这一单元的难度也不大,架构也比较简单,我认为这一单元的架构设计主要指的是要把类图、顺序图、状态图的方法区分开,这样可能再添加新方法的时候也比较容易实现,不容易乱套。

测试的理解与实践

大一的时候我养成的习惯是写完代码就交,依靠评测机debug(虽然当时老师一直强调不要这样做)。大二之后经过三门coooos的洗礼,我渐渐也养成了自己做测试的习惯。

第一单元时,我采取的措施主要是自己按照所有情况分类讨论,对每种情况分别测试,同时也构造边界数据测试,但是由于时间紧张加上不熟练,所以自己测试的效果也比较差,强测出错的点有一半,互测花了一上午一个人 也没hack到,总体来说手动构造测试数据的效率真的很低。后来看到讨论区的分享,在hw3的时候我尝试用了python的sypmy库进行测试,经过前两单元的磨练加上自己的测试,安全度过了强测和互测。

电梯单元的测试挺迷惑的,因为本地和评测机的运行环境不一样,所以我hw6和hw7都出现了本地跑没有问题,但是评测机报错的bug,电梯会莫名其妙的超载,会下到-1楼,但是本地都没能成功复现,所以bug一直没有改出来。在这一单元的测试里,我主要靠评测机的随机测试,加上自己手动构造部分数据。比如轮询与线程安全的问题,通过手动测试有针对性的构造数据,比较容易发现bug,除此以外,针对超时问题,可以针对自己的调度算法刻意构造刁钻的数据,使电梯持续的绕远路,看看电梯的解决策略与运行情况并做出相应改进。

第三单元的测试我使用了助教给出的JML规格构造数据,需要设计一下边界数据并且注意异常行为的处理,同时由于第三单元性能卡的比较紧,也需要注意时间问题,我在hw9和hw10的时候都出现了tle的bug,后来在bug修复的过程中在测试时引入了时间参数。并且还要增加数据强度,确保覆盖到更多的代码,尤其在一单元,如果图过于稀疏的话,数据强度就会不够,测试效果就会很差。

第四单元我没有做太多的测试(以为第四单元写不出bugOrz),我觉得还是重在理解题意,第四单元的三次强测结果都不错。

课程收获

“速成”Java

在上oo之前我从来没有接触过java,所以第一周就要交一个作业上去的时候我其实挺崩溃的,从语法开始学,一点点理解面向对象思想,然后要在ddl之前交上一个代码量不小的程序,虽然很挣扎,但是还是赶在周六中午把作业交上去了,上oo之前真的没想到自己有这么大潜力。虽然事后说起来很有成就感,但是真的不想再经历一次。以后一定好好预习!

耐心

oo作业的代码量很大,几乎每次hw拉出来,都是能当一个大作业的工程量,而且架构不合适的话,重构也是经常发生事情,花了好长时间写出来的代码,几秒就给删除了,推倒重来真的很需要耐心和勇气。算一算被删掉的和 最后真正交上的,这学期也算是写了上万行代码了。

自学(?)能力

oo每周只有一节理论课,要讲一次作业的内容,我每次听完课的感觉都像是老师讲了个目录,然后课下按照老师讲的目录一点点找对应的知识点然后学习使用,虽然这样获取知识没有课上直接听老师讲来的快,但是在自己检索的过程中也能发现很多神奇的东西(学到一些奇奇怪怪的知识),除此之外,讨论区,班级水群,课程群也都给了我很大的帮助,感慨6系的学习氛围真的很棒。

面向对象思维

在oo课中,我对于项目的合理构建与布局有了初步探索,编码更加注重层次性、规范性,也更注重代码架构的设计和代码风格的修改。电梯教会了我多线程的思想,使我在os课的学习中轻松了很多,JML和UML这两个单元让我意识到了规格化设计的重要性。

课程建议

关于时间安排

能否把开学第一周空出来,或者给第一次作业多一些时间。虽然我赶在ddl前交上了第一次作业,但是由于时间不够,所以第一次作业做的很仓促,并没有好好思考,也没有充分的时间做测试,感觉除了短时间肝几百行代码以外,并没有从第一次作业中学到什么实质有用的东西。

关于指导书

指导书能否写的更详细一点呢,毕竟除了上课指导书也是我们很重要的学习方式,可以在指导书上给出一些关于作业思路的提示或者算法嘛。比如第二单元电梯,明明更多人采用的是look算法,而且look算法的性能相比ALS会 更 优,但是指导书上还是给的ALS,辛辛苦苦写出来结果发现算法性能不行,挺受打击的。

关于评测

希望课程组关于怎么写评测机给出一个比较官方全面的指导,看到好多同学在用但是一学期了还是没学太明白。这学期的互测我参与度也不是很高,一方面是因为前几次互测花了好久的时间还没hack到人有点受打击,另外一个更重要的原因就是没有互测数据,我自己能构造出的数据真的很有限,但是又不会写评测机……

写在最后

一学期结束了,很感谢助教gg们耐心的解答和帮助,也很感谢一起debug的同学们,oo告一段落,接下来还会有编译、计网……但无论如何,这段时光都是难忘且充实的~

posted @ 2022-06-29 12:40  Misivoay  阅读(11)  评论(0编辑  收藏  举报