OO第四单元作业总结及学期总结

OO第四单元作业总结及学期总结

第四单元的作业完结了,这也标志着本学期充实的OO课程结束了,现将第四单元和本学期的OO课程感受进行总结。

第四单元作业架构设计

本单元主要学习的是UML图的绘制以及mdj文件的理解和解析。实验课上主要学习的是了解UML类图、顺序图和状态图的绘制,以及根据UML图解读java代码的实现过程。本单元作业主要实现的是mdj文件解析器,根据输入指令输出关于mdj文件所反映的UML图信息。

第一次作业

第一次作业主要是对类图的解析,最重要的是MyUmlInteraction构造函数的构造,来实现解析mdj文件的功能。本人在设计时设置了一个ElementsAnalysis类用来专门解析,首先通过ArrayList和Map存储各个类别的UmlElement,通过创建Cla、Operation、Inter类来实现类似树的结构,层层存储。

对于第一次作业比较难的方法是getImplementInterfaceList,该方法需要考虑类的继承、类的接口多实现以及接口的多继承现象,因此比较复杂,在实现时需要用到遍历和宽度优先算法,由于本单元作业指令数量较少,因此算法复杂度没有上一单元要求那么严格,也是在一定程度上方便了实现。第一次作业的UML图如下:

由于在编写代码使基本没有考虑算法复杂度的问题,因此不再对各个方法的复杂度进行分析。

本单元作业在强测时挂了一个点,原因是在实现DFS时没有考虑到重复元素入队列时造成的无限循环现象,其实这种情况在具体实现时有考虑到,但本人想当然地以为重复元素在最后进入set时会被忽略,不太影响最后的结果,因此没有做出优化,导致出现了bug。

第二次作业

第二次作业在第一次作业的基础上实现了状态图和顺序图的解析。多了两种图导致增加了许多新的UmlElement类,因此需要对ElementsAnalysis解析器增加新的存储列表和解析内容。在实现状态图的statemachine、state以及transition的层层存储时我仍然采用了第一次作业的构造新类,以实现类似树的存储结构的方法;同样顺序图的Interaction、lifeline和message的存储方式类似。

对于第二次作业没有太难实现的方法,较复杂的是getSubsequentStateCount方法,但仍然采用的是BFS的算法,在实现上没有太大困难。第二次作业的UML图如下:

从上图可以看出本人在算法实现上各个类之间层层存储的思想。

在第二次作业的强测中本人又挂了一个点,原因是没有考虑到顺序图中孤儿元素的存在,在为interaction类添加message时出现了获取的lifeline是null的现象,导致出现了bug。

第三次作业

第三次作业主要是在前两次作业的基础上,对UML图的规范性进行检查。个人认为第三次作业时本单元作业最难得一次,检查的八个方法中基本上都需要考虑到类的继承,类的接口实现、接口的继承等复杂的关系,核心算法仍然是遍历和DFS结合,但容易出现考虑不周全的情况,可以通过自己绘制UML图来体会UML规范以及查看讨论区的方法克服。

第三次作业检查主要是对前两次作业实现的解析器中存储的各个列表进行遍历检查,无需增添新的类来辅助实现。第三次作业的UML图如下:

可以看到整体架构较第二次作业除增添几个方法外无太大差异。

很不幸的是,第三次作业强测不多不少又挂了一个点,原因是在检查继承是否存在环时采用了取巧的遍历顶点找环的方法,但该算法虽然简单,但容易考虑不周,将挂在环上但不是环上的顶点算在环内,因此出现了bug。

综上第四单元作业在难度上不太大,主要是对图论相关算法和一些细节问题上的考察,通过本单元的学习,基本掌握了UML图的绘制方法以及mdj文件的解读方法,这也为以后的软件工程开发奠定了基础。

四个单元作业架构设计和方法理解的演进

第一单元作业实现的是对输入的多项式进行求导并输出求导结果。作为OO课程的第一单元作业,本单元作业主要让我们学习面向对象程序设计的思维和方法,让我们摒弃面向过程程序设计的习惯,逐渐熟悉和适应面向对象程序设计的代码架构、实现方法和测试方法。第一单元作业应该是四个单元里对算法的要求最高的一个单元,三次作业的难度也是呈指数级增长,给刚刚步入面向对象课程的我们当头一棒。关于架构设计和方法,由于刚刚接触面向对象,在本单元作业设计中仍然保留的有面向过程的痕迹,但通过课程学习和自己的慢慢理解,这样的痕迹也是越来越少,面向对象本质上讲主要是针对不同对象的特点对对象进行封装,为对象设计相应的属性和方法来对对象进行操作,与面向过程主要的区别是破除面向过程的一个程序走到尾的思想,对不同性质的对象、不同功能的方法进行封装,通过调用和改变对象和方法来实现程序设计。

