BUAA OO 第四单元总结&课程总结
- 关键词:心得体会、完结撒花、UML
前言
- 第四单元的最后一次作业和这个博客都延伸进了烤漆,所以写的会简短一些(dbq
- 第四单元难度其实挺大的,主要是十分的繁琐,需要考虑的,揪字眼的地方很多,有一些第一单元面向格式的感觉了。
- 总的来说,还是真的真的非常感谢课程组带来了这样一门好课,收获应该很大,应该是第一门直接提升代码能力的课?push的很厉害,周末全给废掉了,周五的晚上也没享受过,课程组真狠。
- 也直接看到了自己和大佬的差距,算是认清了自己吧。
about 第四单元
- 这一单元说是叫UML,实际上和图形化关系不大,图形层次只能帮助同学们更好的理清各种数据间的关系。任务总的来说是要把代码化的UML,通过官方包读进来,自己设计数据结构来存储,并设计相关查询函数,完成题目涉及的各种查询功能。
架构
-
由于是迭代开发,只把最后一次作业的总体架构放上来了:
架构图:
-
总的来说这次作业主要是训练我们如何自己设计架构。(不过由于学长学姐博客的存在可能架构方面不会有太过新奇的)。不过UML本身就是一个架构极其清晰,本身就是一堆对象的东西,我们其实只要按照UML本身的架构去做一个个类来实现层次划分就可以了。
-
三类图:类图、顺序图、状态图。每一个类型有其自己的处理类,负责:数据的分配封装,查询函数的汇总,还有表层数据的管理。
细节
- 这里要对三次作业需要注意的地方简单地说明一下:
- HW13:单元的第一次作业,各种细节都需要注意,难度很大,很考验设计功力。
- HW14:要把三类图都设计出来,顺序图很好处理,状态图要DFS,很麻烦。
- HW15:完成8个规则检查,本质上也是疯狂DFS搜索,要注意很多判断是否为空的地方。但是由于BFS十分占行数,可能过不了CheckStyle,所以新建了一个checker来装查询函数主体。
BUG
- 这单元强测出了几个BUG
- 第二单元错了两个点,是因为有的地方没有判断是否为空就直接引用了,产生了NullPointerException,所以我在第三次作业每个地方都考虑了是否为空的判断,果然避免了这一类bug的出现
- 第三单元错了一个TLE的强测点,知道会错,课下跑评测机的时候就出现了这个bug,但是一直苦恼于怎么去修,没有想出来解决的办法。
单元收获
-
对于UML各个元素的层次关系以及联系有了深入的理解。
-
训练了BFS,递归写的越来越熟练了,
噼里啪啦的 -
写了对拍器。自从第一单元后评测机一直没写过,嫖的同学的。这一次虽说临近考期,但想着还是要有这方面的体验,所以自己动手写一个,本身难度不大,数据的生成更为重要。也给同学使了,帮他们查了一些bug,算是把欠的人情还清了,有点小满足 >A<
四个单元总体总结
回忆一下
- 第一单元是震撼最大的。要完成的是字符串的解析,格式检查,然后求导。之前一直不明白什么是所谓的架构,毕竟都是写的单文件的程序,几个函数就可以解决一道题目,所谓架构无非是函数分多一点,还能怎样架构呢?至于对象?不好意思,没概念。于是就在U1T2,居然真的在压力驱动下自己领悟到了对象的感觉,这种感觉是很自然的,由于要递归下降,就必须要对象分类,于是就产生了对象及其底下的特有函数。这次作业真的很棒。U1T3的格式检查就不是很好了,很麻烦,没有认识到其目的性,可能是我拙劣了。
- 第二单元是难度最大的。要完成多线程电梯。这单元在我看来最主要的目的是进一步强化对象的概念。通过U1同学们已经了解了对象的基本含义,那么在U2就要进一步强化对象的特征,分工,包括继承的特性。于是就出现了自己能跑的电梯,调度别人的调度器,以及各种各样的电梯。这一单元早有耳闻难度会巨大,于是做好了通宵的打算,不过大概这就是置之死地而后生?U2每一次的作业都完成的还算顺利,bug也很少,体验也不错。
- 第三单元是最奇妙的。要根据JML写代码。早早听说这单元难度不会那么大,于是也就没太着急,静下心来把JML通读了一遍之后才慢慢写的。U3对于架构层面的要求基本上没有,更多的是强调规格的写法,规格的意义,规格的不足。课程组希望我们通过这一单元掌握解耦的思想,面向对象不仅仅是面向任务中的、指导书中对象,自己所写的程序更是有着层级关系,要分开来设计,测试。
- 第四单元是最复杂的。要完全自己设计UML架构。不像U1U2主线十分清晰、U3没有主线,U4的主线十分的复杂,如果说之前的难度是深度,这一次的便是广度。需要考虑各个元素的层级分类关系,需要考虑存储的数据结构方式,需要考虑可能发生的异常情况,一切都要自己设计,或者面向讨论区设计。在期末遭受了U4T1的震撼,中测第一次卡点过不去,感觉更是使我明白了原来现实中的工程就是这样复杂的。不是简简单单的一个求导或者电梯,更不会是JML都帮你写好了,而是就像是这样复杂的,多变的,含糊不清的任务,需要你自己一遍遍思索调试。
设计及方法理解
- 架构设计真的感觉面向了对象不少。几个重要节点让我们细细道来:
- 第一单元第一次作业完全搞不清楚什么是对象,字符串的处理嘛,整一个函数就完全搞得定。记得当时我想方设法面向对象,设计出来了几个很像类的类,实际上也就是套了个外壳。第一单元第二次作业是我认为这学期进步幅度最大的,在压力和失眠之下,自己琢磨出了递归下降,然后就顺藤摸瓜地从上到下把类给设计出来了,成就感很大,感觉是课程组设计的相当成功的一次作业。接下来理解加深的就是电梯单元了,第一次意识到类也有自己的生命,自己会动,对于对象的理解又有了心得体会。之后的话,对于架构方面的进步可能就是潜移默化了,没有那种惊喜了,可能是有所提高了吧。
- 设计方法层面应该就是SOLID原则的理解加深了。尤其是第二单元结束进行了课上分享,自己好好琢磨了一下。另一方面呢,研讨课上的学习到的状态模式,工厂模式,以及电梯单元试验的单例模式,都给了我眼前一亮的感觉。可能之后并没有这种直接、集中使用这些设计模式的机会了,但是我觉得这种设计的感觉我能够一直记得。
测试方法理解
- 测试也是OO的一大重点。可能就是老师说的那样:测试的时候视角是站在测试者的角度,完全不同于设计者。
- 测试的进步主要体现在自己写测试机上。一共12次作业,我写了两次测试机,一次在第一单元,数据啥的十分好生成,python还有自己求导的函数,测试机太好写了。hack 的时候直接随机生成怼上去就完事了。另一次就是第四单元写了对拍器,也十分好写,但是数据生成实在是太难了,就没自己完成。在之前我没有自己完成过测试机的书写,对于测试的唯一理解就是按行调试orz,还是提高很大的。
- 另外OO的测试也一直是有两种思路的,一种就是随机轰炸,另一种是定点爆破。在我被黑的这么多次里,有一两次能明显感觉到是有同学把我代码读了一遍然后找到了异常点,直接爆破的,真的很佩服这些同学的毅力。
课程收获
- 我相信这学期的OO课一定是收获很大的。最有收获的感觉是在前两单元,很可能是因为和之前写过的几百行的小代码形成了鲜明对比,给孩子吓坏了。在之后这种震撼和惊喜的感觉就慢慢变淡了,我觉得很可能是因为自己的水平得到了提高,然后适应了这种高压的感觉吧。但是每个周末都没有松下来的时候,都要揪心的感觉仍然是很难受的。
- 另一个感受十分明显的收获是,从之前每周的作业下发开始,我都要急速完成,焦虑不堪,宁可周五通宵也要de完bug,争取不拖到周末,到最后一单元作业的时候,我已经可以很淡然的接受到周六上午才看题,周日下午才写完的淡定了。我觉得这一方面是因为我的心态变好了,对于自己有几斤几两把握的比较清楚了,信心变强了;另一方面可能也是佛系了,(
周末反正也没有npy一起出去玩),反正周末也是学习,就泡图书馆写代码吧。 - 另一方面,感觉代码风格好了点(ctrl+alt+L按得越来越快了),还记得pre的时候完全控制不了一个函数行数符合规范,到现在已经不是一个问题了。(不会是架构变好了吧,不会吧不会吧
改进建议
-
仍然有些需要改进的地方
-
首先拖进烤漆的行为真的很让大家难受,一边复习一边debug研究规格实在很难受
-
其次U4第一次作业难度有点大,不像是养老单元应该有的风范(来骗,来偷袭)
-
第三单元的提升可能少点,感觉一次作业和三次作业在架构方面的提升差别不大
-
最后U4的规则描述方面还可以更详细一些。
-
感谢课程组的付出!OO体验不错的!最后的油腻朗诵很惊艳!希望以后越来越好!