OO第三单元总结

OO第三单元博客

  1. 梳理JML语言的理论基础、应用工具链情况

理论基础:通过一系列描述行为描述的代码进行代码的编写,继承父类的全部接口对代码进行方法的重写,同时不改变父类的返回值和功能。JML语言有很多既定的规定,比如方法规格当中有前置条件+后置条件+副作用的要求,前置条件是执行的初始条件,后置条件是对结果的要求,副作用是对于目标类是否改变,针对这些要求完成JML代码的构建。除此之外还有数据规格约束invariant不变约束,以及constraint变化约束。

工具链:已知的工具链有OpenJML进行jml格式检验,JUnit进行测试等。

 

  1. 部署JMLUnitNG/JMLUnit,针对Group接口的实现自动生成测试用例,并结合规格对生成的测试用例和数据进行简要分析

在三次作业中针对测试方面我并没有采用自动生成测试用例的方式,而是添加部分数据进行测试,测试方法是生成一定数量的人加入group中,并对每一个方法进行测试,加入人的代码如下。

 

 

 

 

生成的测试用例可以根据需要生成有规律的性格和id,便于设计测试结果的数据来进行结果判定。而具体的测试程序为调用目标方法,用assertThat方法对正确的方法和得到的结果进行比较,如果不正确则抛出异常。通过这个方法可以很好的检测方法的值,缺点是需要手动计算每一个预定的结果,手动操作量较大。而我则是观察输出的值和期望值进行对比,缺点是测试的数据量较小。

  1. 按照作业梳理自己的架构设计,特别分析自己的模型构建策略

 

第一次作业:

 

 

 

第二次作业:

 

 

 

 

第三次作业:

 

 

 

在我的程序当中,主要是按照JML的注释来对应相应的代码,但是也基本实现了图的结构,对于Network当中每一个Person都是图的几个节点,而建立Network的过程就是在每一个图上的点建立连接。而Network的重点在于对图的处理和遍历。我在图的遍历当中主要使用dfs节点遍历,以此获取图中的最短路径和断点数目。

  1. 按照作业分析代码实现的bug和修复情况

本次作业我的强侧成绩非常差,主要原因是我没有使用并查集对Person的点集进行构建,也因此不能很好的将断点以及路径数目方便的找出来,需要经过极多的遍历,复杂度为o(n^3),需要在遍历所有路径的前提下对每条路径进行二次遍历,耗费大量的cpu时间。在进行中测的编写时,曾经出现了在计算qbs的值时错误,原因是对于JML的阅读不到位,将sum;;forall;;1的结构理解为每一个不连通点出现都要加一,而其原意是对于所有的Person,只要有一个在他之前的点导致block就加一并且进入下一个循环。这个bug告诉我对于JML的细致阅读是十分重要的,不然会导致根本性的错误。

  1. 阐述对规格撰写和理解上的心得体会

在本单元的学习中,我最大的心得体会就是JML只提供要求不提供思路,并不是满足每一个单一方法的要求就能够满足总体的要求,而是要先自己构建结构,之后满足每一个方法要求。因此本次作业其实考验的是对图结构的构建而不是对JML的翻译。而且,仅仅照着JML去编写代码容易导致自己对于代码理解不够,以至于之后重构或者优化十分困难,因此应该先阅读所有的JML注释,列出所有要求选择合适的模型进行构建,之后在在结构的基础上对父类方法进行实现。

 

 

posted @ 2020-05-23 10:54  lhy1823  阅读(126)  评论(0编辑  收藏  举报