第二单元作业实现的是电梯调度系统。本单元主要学习的是多线程程序设计,对于我们来说是一个完全陌生的领域,在第一次作业主要是学习了java对于多线程设计提供的语法和方法,以及实现了简单的多线程电梯调度系统。后两次作业主要是针对电梯系统增加了新的要求和场景,以此来增加多线程调度的难度。总体来说本单元作业难度与第一单元相当,难点在于如何协调多个线程之间的协同工作,防止暴力轮询和死锁的出现。经过第一单元的训练,本单元已经基本适应了面向对象程序设计的思想和方法,针对多线程程序设计,理解程序的工作原理和各线程之间的关系是关键,这样才能在一定程度上有效避免多线程常见的问题——死锁。另一方面就是多进行测试,因为死锁问题的出现在时间和空间上的不确定性,最好的办法是大量构造测试集来发现问题和解决问题。

第三单元作业模拟的是一个社交通信系统。本单元主要学习的是JML规格,根据代码需要实现的功能设计JML规格,以及根据JML规格设计代码。JML规格主要方便的是软件工程设计上多人协同工作,也就是通过一种统一的语言让所有人明白代码的功能,这在工程设计上非常关键。本单元作业难度相对于前两单元明显降低,但弱侧和中测实属摆设,关键的是考察我们测试自己程序的能力。

第四单元作业实现的是对mdj文件的解析。本单元学习的内容在上一模块已经进行了介绍,不再赘述。本单元和第三单元类似,主要学习的是一种方便工程设计的图类语言,根本目的也是让更多的人理解我们的代码架构和整体实现的功能。

四个单元中测试理解与实践的演进

第一单元作业本人对于系统性的全覆盖测试完全没有意识和概念,每次作业都是手动构造测试集进行测试,尽管努力地去考虑全部的边界和易错点,但终究不能够达到全覆盖,容易出现bug,这也让我在第一单元的第二次作业上吃了亏。

吸取第一单元的教训,在第二单元的测试上,我用python程序实现了自动化测试,当然基于python的自动化测试也有缺点,就是由于系统的随机性,很难生成针对边界条件的测试点,但由于第二单元多线程程序本身存在随机性,因此该测试方法比较适合,针对边界条件完全可以手动构造测试集进行测试。

第三四单元我接触到了JUnit,发现JUnit针对程序各个模块的测试非常有效,这也符合三四单元代码的特点。对于测试集的生成仍然需要使用自动化的方法,但JUnit可以帮助我们精确锁定出现错误的模块,而不是仅仅知道程序出现了bug而对debug无从下手。基于JUnit的测试方法是一个方便实用的测试方法,它让我对系统化测试有了更新的理解。

课程收获

经过一个学期的OO课程学习,我受益匪浅。在理论课上我学到了面向对象设计与构造的一系列知识,让我对系统化的工程设计有了清晰的概念。在实验课上,我对理论课上学到的知识进行动手实践,加深了我对知识的理解和掌握。在作业中,我亲身体会到了面向对象程序设计的魅力,包括面向对象的思想和方法、多线程程序设计的思路和测试方法、UML图及JML规格的使用。在研讨课上,我听到了同学们在作业实现中好的方法,让我在自己的作业设计上锦上添花。总体来说这学期的OO学习体验非常好,OO课程组经过多年实践积累下的一套方法和体系,以及课程平台的设计都做到了极大的方便了同学们,让同学们的OO学习更加有动力。总的来说OO课程是我本学期收获最大的一门课,没有之一,在这里我的理论知识和动手能力都得到了很大程度的提高。

对于课程的建议

其实本人对OO课程非常的满意,硬要提出三点建议的话主要有以下方面:

①希望课程组对于前两单元难度较大的作业将提交截止时间后移两到三天,可以通过适当缩短bug修复时间来匀出时间。

②希望在研讨课上老师能够抽出更多的时间进行答疑,研讨课往往由于同学们的分享导致老师没有什么发言的时间。

③可以适当增加弱侧和中测的测试点,适当多开放几个基测的数据供同学们debug。

线上学习OO课程的体会

本学期由于疫情原因我们采用了线上学习的方式,由于OO课程学习的特点,我认为线上学习和线下学习区别不是太大。线上学习最大的体会就是增加课堂讨论和课堂问卷测试的环节,这让我们在课堂上能积极思考并掌握基本的课堂知识,从而达到高效学习。另外线上学习的优点是课程录播课,不懂的地方可以反复回看录播课来理解和掌握,这在线下是做不到的,尽管线下我们可以通过记笔记的方式来记录课堂做些内容,但达不到录播课的直观和方便。总的来说线上学习唯一的缺陷就是没能见到老师和助教和蔼的面孔,和老师助教交流不太方便,其他方面和线下没有太大区别。

猜你喜欢

转载自www.cnblogs.com/qsf920722741/p/13166284.html