OO第四单元 UML、封装以及课程总结
完 结 撒 花 !
一、本单元作业架构设计
本单元总体来说并不算难,再加上由于老师助教对于我们烤漆的考虑,减轻了压力,就更舒服了。
我采用的架构设计就是适配器模式,是在实验课上学到的,对已有的类进行封装,然后就可以额外添加一些功能以满足需求,而不是在原来的类上进行补充,那样将会使得原来的类变得臃肿,在需求不再被需要时,删除工作是极为繁琐的。
第十三次作业
以上是架构图,可以看出,实际上就是对类图中每种元素设计一个包装类,在包装类中写出与查询目标相关的代码即可。
没有测试,也出现bug......
第十四次作业
新增了时序图和状态图,感觉是同理的,但由于自行定义的类过多,无法满足checkstyle,于是将构造与判别分离,新建了Builder类。
类实在太多了,以至于我觉得放这么一张我都看不清的图其实没什么意义......
强测中发现了bug,原因在于遗漏了UmlEndPoint类,指导书中、弱测、中测中并没有与其有关的任何内容,其实还是程序缺乏鲁棒性,应当try-catch就不会出现这样的ClassNotFound的报错。
第十五次作业
这次作业新增了检查Uml规则的需求,于是新增了Checker类,其余的没有什么增减。
仍然是看不清什么,类太多了......
最终行数统计,其实大部分都在类型转换、分类以及封装上,实际代码并不多,估计不到700行左右。
强测bug:check004中对于接口重复实现时,忘记判断这些接口是否有着继承关系,只判断了类及其父类所有实现的接口无重复是不够的。
check003,寻找所有父类函数过于麻烦,找到相同的没有及时退出函数而是继续寻找,导致TLE。
四个单元架构设计以及OO方法理解的演进
OO确实让我自我感觉我的代码水平有了一定提高,从面向过程就可以解决掉的简单问题,上升到需要模块化设计,整体架构考虑等一系列必要的动手前的思考的复杂任务。
第一单元学到了工厂模式,在解决大量同级的类时可以省去许多代码量以及免去许多易犯错的点,同时也是首次接触到面向对象的思想,体会到了它的便利性;
第二单元学到了生产者-消费者模型,在电梯、多线程交互中加以运用;
第三单元学会了JML以及Junit,可以自己写出标准的JML语言进行标准化描述以及利用Junit进行单元测试;
第四单元学习了UML图,会绘制UML图,也了解了它的规则,同时也学习了适配器模式,将各种类进行包装以满足不同的需求。
总的来说收获颇丰,虽然成绩不一定理想,中间由于各种各样的原因出现了许多bug,但总之是理解了OO课程中不断提到的层次化和架构这些专业术语的实际应用中的含义,在本学期我做一些小软件的时候,就会时常用到这些思路设计。
四个单元中测试理解与实践的演进
每个单元的测试都是必要的,因为懒惰没有测试的单元错的惨不忍睹。具体时间来说,很多次测试debug都是基于python的自动生成大量数据的黑箱测试,然后进行和别人的输出或者标准输出对拍来进行,而不是像我最开始直接自信提交或者自己手动构造少量数据的笨拙方法,然后就是感谢wzk大佬和zly大佬,弱弱的我全靠大佬carry......(测试还是python好,太香了)
课程收获
课程收获还是挺大的,写代码的质与量都与课程前不可同日而语,无论是工程化、架构、规范性、可读性、鲁棒性等等以前从未考虑过的事情,在OO课中一次又一次提到、加深印象、深入思考,最终体会到这样做的优点与之前随意去做的劣处。此外,Java也是一种很常用的编程语言,git也是很常用的版本控制工具,借OO课顺便学习了这样的语言、工具,相信在以后的代码之路上也会受益匪浅。
所谓置之死地而后生,很多次OO的作业指导在我刚刚见到时都是感慨:这能写?写完之后出现bug就会很着急,回想起来当时一个个不眠之夜,才发觉自己已经走了这么远,见到指导书都已见怪不怪开始在纸上写写画画的做着分析,遇到bug随手加上断点轻车熟路,这大概就是作为程序猿在心理上的成长吧。看见强测爆炸直接点开bug修复
三个具体改进建议
1.第三单元JML令大多数同学痛不欲生,相比其他单元来说,这一单元的根本目的其实是为了让同学们理解契约式编程,但实际上JML的使用很不方便,一方面参考资料很少,足见其实际应用面很窄,另一方面,针对JML的工具链不完善,需要繁琐、复杂的安装、设置,甚至有很多同学最终也没能用上基于JML的Junit测试;还有作业难度确实在加大,但最后竟然变成了算法竞赛......仅仅因为JML单元的算法竞争熬夜啃下来几个高难易bug的算法实在不好受,也偏离了初衷。
2.第三单元建议加大中测强度,中测实在是太弱了,极为明显的、稍微增大数据量就会出现的错误居然没能爆出,导致强测爆炸的事情太心酸了。(哭)
3.不理解中测某些点为何不开放输入数据,导致盲目debug,浪费时间。以及某些次实验课(指改错)可以加一些提示,以免在大量代码中寻找错误白耗时间。
线上学习OO课程的体会
除了见不到帅气的老师和助教以外其实没什么区别...
区别很小,因为OO的作业本来就是要靠同学课下独立完成,关于Java本身和许多面向对象的不理解的知识,由于较为浅显,在网上也有很多讨论的专门的相关内容可以参考,所以知识上获取其实没有差异。(对比隔壁os就不一样,能作为参考的东西很少)同学线上讨论以及讨论帖都讨论得很热烈,大家在水群也常常活跃的交流OO问题。个人对于网课形式深恶痛绝,但OO是唯一没有受到什么影响的一门课程。总之,还是很喜欢OO这样真的学到了东西、有很多感悟的课程,最后!完结撒花!祝OO课程越办越好!