OO2021-第四单元总结
一、第四单元总结
以第三次作业为例:
1.总体设计:
首先,对每一种UmlElement,都创建对应的类来管理该元素的数据,比如MyInterface类对应接口元素,MyOperation对应方法元素等。
同时,创建了MyObj类作为MyClass、MyInterface、MyOperation的父类,它有返回名字、ID、父类和子类的ID等方法。
下图是一张简化的类图:

最后,在MyUmlGeneralInteraction中,对所有的输入数据进行统一的处理,创建相应的数据类型,分别存储到各个类型元素的容器中。完成数据结构的创建工作后,参照文档要求逐一实现方法即可。
2.数据存储与管理:
(1)各类元素的数据
各个元素类型自身的数据结构除了包含elements包中相应的UML类型外,还根据具体需求加入本类型需要管理的其他数据。
以MyOperation为例:

除了一个UmlOperation类的原型,还需要有一个参数列表及返回参数以供交互时使用。
(2)存放元素的容器
在负责实现交互方法的MyUmlGeneralInteraction类中,构建了各个元素类型的容器,存放该类型的全部元素。
因为本次作业中的交互涉及到很多索引的操作,所以为了提高索引的效率,用于存储某一类型全部元素容器绝大部分都采用了HashMap。
(3)初始化
在MyUmlGenerallInteraction的创建方法中,对所有的输入数据进行统一的处理。
首先获取元素的类型,根据类型将创建对应类型的元素,存放到相应的HashMap中。
因为某些类型之间存在着依赖关系,因此要按顺序分批次进行数据的处理,比如Class和Interface要最先处理,然后再处理Operation等。
3.部分方法设计:
部分方法对性能有一定要求,比如进行循环继承的检查时,采用了深度优先搜索对继承情况进行了检查。

二、课程总结
1.多项式求导
第一次作业中,我主要学会了正则表达式的应用和使用大整数。
在第一次和第二次作业之间,需求出现了明显的质变,训练了我重构代码和使用递归的能力。
而在第三次作业中,因为对JAVA引用机制的不熟悉,出现了很多混乱的BUG,好在最后发现并改正,加深了我对JAVA的理解。
通过这个单元的学习,我对面向对象思想有了较为深入的理解,并掌握了递归、正则表达式等工具的运用。但需要改进的地方也还有很多。由于个人原因,我对代码风格、互测等环节无暇顾及,导致代码风格都是0分。
2.电梯
第一次作业因为一个小的BUG成了无效作业,而这个BUG只需要加一句话就可以修正,但因为自身的拖延,没能在最后关头找到问题所在。
第三次作业的失败因为对线程安全的理解还不够透彻,只知道在用到共享资源的地方都加上锁,不但影响效率,还容易造成死锁问题。
另一方面就是我对多线程程序调试效率的低下,无论如何都无法复现的情况下,也没能及时找助教反映,等到和助教确认问题的大致情况时,已经来不及重构。
本单元的作业中我对代码风格进行了一定的改进,深刻地体会到之前全然不顾代码风格的习惯的弊端,希望以后能继续保持。
3.社交网络
通过对JML的学习,我了解了契约式设计的重要性,通过规格的撰写,能够明确各类及方法需要实现怎样的功能,一方面使得代码实现人员能够根据规格完成代码,另一方面能够提高代码的可维护性,使得维护人员能够迅速理解各个方法的功能。
本单元还涉及到一些图算法,也让我强化了相关内容的学习。
4.测试
测试一直是我的短板,本次OO提升了我的调试能力,尝试了编写程序构造样例、定时投放模拟多线程进行调试等手段。
但仍有很多不足,诸如对多线程的调试、复杂输入的高效调试等。
三、收获
1.学习了设计模式的理解和应用,工厂模式、生产者消费者模式等等,对设计程序有很大的帮助。
2.通过较多的编码任务,让我更熟练地掌握了JAVA的使用,更深入的理解JAVA的机制,提高了我编码的速度和完成度。
3.培养了对设计的认知,写代码时不再草草开始,而是经过更详细的设计之后再进行编码,这对完成更复杂的任务是至关重要的。
四、建议
1.工作量与时间安排
建议优化时间安排。工作量如此之大,而且主要工作量在于编码的课程,一周不应该只有4天时间完成代码。编码时间能否延长至6天或者一周?至于测试环节,完全可以在最后一天或者下一周开始。
2.部分作业间的跨度问题
学习曲线总体还算合理,但部分地方比如第一次作业到第二次作业间,不仅增加了求导函数的类型,还同时加入了括号的要求,个人认为是跨度是比较大的。
3.课程的重心与课程的名称不相符
如果普通的课是内卷,那OO就是代码、实验、博客、研讨课、讨论区、互测多赛道内卷。
OO是一门野心很大的三学分的课,也确实能让同学们收获很多。但对面向对象特性的考察,很多时候还没有代码风格、麻烦但意义不大的要求(如第一单元的大整数)、图算法、多线程、字符串处理、测试等等这些内容多。当然我不是希望增加这部分内容,因为这门课已经过于庞大了。但个人建议课程组收缩一下野心,关注OO就可以了,而不是试图通过一门课把学生训练成全能。

浙公网安备 33010602011771号