面向对象第三单元总结

面向对象第三单元总结

本单元主要训练JML语言和利用JUnit进行单元测试,重点在于理解透彻JML所描述的类和方法的规格,实现后利用JUnit对重点方法进行测试。Java建模语言(Java Modeling LanguageJML)是一种进行详细设计的符号语言,利用它可以形式化地描述类和方法地规格(或行为),从而能够将开发中的设计、实现、验证三种工作有效地分离。

针对提供了JML描述地方法,可以先利用JUnit单元测试编写测试程序,实现测试驱动开发。

一、 JMLUnit部署

多次尝试后部署失败,会报诸如“找不到符号”的错误,或是输入命令后未出现预期现象(编译出需要的文件)等。

 

 

 

 

二、程序分析

1、第九次作业分析

问题分析:

第一次作业的两个类中的容器均可以用HashMap实现,这是由于Person的id唯一性。大部分方法可以按照规格直接写出,但要保证对规格的理解完全正确。

本单元

要点

  • 对规格的正确理解

  • isCircle方法利用DFS实现

总结:

第一次作业整体难度不算高,但我把isLinked方法中id1==id2的情况没有看清,导致强测成绩较差。

2、第十次作业分析

问题分析:

本次作业增加MyGroup类,相应地增加了queryGroupRelationSum和queryGroupValueSum方法,这两个方法是本次作业的难点,最朴素的想法需要的时间复杂度O(n^2)这极有可能超时,但若换一种思路,Group里增加relation的来源有两个,一个是id1和id2已经在Group里,使用addRelation是这两个点相连,或者Group里增加Person的时候这个点和Group里已有的点相连,把握住这两个个入口,用两个变量记录value和relation,每当调用MyNetwork的addRelation方法和MyGroup的addPerson方法对这两个变量修改,需要的时候不用遍历,直接返回这两个值即可。

要点

  • agrs和agvs的时间控制

  • 计算平均值和方差的时候若不按规格描述的顺序可能会导致精度问题

bug分析:

本次作业的bug依然来源于对JML规格的理解错误,在计算方差和平均值的两个规格中对看错了‘(‘和')'的位置导致实现错误,而此种错误无法通过JUnit查出。

总结:

熟悉了JML语言后本次作业的大部分方法可以很轻松地写出,但个别方法对时间复杂度的要求增高。

3、第十一次作业分析

问题分析:

本次作业的难点有三:对queryMinPath和queryStrongLinked的时间控制,以及对queryBlockSum规格的正确理解。queryBlockSum规格不仔细读很可能认为是对所有的MyNetwork中所有的relation求和,但实际上是求图中连通块的个数,用DFS或BFS遍历一次即可;queryMinPath用没有经过优化的Dijkstra会CTLE,需要经过堆优化;queryStrongLinked本质上是求割点的问题,若不判断割点,最粗暴的方法是依次去掉所有其他的点,看所求两点是否仍然连通,但这样时间复杂度会上天,进一步的方法是利用Tarjan算法,先DFS一次找到所有割点,然后依次去除看两点是否连通,并且特判两个点直接连接的情况;考虑到Tarjan的DFS途中已经可以找出极大连通子块的所有点,用一个堆栈进行保存,出栈的时候若所求点均在栈中就返回True,此方法的时间复杂度为​$O(2(E+V))$

要点:

  • qmp和qsl时间复杂度控制

  • qbs的理解

总结:

本单元三次作业结束了,虽然难度较之前两单元有所降低,但是分数却不够理想,究其原因一个是因为难度下来了之后对作业没有之前两个单元重视,对JML规格的阅读不够仔细,另一个是测试没有做到位,没有进行充分的测试就进行了提交。

 

你可能感兴趣的:(面向对象第三单元总结)