北航面向对象2022第四单元暨OO课程总结

北航面向对象2022第四单元暨OO课程总结

第四单元主要是通过让同学们实现一个MyImplementation方法来完成UML解析器的功能。目的是让大家理解UML类图、顺序图、状态图的结构和其中逻辑组织的内涵。其中第一次作业完成类图的部分功能解析,第二次作业新增顺序图和状态图的解析,第三次作业解决前两次遗留的UML分析异常状况。

学会封装——组织自己的逻辑架构(第四次作业)

可能是到了第四单元,自己的oo作业快接近尾声了吧,再加上做hw13时,自己正处在返乡的隔离酒店,我整个人的心态很糟糕,只想着怎么快点处理掉这次的任务。于是我做了件很忌讳的事情——直接上手对给出的element[]做解析,没有任何结构上的处理。其结果也很自然,我在巨大的信息量处理上抓耳挠腮、无所适从。最后,我盯着逻辑复杂又没有章法的代码陷入了沉思。

那天晚上我想着这次oo的作业问题,心想反正状况如此,还不如冷静下来分析下到底哪里出了问题,妥善解决,这样还更节约时间。于是,考虑着各种各样的问题,我好好睡上了一觉。第二天清早未醒之时,我的梦里出现了第三单元设计时发生的种种问题;醒来之后,茅塞顿开。既然给我的数据表现不如我所料,那我就自己整理出适合自己处理的类型来。说干就干,我直接把将要做完的代码推翻重构,整理起逻辑和思路,先解析数据,再解析结构,很快就结合对题意的理解,完成了整个设计。

回想那折磨的一天,我觉得真的是领悟了oo想传达给我们的内容。以前学长在博客里写到的,自己通过一学期的oo课程,能更好地进行架构设计,也能理清楚各个类之间的关系,从功能角度进行符合自己想法的设计,而不是从结果上回答问题。

因此接下来第二、三次作业也变得十分轻松了。第二次作业我可以把已经实现的类图模块单独丢出来,再用同样的逻辑实现状态图模块和顺序图模块,这样,MyImplementation类就仅仅作为使用各个解析方法的入口,而看不到任何的细节,很好地符合了面向对象高度封装的特点,并且也解决了代码风格问题。第三次作业,也只需要处理新类型的数据,再构建三个新的方法check类,就可以达到目的。

设计思维演进

第一单元——探进oo的门路

第一单元上手可以说是我整个oo课程的信心来源,那个阶段下完成一个功能如此细化,细节层出不穷的表达式处理模块,真的让我付出了很大的努力。在暑假预习的阶段,我也只是弄清楚java程序的编写,初步理解了类和接口。但第一次作业就直接从架构设计上提了很高的要求,让我有点措手不及。最终我也是勉强实现了有关内容,但基本概括下来,每个类就是一个方法的继承而已,没有任何设计可言。

从第二次作业开始,由于新增的功能仅仅只是分析的形式不一样,并不会让我有太多困惑的地方。于是,我大胆地进行了一部分结构的重构,想办法更能体现出每个类对应属性和功能的特点。很自然地,我设计起新的功能时,因为自己在结构上处理的更好了,因此轻松了许多。第三次作业由于只有多重括号的新增功能,因此也很容易就完成了。

第二单元——探索多线程的设计

第二单元从各个角度来说都是oo课程的核心,一方面要像第一单元一样进行各个类的整合和设计,一方面还有兼顾新上线的线程处理——同步和互斥操作。不仅要考虑表面上的各个类之间存在的问题,还得考虑隐藏的线程之间的可能隐患。电梯我相对好地采用了功能相关的设计,也更好地处理了方法上的集成。新增横向电梯时,由于各自的特性,我没有设置总体的电梯类,直接分别进行设计,显得比较清晰。这样,在第三次作业的换乘中,也显得很自然。

第三单元——探寻JML的规则

第三单元的JML看似是直接给出了各个待做的内容,让我们对应着实现,实则不然。经过O(n^2)的洗礼还有图的有关内容处理,让我再一次深刻意识到了架构的重要性。如果对自己的类整体不理解,实现起来知其然不知其所以然,就很难进行一些结构上的组织。无论是采用并查集处理节点,还是查询最小生成树和最短路径算法,都需要对应的架构加以支撑。

第四单元——探知UML封装的道路

正如我一开始所谈到的,经过了四个单元的洗礼,让我很感动的是,我没有参考到群友和课程组的意见,自发的就设计出一个让我感到很满意的解析系统。我尝试着自己设计parser解析各个数据,封装起我需要的各个关键信息,组织好各个UMLElemnt的关系。在这个基础之上,很多的解析和查询,变得更加轻松,只需要简单的dfs或者是bfs就可以得到准确结果。

