OO第四单元总结
就不放类图了 莫得意思 我用自然语言来描述一下吧 直接讲第三次作业了 这样包括了所有的内容
① 拿到输入之后进行各种初始化和构建工作
将各种UML元素按照type扔进各个ArrayLIst和HashMap。ArrayList用来遍历,HashMap用来查找。
然后我基本上把大部分UML元素都自己实现了对应的类,主要为了两件事:
b.在构建的过程中就可以存储各种信息,方便即时调用,利用了缓存的思想。比如查一个类的方法是不是没有return的值,可以在搭建方法与参数的关系时,就进行判断,真正调用指令时直接读成员属性
② 关于前两次作业的指令
在完成前面的构建工作之后,很多指令都是直接query相关类实例的成员变量即可。
此外对于某些指令,也可以启发式缓存,即针对某个特殊的类查询过一次之后,就在相应的实例里面记录下来,这样下次如果还访问同一个类,就可以不用再计算了
③ 关于第三次作业的指令
首先这些指令只会被调用一次,所以控制复杂度的要求没有那么大。几个比较难的指令都是图相关的,尤其是234号check,注意为了防止TLE,一个类实现的接口一定要记录下来,否则3号指令每次要遍历接口,会很耗时。
④ 关于checkstyle500行限制
虽然这次给了一个general接口,但是如果直接在general里面实现,铁定超500行,除非你自定义的类缓存了特别多的东西,否则每个方法自行计算的部分还是比较多的。所以一种比较好的方法就是general只是一个粘合各个类的类,讲各个图以及standardcheck分散到不同类中,最后在general中调用
⑤关于适配器模式
讨论区有同学提出可以使用适配器模式,这是我没有想到的,确实是一个很好的设计方法,能够最大程度上利用已经提供的类,不过由于时间有限,我没有去实现这一模式,而且我感觉某种意义上自己实现的类反而有一种简洁的感觉,因为已经有的那些类还包含很多IO的方法,这是这单元作业我完成部分所不需要的。
关于bug:
第二次作业TLE了一个点,因为没有注意图搜索的算法复杂度,没有记录已经访问的点,数据结构没有学好,很值得反省。
关于测试:
依然采用自动化测试,但是因为手工数据集有点麻烦,因而又静态读了遍代码确认了时间复杂度问题,其实可能TLE的函数很容易辨别,重点检查各个循环的判断条件已经整体的图算法即可。第三次作业很容易计算出运行时间上界。
四个单元中架构设计及OO方法理解的演进
总的来讲这学期OO,只有第一次作业重构了,后面三次都比较顺利的完成了迭代。
在架构设计上,首先就是思想上要考虑后期的迭代开发,当然这是很不容易的,鬼知道需求是什么。不过依然可以依照高内聚-低耦合的方法,使得每一个类的职能单一化。其次就是方法层面注意及时封装一些工具函数,方面复用。
此外,这个学期学到了很多设计模式,这也是很重要的一部分内容。这些设计模式无关具体的语言,虽然我觉得看起来他就是为了Java设计的。他们是业界各路大佬总结出来给后辈的,能够帮我们少走很多弯路,不过这也启发我去寻找一些有关设计模式的书籍,不仅是语言和算法需要向他人学习,软件设计也需要
然后就是最后两个单元的学习,JML和UML让我开了眼界,认识到写软件确实是一项工程,如何进行前期的设计,毕竟设计才是减少bug,提高软件质量的关键手段。其次完成软件工程必然是一个team work,如何进行工作的分发,确保及时经手了不同的人,团队成员之间依然可以准确的表达思想。还有就是后期软件如何进行测试,其实挺想去实习的hhhh,希望能够看一下工业界是如何生产一个具体的软件的。
四个单元中测试理解与实践的演进
一如既往的感谢hjw大佬带我,这四个单元始终坚持自动化测评+手工数据的测试方法,最终一学期就WA了五个点,而且都是比较细枝末节的错误,弥散在3次作业当中,所以总体软件质量控制的还行。
不过已经可以明确的一点就是,一方面软件没有自动化测试是不行的,人工根本无法保障软件质量,而且效率极低,另一方面自动化测试对于边界数据、特殊数据的测试不够,需要程序员或者测试人员能够自行脑补特殊数据,来达到比较完美的软件质量。
课程收获
1、熟练掌握java语言 各种工具链诸如git的使用
2、写了很多代码 锻炼了coding能力和debug能力
3、知道如何对软件进行自动化测试
4、初步掌握了面向对象设计与多线程设计
5、知道JML、UML等等软件设计的方法
四个具体的改进建议
-
关于实验课 对于某些实验 需要提交一份json格式的txt。这种方法存在一些缺陷,每次都要非常谨慎的检查文件格式正确与否,比较的麻烦,也许cscore的前端可以做的更好一些,直接输入答案,会比较的方便。
-
关于研讨课 也许老师可以给出一些具有价值的主题,来启发同学们进行研讨课的准备,因为感觉有些研讨课的主题没什么太大的意义
-
关于寒假作业 建议继续强化对于java语言的学习、相关工具链的使用
-
实验课希望能有答案!! 不然某种意义上不能充分利用练习的价值
线上学习oo课程的体会
其实emmm没有什么特别的吧,我觉得理论课网课挺好,可快可慢,还可以回放,唯一的缺点就是没法现场讨论了。研讨课的话线上展示也没什么不好的。实验课比现场轻松多了,反正就是网课还挺好,我并不介意下学期继续啊哈哈哈哈哈哈