总结本单元作业的架构设计
分析时间复杂度后觉得无论怎样都不会超时,但稳妥起见还是选择离线算法,将多个查询的答案提前算好以确保O1查询;不方便离线的查询就边查边算了。
数据存储大多采用HashMap和HashSet,类图上的功能就简单的爆搜了,反正也不会超时——不超时就算胜利。其他的简单查询要求就借助HashMap和HashSet完成,也有一些直接暴力循环了。
除此以外,为了方便将各种元素关联起来,将各种元素重新实现了一次并将官方包里的类套在里面,也便于查询某些结果时直接在对应的元素中查找。
整体上代码写的很乱,有一个类超过了五百行,最后不得不使用丑陋的方式把他们拆开;实现某些功能时一大团代码写在一个函数里,最后checkstyle又得慢慢拆开。或许该好好反思一下为啥会这样。
下图为第三次的图示
总结自己在四个单元中架构设计及OO方法理解的演进
第一单元
第二次作业让我第一次体会到重构oo的痛苦,花了不少时间,重构着重构着感觉自己会写了,过一会又感觉自己是真不会。虽然事实上没写太多东西,但确实是相当折磨。第三次作业没改多少东西就交上去了,体会到了不用重构的快乐。当时就下定决心,后面几个单元不重构就算胜利!至于性能啥的,虽然早早写完但真的是一点兴趣都没,过了中测直接睡大觉了。
第二单元
记住了第一单元重构的教训,第一次作业写的时候想了好久,满脑子都是可扩展性,最后可算是没有重构。第二三次写的挺快,没改太多东西就交上去了。虽然总会有那么点小问题并且性能一般,但对于我这种完全不想花时间的人来说,这个投入回报比已经相当可以接受了。
第三单元
第三单元存在感太低了,以至于想了好久才想起来是jml。整体上没啥难度,类似于阅读理解。当时有一次作业算了复杂度断定超时不了,结果最后还就卡了0.1s。这次之后我就明白了,HashMap、HashSet这种能用就用,跑得快而且又不需要自己去实现。这种用轮子的感觉实在是太快乐了,导致我后面的作业中到处都是HashMap和HashSet身影,或许也算是oo方法理解的提升吧。
第四单元
uml相比于jml就更像是阅读理解了,经常发生看不明白题目只能干瞪眼的情况。架构上让我惭愧不已,仿佛一夜回到解放前,到处都是臃肿的函数以及多次复制粘贴的代码。但换个角度想,至少我会想到去自己实现一些类来把题目中的元素联系起来,也算是oo课没有白上了。
总结自己在四个单元中测试理解与实践的演进
四个单元我几乎都没有主动想着去测试一下之类的,几乎都是写完就溜,很少会在周六周日再看他们一眼。互测也是日常划水,自动评测从一开始就没想写,完全没有去hack的动力。但如果某次想起还有互测,打开一看自己中刀了,可能就会很生气地开始读别人的代码然后构造一个数据点扔过去,经常会有一刀三四个的奇效。但总的来说,除了少量作业会和别人一起测一测之外,其他都是过了中测就没管过了。或许对于我而言,多过一两个数据点完全没有睡大觉有诱惑力。
总结自己的课程收获
四个单元的学习还是给我带来了相当大的收获。学习oo课程之后,我发现自己写代码的时候会不由自主地想起扩展性、程序健壮性等等我之前并不会去特别关注的点。同时,现在写代码的时候也会考虑更多,大多数情况下都会在思路理清晰之后再动手,而不会像写C语言代码那样一顿乱敲。在代码风格上,我现在的代码明显比之前好看了很多,可读性有了很大的提升,写出来的代码至少算是能看了。当然,写代码本身也是一个需要熟练度的事情,oo课程给了我很好的练习机会,一学期下来我能感受到自己写代码的熟练度大大提高。可以说,oo课程在各个方面都给我带来了相当大的收获。
立足于自己的体会给课程提三个具体改进建议
首先是,感觉强测的区分度还不太够,即是存在bug往往也只会有一两个点不能通过,可能会让同学门失去精益求精的兴趣。其次是第三、四单元的作业总感觉有些奇怪,与课程的结合略显生硬,尤其是第四单元,难点集中在与题目理解有关的问题上,似乎有点脱离了oo本应考察的点。最后是关于每年作业题相似的问题,课程组或许应该对作业题进行一些更新?毕竟现在,许多人都凭借着学长们的遗物减少了自己的思考量和工作量,这应该也不是课程组希望看到的吧。