第四单元总结博客
一.总结本单元作业的架构设计
-
在UML单元的第一次作业中,最主要的我觉得就是对于各个UML成分的解析和相关书记结构的建立与维护。第一次主要建立了MyClass,MyInterface存储相关的属性和方法,为了避免有可能存在的子属性先于parentId输入的情况,我在这里使用了先解析上层的class等等,再解析下层的param等,利用程序的顺序执行性,得到所有的UML成员。第二次和第三次作业由于加入了顺序图和状态图,我新增了我自己的相关的UML成员类,使得解析部分函数可以解决这一部分新增的需求。
-
解析函数又是另一个重点,这里需要对所有的成员进行解析,将其对应地加入各自的parentId对应的类中或者新建一个成员类:
private void parseUmlLifeline(UmlLifeline e) {
MyLifeline myLifeline = new MyLifeline(e);
id2Element.put(e.getId(), myLifeline);
MyInteraction myInteraciton = (MyInteraction); id2Element.get(e.getParentId());
myInteraciton.addParticipant(myLifeline);
}
二.总结自己在四个单元中结构设计及OO方法理解的演进
-
第一单元是求导的实现,可以说是整个OO课程的难度峰值,整个是从面向过程到面向对象,对于面向对象到第三次作业的时候对面向对象终于有了一些深入的理解,通过对递归下降等算法的学习也有了一些了解,学会了用对象的观点去看待问题。
-
第二单元是电梯相关作业,这就涉及到多线程的相关设计和理解,在这个过程中,我对于多线程的实现和debug有了深刻的体会,对于一些线程安全的问题有了自己的看法。尽管这一单元与面向对象没太大关系,但是我对于多线程有了非常直观的理解。
-
第三单元JML有点看图写话的意思,虽然直接对着规格嗯写基本没啥问题,但性能问题还是成为了一个令人困扰的问题。抛开性能,对于规格的直观理解也是面向对象的一个重要部分,怎么根据规格实现相关功能也成为了我们需要考虑的重要问题。
-
第四单元个人感觉是第三单元的升级版,都需要我们阅读大量的官方代码,然后实现相关的函数,只不过不同的是,UML并没有直接给出方法的细节,而需要我们根据对象的特点自行实现,这也是UML单元最难的地方,需要我们对这个过程有非常清晰的了解。第四单元面向对象的特征还是挺明显的。
三.总结自己在四个单元中测试理解与实践的演进
-
第一单元主要是使用手搓的数据,一般是一些边界或者特殊数据进行测试,后期也使用了评测机进行自动测试,总体来说还是比较简单的黑箱测试。
-
第二单元由于涉及到线程安全的问题,我们更多的需要静态debug,也就是白箱测试,对于代码中存在的相关逻辑缺陷进行改进。
-
第三单元第四单元很惭愧,基本没有进行什么有效的测试,大多是找一些比较强的数据进行定点爆破,没有使用Junit进行单元测试。
四.总结自己的课程收获
-
首要的收获肯定是代码能力的提升,每周的作业都是一个比较大的工程,而且我在第一二单元进行了大量的重构,这样我每周的代码量都是比较大的,所以对于代码能力的要求也是非常高的,如何统筹大量的代码,如何优化一些既有的设计都给我带来了一些挑战。
-
其次就是对一些新算法的学习能力得到了提升,例如第一单元的递归下降算法和第二单元的SCAN、ALS等,都需要我们在完成作业之前有相应的了解,这也是以后的学习中非常重要的能力。
-
然后就是对于bug的解决能力,出现bug是非常常见的事情,怎么去解决这个bug是非常值得考虑的。课程组提供了一些测试的方法和思路,这些也给我带来了一些帮助。
-
最重要的就是拥有了面向对象的思想,学会了用面向对象的角度看问题,这是一种思想层面上的提升,个人觉得是比技术上的具体提升更有意义的。
五.立足于自己的体会给课程提三个具体改进建议
-
首先是相关作业的难度梯度问题。尤其是第一单元求导作业,第二次作业与第三次作业相比第一次作业的难度跨度太大,身边有部分同学直接两次连跪,这是我个人可以改进的部分。
-
课程组可以提供类似递归下降等算法的资料,我们自己寻找资料的过程是一个盲目且低效的过程,如果课程组能够稍微指点一下的话可能会好一点的。
-
其次就是希望互测的机制更加完善,应该想办法让大家的参与度提升,很明显的,第一单元以后大家参与互测的热情都非常低,这也有一些可以改进的地方,毕竟互测是一个发现别人程序问题的好机会,也是对我们自己debug能力的提升。