测试理解与实践演进

测试很重要啊,真的很重要。在第二单元第三次作业我光速寄掉,因为单元测试没有做足,原地裂开。第三单元三次作业都是在很细节的地方没有做好处理而后悔莫及。我没办法回头再去处理更改已经过去的历史,只能说在悔恨中要保持积极思考的心。测试怎么做,怎么把自己的代码从漏洞百出到滴水不漏,这里面有太多学问。

最开始我的测试做法,就只有愚笨的枚举情形,步步试错,感觉没问题,实则乱套。

第二单元由于数据设置比较简单,我尝试着自己生成随机的数据去测试,在前两次作业中效果很不错,因为反复的压力测试给很多特殊的错误情形都纠正了过来。但是,第三次作业我还是仅采用这种方式,结果单元测试没有处理好,导致自己的随机数据出了漏洞,出现了巨大失误。(这就是所说的覆盖的重要性了,怎么覆盖,怎么判断覆盖全)

第三单元失意,我深刻知道自己的测试方法很没有章法,却又一时半会找不到合理的解决办法,从各个方法本身出发去设计一系列数据做测试,却忽视了JML本身的高度严谨性。结果,所谓的“做足了测试”,不过只是我自己考虑的角度“做足了”。对于JML的各种情形,出乎我考虑之外的情形便直接把我干碎。

最容易马失前蹄的第三单元我直接落马了,一度我在犹犹豫豫之中忽略了许多oo课学到的思维和想法。最后在疫情紧张的形势下返乡,我才在各种各样的情绪下、一梦之中恍然大悟了。从设计要求的角度出发,从设计没有明确说明的角度着手,从一个个细节结合代码排查,从时序逻辑上寻找蛛丝马迹,第四单元我想尽办法,想让自己能稍微微笑着说,我真是被oo折磨透了!

课程收获

oo课收获了什么?

我很感谢zcx助教,在还没有开学,做寒假oo预习时,我遇到了一个git上的常见问题,却囿于环境和基础的限制,一时解决不来。那天我抱着试一试(战战兢兢)的心态去问了问我们的跟班助教,结果对方很热情的回答了问题,还就着各种git上对使用逻辑、开发模式的问题教了我很多,一直到很晚。我抱着很感激的心情,去好好了解了一下git,也认识了项目开发时的git使用准则。事实上,这在os实验课的git使用上给了我很大的帮助。

我很感谢我的oo课老师,说实话,oo课程的理论比起实验,给人的冲击感差了很多。但是老师还是通过各种的实际设计例子,代码编写方式,逻辑组织形式,让我认识到了类原来要这么设计、多线程的问题常出在这里、JML要这么理解、UML的结构来源于此,服务于斯。

我很感谢oo课一起奋斗的同学们,虽然完成作业,我基本都是独来独往,咬牙坚持,不惧他人脸色。但是在讨论区和课程群里,对私下里熟识的同学,我也会帮助和被帮助,相互探索指导书中难以理解的问题。他们给了我帮助,我也很乐意帮助其他的同学。

最后,我很感谢自己。

谢谢你面对(当初看来)上手那么艰难的oo课没有放弃,而是钻到类的设计层面找到解决办法。

谢谢你虽然被电梯的设计吓到,但还是在夜里坐在教室里默默回想老师上课讲的设计逻辑组织临界块和线程设计。

谢谢你即使被hack的满身疮痍还是不忘笑出来告诉自己,这也是一种磨练,未来要好好注意。(然后深刻反思自己的测试效果和测试设计)

谢谢你到了最后能反省过来,这才是oo课想告诉你的东西,咬着牙告诉自己,UML的结构要这样看,要这样组织数据,要这样一步步接近终点。

oo课收获了什么?大概还有很多吧,不只是知识上的,还有心理也是。

一些关于课程的建议

1、关于训练,尤其是第四单元,可以增设一些小任务辅助理解官方包的各个功能,(第四单元)并且理解UML的各个结构。

2、关于讨论区,可以考虑把讨论贴分成两个部分,类似某一次作业的做法,一部分作为大家公共讨论助教答疑,一部分作为比较普遍的、重要的问题公示。

3、关于第三单元JML,可以把比较重要的图论要点在指导书里面给出,帮助大家复习以下数据结构。(当然也不是直接)

posted @ 2022-06-23 21:02  2037hanzhe  阅读(59)  评论(1编辑  收藏  举报