2021 OO第三单元总结

一 总结分析自己实现规格要求所采取的设计策略

第一次作业

       本次作业需要完成四个异常类以及Person类和Network类,由于异常类需要对相应id出现异常的个数进行计数,所以增加了一个ID类来保存id和id出现异常的次数,其次就需要完成Person类和Network类,Network类相对Person复杂,所以我选择从简单入手,在完成Person类的时候熟悉JML,方便后续Network类的书写,Person类十分简单,就不再赘述了,Network类的重点在于isCircle的书写,我采用的是dfs,为了实现dfs,我还在Person类中增加了getAcquaintance函数,以及queryBlockSum的书写,我没有多加思考,直接按照规格,在双重循环里面使用isCircle函数,尽管第一次作业没有因此出现bug,但是第二次就出现了问题。

第二次作业

       第二次作业增加了四个异常类,Message类和Group类,以及Network中函数有一定量的增加,这次作业添加的不算太多,在第一次的基础上很快就能完成(可惜第一次的基础问题很大,导致第二次很多点都超时了)。

第三次作业

       第三次作业又增加了一些异常类,同时多了不同的message,以及Network需要增加一些函数,这一次作业的重点是sendIndirectMessage,求出两点间最短距离,我采用了dijkstra算法实现。

基于JML规格来设计测试的方法和策略

  1. 使用Junit进行单元测试,JUnit是一个Java语言的单元测试框架,用于编写和运行可重复的测试。部署好环境后,自行编写测试代码后进行自动测试。
  2. 根据规格描述,了解整个程序的作用以及类与类之间的协作关系,然后针对性的生成一定量的测试数据进行对拍。

总结分析容器选择和使用的经验

  由于最开始并没有考虑性能问题,加之自己之前没有使用过HashMap,所以选用的ArrayList,由于第一次没有遇到性能问题,所以在第二次作业中也就没有改变,同时第二次超时的bug也并不是使用ArrayList造成的,因此第三次仍然沿用了第二次作业。

  尽管如此,在整个作业来看,ArrayList可以说是一个最差的选择,作业中大量用到查询,而HashMap能够非常完美地契合这一要求,因此使用HashMap无疑是一个非常好的选择。

性能问题分析

  在本单元中,会出现性能问题的有两方面,一是涉及到图的算法方面如qbs,sim等,二是需要通过遍历计算获得值如getAgeVar,getValueSum等,我在写的时候,几乎是完全按照规格去写的,当时还没有考虑到性能问题,比如在qbs,我就按照规格在双重循环中反复调用isCircle函数,这个复杂度是极其巨大的,一条qbs就能让程序ctle,现在想来当时的做法太蠢了,而完成qbs其实只需要遍历一遍图就可以了,其次就是如getValueSum,我就是只要调用函数就完成一次计算,但是这样也会造成性能问题,而最佳的办法就是在加减人,加关系的时候直接加上或减去值,然后保存起来,调用的时候输出就行。

作业架构设计

       在本单元作业中,我自己的作业没有架构可言,几乎全是按照规格写的,在图模型构建与维护方面我也做得很少,而且做得也不太好,因为在这三次作业中,我几乎都是照着规格去写,没有考虑性能方面的问题,所以也没有什么策略,在此想谈谈对这单元作业的反思,这一单元是我在三个单元中完成得最轻松的一个单元了,但是得分却是最低的,原因在上面也说了,在完成每一次作业的时候,我都是直接按照规格去写,没有认真理解规格到底是要完成什么任务,然后根据自己的理解去实现,比如说上述所说qbs和getValueSum,我只是根据规格,去完成了规格要我做的,而没有考虑如何完成能节约更多的时间,这是我这一个单元最大的问题,其次就是我没有做好课下测试,我前两次都是交上去通过了,然后大致看看感觉自己没什么问题了,就没管了,只有第三次生成了一些数据和同学进行了对拍,所以这三次的作业完成得都非常差。这次要吸取教训,下一个单元认真去完成,多加思考而不只是为了完成作业,然后课下要做好测试。

posted @ 2021-05-31 20:41  成泰吉  阅读(80)  评论(0)    收藏  举报