oo第四单元暨课程总结

第四单元架构设计总结

第一次作业

单独写了MyUmlClass、MyUmlInterface、MyUmlOperation三个类对应UML中相应元素,在UML图中这几个元素包含一些下级元素,如Class包含Operation、Attribute,Operation包含Parameter等,所以就单独设立了新类,将下级元素当作新类的属性存储。所以如果要找一个类的某个方法的参数,就可以找到对应的MyUmlClass,然后根据其属性依次向下级查找即可。另外在MyUmlInteraction的构造方法中对elements进行解析分类,并主要用HashmapArraylist容器存储,方便查询和遍历。

第二次作业

因为这次作业有三种图,就分别在MyUmlClassModelInteraction、MyUmlCollabroationInteraction、MyUmlStateChartInteraction三个类中分别解析类图,顺序图和状态图,并都在MyUmlGeneralInteraction类中实例化,在该类中的方法中直接调用解析对应UML图的类的方法。与第一次作业类似,将有下级元素的元素单独设立一个类,状态图的解析中新增了MyUmlState类和MyUmlStateMachine类,顺序图的解析中新增了MyUmlInteraction类和MyUmlLifeline类,对应 实现与第一次作业类似。

第三次作业

这次作业新增了异常检测,整体架构上并无改变,就是新增了一个MyUmlStandardPreCheck类,并在解析UML图的三个类中新增了一些属性,方便检测UML是否有错误。同样将MyUmlStandardPreCheck类在MyGeneralInteraction类中实例化,进行错误检查。

四个单元架构设计及OO方法理解的演进

第一单元

写第一单元作业的时候对于面向对象的思想还不是很理解,所以很多类及类之间的关系就写的很丑,现在回头去看简直惨不忍睹。所以在写这一单元的时候基本每一次作业都进行了重构,在最后一次作业才勉强算是符合多项式->项->因子的分层设计,架构也勉强符合高内聚低耦合的原则。不过在错误中学习,效率反而更高。所以第一单元过后,每次写作业都能按照面向对象的思想来设计架构编写代码了。

第二单元

这个单元同样涉及到以前从未接触到的新知识——多线程。第一次作业的时候真的是对于多线程思想难以理解,对于如何进行同步及加锁等问题很是困扰,不过大量看多线程相关知识之后勉强写好了第一次作业。第一次作业之后对于多线程有了一定的理解,第二、三次作业就相对简单了,在第一次作业架构上进行少量扩展就行。这单元主要考察的就是对于多线程的理解和调度算法的设计,只要能理解透彻多线程的概念及选好相应的算法还是比较简单的。

第三单元

第三单元的架构官方包已给出,自己仅需根据JML实现对应方法即可,这个单元考察的应该是算法及对JML的理解还有对细节的把握能力。这个单元理论上是最简单的一个单元,但这个单元的第一次作业却是我扣分最多的一次,原因是少写了一个判断条件,有了第一次作用的教训,后两次作业就仔细看每一处细节,并且为了防止TLE就尽量优化算法。这个单元学到了JML,同时也复习了一下算法。

第四单元

第四单元的架构设计还不错,每次作业都只在上一次基础上新增了一些类以及方法。这个单元最困难的是对于UML图的理解并将其与所给代码关联起来,理解了这个写起代码来还是比较简单的。这单元也是最舒服的一个单元了,代码写起来很平滑,每次新增代码量也不多,写完也没出现什么bug。

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

最开始对于测试只停留在肉眼构造数据检查上,但随着作业推进以及讨论区同学们的分享,慢慢也学会了许多测试方法。第一单元的后两次作业就开始自己写评测机自动进行大量测试,效果也很不错,毕竟一个个看代码太累,而且很难发现隐秘bug。

第二单元也学习了定时输入的方法搭建评测机,但遗憾的是生成的数据很少有极端的,互测中没发现几个bug,不过这次也提醒我有了评测机也应该自行多构造一些极端数据,防止评测机难以覆盖到这些极端情况。

第三单元则学会了Junit单元测试,一开始觉得很鸡肋,还是一样要自行构造数据,后来真正上手后才发现用处还是很大,可以针对某一个方法或类进行全方面的测试。第四单元则是自行画一些复杂的UML图来进行测试。

这一路过来学会了很多测试方法,不在停留于以前的手捏数据测试,毕竟这样“手捏”的数据很难保证测试全面,通过了可能还有很多隐秘bug。

课程收获

这学期的OO课程下来,收获还是挺多的,首先学会了面向对象的思想,以及关于java的各种概念知识,还学会了多线程,了解了JML、UML等。同时对于测试方面也有了较深的体会,好的测试时非常重要的,没有经过全面测试的代码表面看上去没什么问题,但其实可能隐含着许多bug,在强测中很容易翻车。

另外很重要的一点就是写的代码变“美”了,现在回头去看以前的代码,是真的“丑”,因为毫无规范,各种方法之间混乱调用,类中的方法胡乱去加,还有“一main到底”、方法臃肿等问题。但经过了一学期OO作业的洗礼,这些问题都改正了回来,而且因为checkstyle,代码不再会有臃肿的地方,看起来简洁易懂,checkstyle对于空行空格等规定也使代码看起来很舒服。

三个具体的改进建议

1、第二单元第一次作业难度可以适当下调一点,而第二次作业可以上调,刚开始对于多线程这一概念很难理解,对于锁这一概念也一窍不通,所以第一次作业花了很多时间来理解概念,而有了第一次作业的基础,后面的作业就有点简单了,只需稍微改一改代码就行。

2、第三单元后面就感觉完全是在考察算法了,跟JML理解关系不大,所以我觉得可以适当减少第三单元作业次数,或者做一些改变增大对JML的考察。

3、另外就是大家都说的实验课吧,我觉得每次实验课后可以公布一下成绩,可以跟平时作业一样分数发布在course上,就算不发布分数,至少也可以发一下答案。不然每次做实验就跟白做一样,完全不知道自己正确与否,也不知道自己哪里还需要改正。

线上学习体会

线上学习OO和线下学习并没有很大区别,理论课采用录播的形式反而更符合自己的学习方式,可以自由安排时间,重点看比较重要的点。平常作业和实验课影响不大,唯一有点影响的是研讨课,不能见到亲爱的老师和助教以及可爱的同学,还是很可惜的。但内容上影响不大,腾讯会议形式同学们也很积极,也可以从研讨课中学到很多干货。

最后感谢助教们和老师们一学期辛勤的付出,为我们可以舒服的学习OO课程做了很大努力,希望OO课程越来越好。

posted @ 2020-06-16 20:48  现美  阅读(151)  评论(1编辑  收藏  举报