OO第四单元总结

一、本单元作业架构设计

1.第一次作业

这次作业中,我选择在实现主类的基础上,增加了Class和Interface类,将相关的信息存在相应类中,进行一个封装。在数据存储方面,我采用了HashMap将元素id和Class对象建立一一映射,类继承关系和接口继承关系分别采用两个HashMap将继承两端的id与id进行联系,同时,还需要用一个HashMap存取name对应的id的信息(还能用于查是否有重复name)。这次作业比较复杂的地方在查找类实现的接口,这里我采用了dfs算法进行实现。

2.第二次作业

这次作业是在第一次作业的基础上进行拓展,多加了状态图和顺序图,方法实现起来相比第一次简单。我新构建了StateMachine和Interaction分别用于存放状态图和顺序图。在规格检查中,我采用了dfs算法进行深度遍历。

由于我第一次作业的主类代码行接近500行,所以在第二次作业中,我选择新加了一个类调用第一次作业的类完成前面的功能,然后再实现新加的方法。因此,第二次作业UML类图就完全覆盖了第一次作业,如下图:

二、四个单元架构设计及OO方法理解

第一单元

这个单元的内容是表达式求导,其中最重要的一点我认为是正则表达式的合理使用。我第一次作业中就直接在一个类中莽,还没有摆脱面向过程的思维。然后互测环节和研讨课中听了一些大佬的架构思路, 在第二次作业对自己的程序架构进行了改进,并且沿用到了第三次作业。

主要是设计思路就是通过对表达式进行局部格式判断,将一个大的表达式先拆成各个项,在项类中再拆分成各个因子,对于不同的因子进行求导,最后用求导规则将其结合起来。在这个单元中,我学到了OO的层次化设计方法,这样显得自己的程序很有条理。

第二单元

这个单元的内容是电梯调度系统,这次的核心则是多线程的使用。我三次作业的整体架构思路是输入-->调度器-->电梯三线程实现。其中,第一次作业采用了单例模式进行交互,直到第二次作业才发现第一次的多线程跟单线程差别不大。在第二次作业中,由于CPU运行时间有限,需要添加wait和notify防止暴力轮询导致CPU时间异常之大。然而,在实现过程中,我们需要在线程交互中防止出现死锁,并且采用合理的调度策略进行优化。第三次作业在第二次的基础上多了一个换乘的功能,这里涉及到一个拆分指令的问题,实现起来也不困难,需要注意及时唤醒乘客避免电梯异常关闭。

在这个单元中,我感受到通过OO设计思想实现的程序有着很好的可拓展性,每个类就相当于零件,哪里出现问题修改相应的零件就行。

第三单元

这个单元的内容是地铁建图,主要学习JML方面的知识。相比前两个单元,只要根据需求完成方法。但是这个单元卡时间卡的比较死,如果采用时间复杂度较高的方法很有可能导致测试TLE。所以在这个单元中,有不少同学吐槽这个太数据结构,其实也在完成作业的同时,学到了OO思想中封装的用处,从而使得整个系统的耦合度较低。

第四单元

最后这个单元就主要学习UML类图、状态图、顺序图等结构,感觉和第三单元的实现思路差别不大。

三、四个单元测试理解与实践演进

第一单元

这个单元也是我互测参与时间最多的环节,前两次作业我都认真阅读了其他人的代码,可能是因为组内的大佬比较多,也是学到了一些代码设计和方法使用。第三次作业采用了讨论区中随机生成表达式的工具,但是效果不是很好,需要大量的数据进行测试。

第二单元

这个单元由于少了合法性检测,就需要制造一些边界条件/特例来查找bug。主要就是看电梯有没有可能上到非法楼层(数组越界)、调度器调度的时候是否漏人、CPU时间是否会超时。所以,在这个单元中我用了一些极端的数据保证自己的程序不出现问题。

第三单元

这个单元就采用JML单元测试对自己的程序测试,同时还借助了大佬的随机数据生成器与同学进行对拍debug。

第四单元

最后这个单元我其实测试的时间不多,主要就是针对几个复杂的方法,自己构造几个视图进行测试,但是这种方法也导致我功能测试不够全面(其中有两个bug是对题目的理解不够导致功能实现有问题)。

四、课程收获

谈到OO这门课程的最大收获,那当然是面向对象思维,这种思维在很多场景下都非常适用,在这种思维下写出来的程序可维护性和扩展性强。当然,在这种思维的影响下,软件架构能力也有所提升。以前看到一个程序题会立刻动手开始写,边写边想;现在会先用笔把程序的架构搭好,想好每个类需要干什么,需要涉及什么方法,这样也有助于debug。除此之外,还学会了一些工具的使用,例如jprofiler、StarUML等。最后,编程能力和debug能力也明显感觉有所提升,当程序架构好之后,再去实现方法其实就非常简单了。

五、课程建议

从大体上来说,这门课程的设计是非常有趣的,总共有理论课、实验课、作业这几个环节,其中作业的考察方式在国内也是比较新颖的,分为公测、强测、互测几个阶段,那么针对这门课程我想提几点我的感受:

1.关于强测的bug修复问题,我经历过一次作业大崩得了50多分的情况,结果发现完全是一个bug甚至一行代码导致的。然而,bug修复阶段并不把强测数据当成同质修复,就使得这次作业结果非常难受了。

2.关于作业方面,第一次作业互测还是测得热火朝天的,但惭愧地说我本人在后几个单元互测环节表现并不积极。其中一个原因在于同时段还有os实验任务需要完成,而另一方面如果通过研读代码的方式进行互测可能对一个人的代码都要读1个多小时。当然,如果手写一个评测机/随机数据生成器的话,确实能提高效率。所以,有的时候会跟小伙伴讨论这门课程学的到底是面向对象思维还是学习写评测机(或许可以寒假布置同学们学习这方面的知识,否则在学期中确实感觉有点顾此失彼)。

3.关于实验课方面,我觉得应该与理论课错开来,前几次实验课上机都是早上理论课刚刚讲完的内容拿到实验课来考,让人多少有些措手不及。也许可以在排课的时候错开一天,或者研讨课和实验课互换。

posted on 2019-06-24 12:47  lufei1  阅读(109)  评论(0)    收藏  举报

导航