OO第四单元总结&&学期总结
1. 第四单元作业总结
本单元三次作业都围绕了UML图的建模展开,第十三次作业只有类图,第十四次作业增加了顺序图和状态图,第十五次增加了部分UML规则的判定检查。
本单元感觉整体难度一般。
1.1 第十三次作业
- 本次作业应该是三次作业里最难写的一次,说实话,一开始拿到
.mdj
文件和官方包的时候,我甚至觉得这有啥好写的,这玩意为啥不在解析json的时候直接做了,这不就是脱了裤子放屁么? - 当我学习完课程和实验,学到了一个叫“适配器”的设计模式,大概猜测教学目的是不是让我们搞一个适配器,于是我给每种UML_ELEMENT都新建了一个适配器类,并继承了同一个抽象类。
- 同时,分析了作业需求,在建图的时候完成了大部分的工作,后续只需要查找即可。
- 为什么说这次作业是三次中最难写的一次呢,主要刚拿到手只有几个没有实现的接口,从上个单元JML的思路惯性的走过来,认为只要实现几个函数就能完成任务,结果发现自己too young,too Simple,Sometimes naive。
- 如果我不把每种对象和对象间的关系分析清楚,仅凭借那几个函数接口,不仅之后的扩展性几乎为0,而且就完成当次作业来说,都会乱成一团难以完成。
- 这次作业没被发现BUG,强测100。
1.2 第十四次作业
- 本次作业加入了顺序图和状态图的分析,其实作业完成方式和上一次完全一致,经过上一次的构架设计,这次只需要沿用上次作业的模式,新建剩下两张图,并完善相关方法即可。
- 所以说这次作业是三次作业里最轻松完成的一次。
- 这次作业我发现单个类代码超过了500行,于是我进行了解耦操作,把建图的操作放入了一个工厂(MapFactory)类中进行建图,最后通过调用方法返回所需信息。
- 这次作业需要查询的新增方法较少,经过对需求的分析,我并没有存储与作业无关的关系,比如作业要求数量就只有一个计数器等。
- 这次作业在考虑一种极端情况是未考虑_parent可能为null,于是强测RUN_TIME_ERROR(null pointer)一个点,增加一行代码修复通过。
1.3 第十五次作业
- 本次作业加入对指定几条UML规则的判定检查,于是我在这次作业添加一个检查(Checker)类
- 根据需求分析,发现前两次建图存储信息不足,于是添加了一些类存储的信息(非常不好,不符合OO原则,别学我)
- 最后根据指定要求增加了检查方法,由于本人手滑,在检查001是打错了一个变量名,导致强测挂了两个点,修改后通过。
1.4 总结
- 本单元相比于前几单元,更注重与构造而不是设计,好的构造能在本单元事半功倍,不好的构造可能难以完成本单元作业任务(@JYC),实际上本单元设计的算法和数据结构编程思想等都是最基础最简单的内容,难点就是利用已给的接口进行适配构造,这在以后的科研和工作,以至于大三的软件工程课程都是一种不和或缺的技能,起了非常好的承前启后的作用,虽然难度不大,但是对我们的考验还是蛮大的。
2. 对四个单元学习的总结
2.0 预习单元
- 在寒假,经过预习单元的学习,我真正的第一次使用了一个面向对象的语言写了第一行的面向对象的代码,理解了类,方法,继承,借口等最基本的概念,学会了使用正则表达式处理字符串,这一单元的设计非常好,能让我快速上手,完成对OO课程的认识,即使对我这种完全没有接触过Java的同学也很友好。
2.1 第一单元
- 在这个单元,我开始第一次学习面向对象的设计,仅仅给了我一个需求“给多项式求导”,我就要从零开始,利用JAVA,写一个能处理字符串,能求导的程序,工作量可想而知。
- 三次作业虽然有一些层次演进,但是我还是在第三次作业的时候进行了彻头彻尾的重构,还使用了大正则表达式的下下策,说实话,第一单元我还是蒙在鼓里的,虽然我还是很有意识的使用面向对象的思想,但是总体来说,我还是要思考整个程序运行的流程,还是在用面向过程的思想进行调试,所以第三次的重构是必然的。
- 关于测试,由于第一单元的东西已经有完全成熟的工具链,我就尝试进行了自动评测,还是发现了一些BUG,但是对于一些极端情况,还是没测出来,所以尽信评测机不如无机。
- 第一单元学完,我觉得我已经走入了OO的大门,经过第三次的重构,我也明白了一些为什么要面向对象。
2.2 第二单元
- 在这个单元,我们直接接触了一个叫“多线程”的东西,由于操作系统课程还没有学到这一单元,所以我对多线程仅仅停留在“并发”这一层面上,觉得线程越多越牛,殊不知其中奥秘在哪。
- 第五次作业我一开始写的很痛苦,因为不理解“锁”是什么机制,花了不少时间搞清楚,然后电梯调度算法爆炸,写了个还不如FIFO的调度算法,于是强侧爆炸,全T。
- 这一单元我整体没有重构,主要就是一个电梯配一个调度器的模式,三次几乎只是添加新需求(除了第二次重写了调度算法),类分的也很具体,每个类各司其职,但是部分方法耦合度还是很高(
- 关于测试,这个单元主要是检查死锁,我在第六次作业的一种极端情况可能会发生死锁,但是我检查死锁还是主要靠逻辑推理,也没有什么好办法。
- 第二段元学完,我仿佛进入了一个新大门,知道了多线程编程的难度,理解了1+1<<<<<<2,甚至1+1<=1,也理解了组队任务的难处。
2.3 第三单元
- 在这个单元,我学习了一个阴间玩意叫JML,它有着不完整的生态链,垃圾的工具链,和老旧的技术文档。
- 这个单元单纯就是读规格写代码,所以说这个单元十分考察算法和数据结构,颇有大一上C语言那味,再加上弱测故意出弱,强测几乎次次翻车(具体参见第三单元总结)
- 完全没什么架构,单纯就是填空。不过为什么官方包的结构思路那么流畅,而我自己写的就很傻逼。
- 我不是说规格不好,也不是说形式化的规格不好,有时候无法用语言表述严谨的规格确实需要使用形式化进行表述,但是非要用算法来卡人这种行为不做评价。
- 关于测试,摸了,简单的说就是没测(由于种种原因),但是我学习用了用JUNIT单元测试,发现这是一个很好的工具,能测试在糊涂状态下的自己写的代码究竟是不是那么烂,也能测测组内成员的代码。
2.4 第四单元
- 不多说了,前面都说了一遍。
- 架构仿照官方包模式,虽然学的不像,但是还是比以前有了进步,说实话,这单元代码量真实不小。
- 也让我看懂了UML图,总之很实用,有做工程那味了,虽然不难,但是还要设计好久,也许这个单元才是真正的OO吧。
- 有一说一,JavaDoc看起来比JML阳间多了,至于为什么,不想多说。
- 关于测试,实际上都是通过手动构造和使用StarUML搞得,至于为什么有BUG,一是因为我傻逼都能打错字,二是这个null真的害人,不容易构造这种样例测试。
3. 总结自己的课程收获
- 这门课是一门好课,不是那种FuckShe的好课,至少这门课能让我静下心写几个小时代码,不像隔壁OS,面对指导书我可能边写边骂,写到Lab6直接来个遂放弃。因为这个OO的大厦是我自己一步一步建成的,毕竟我几个月之前可能还是没法使用Java输出一行字符串的,而且从理论到实践结合的恰到好处,单从理论来说,就学习到了不少设计方法,虽然我可能对有些还没法理解,但是我用我学到的知识就能够完成OO的全部作业,也已经足够了。我觉得OO一定程度上和算法也有些接近,毕竟你不可能掌握所有的算法,你只需要掌握一些能完成你的工作就足矣。如果不用功利的心态来看这门课,我觉得这门课设置的各个环节都能让我学到许多知识,比如弱测————强测————互测————BUG修复,完整的走完这一套流程,我发现我分析需求和代码的能力提升了,也理解了一些软件从业者的艰辛所在。
- 千里之行始于足下,OO学习可能是开始,OO思想可以用在以后的各方面,一次学习,终身受用,建议把OO课程推广到大类核心课程,与数据结构课程同时教授,效果可能会更好。
4. 课程建议
- 注意前后单元难度分配和与OS课进度的匹配性,比如把“多线程”单元放在10周之后进行,第一单元过难等问题,而三四单元没什么考的故意加大算法。
- 后期研讨课实在是过于水,水到我甚至嫌听浪费时间不如打CS:GO,但是都恰分嘛,没得意思,这里我点名表扬焦,最后一周讲的真滴牛。
- 可以考虑单元间的衔接性,比如第二单元出现了多线程,第三单元可以作为一种工具,当做一种方法解决问题,没必要太过于模块化。
- 实验和作业相关度过低。
- (误)真心希望OO课程加入信息大类人才培养方案,毕竟数据结构课太水,和OO课程同时进行更能扎实知识。
5. 线上学习体会
- 我觉得OO这门课线上的效果甚至好于线下,因为线上学习给了我们更多的自己思考的空间,而不像其他课,因为每个人构造的方法不同,杜绝了千篇一律。
- 同时课程群,班级群等群,网站讨论区也给了一些讨论的空间,讨论的问题也更有针对性。
- 线上实验使用个人设备甚至好于线下实验。
结语
- OO结束了,接下来迎来的挑战还有CO编译两开花,还有一大堆一般专业课,不过之前听说的OO不好的传闻我觉得都是子虚乌有,OO也不过如此,这是我进入计算机学院的第一个学期,就能学到含金量这么高的课程,实数荣幸。
- 不过最大的遗憾是没能在学期结束前见一次我的老师和助教们。
(不过跟助教可是打了不少竞技模式,我也白给了不少把) - 本学期最后,我最后一次感谢各位老师助教和大佬对我的指点和支持(@ZTY老师 @GYF助教 @Hangsbug @蓝头像 @胡歌滚 @笑死羊 @林雨桐 @prime21 @t123yh @bear @cjb @wpb @my @yzm @jyc @kongyou.........)没有你们,我的OO之路不可能走到现在。