OO第三单元总结

1.整体总结

本单元三次作业我都做到了有效通过,算是一个小的进步,但编程能力和学习理解的程度还是不到同学们的平均水平。总体来说,理论课方面算是充分理解,作业也在较为详细的指导书的帮助下顺利完成,但是在强测和互测方面还是收获甚微,有很都需要改进的地方。

2.JML理论基础和应用工具链

经过三个星期的学习和实践,我认为JML就是规范的编程要求。通过JML的规程让编程者了解需要实现的功能,这个功能需要什么前提,实现的功能有什么效果。使得编程者可以通过直接看JML,不用额外的交流,就明白要完成什么。同时我也体会到了JML与离散数学有很多相通的地方,原子表达式,量化表达式,集合已经算法中所需要的图论知识都与离散数学紧密相连。jml语言通过表达式、方法规格、类规格三个部分来进行描述,其实本质上是对代码的形式化描述。

(1)原子表达式

\result表达式:表示一个非 void 类型的方法执行所获得的结果,即方法执行后的返回值。

\old( expr )表达式:用来表示一个表达式 expr 在相应方法执行前的取值。主要用于评估 expr中的对象是否发生变化。

\not_assigned(x...)表达式:用来表示括号中的变量是否在方法执行过程中被赋值。

\not_modified(y...)表达式:用来限制括号中的变量在方法执行期间的取值未发生变化。

(2)量化表达式

\forall表达式:全称量词修饰的表达式,表示对于给定范围内的元素,每个元素都满足相应的约束。

\exists表达式:存在量词修饰的表达式,表示对于给定范围内的元素,存在某个元素满足相应的约束。

\sum表达式:返回给定范围内的表达式的和。

\product表达式:返回给定范围内的表达式的连乘结果。

\max表达式:返回给定范围内的表达式的最大值。

\min表达式:返回给定范围内的表达式的最小值。

\num_of表达式:返回指定变量中满足相应条件的取值个数。

(3)方法规格

requires:前置条件,表示确定调用的条件为真。

ensures:后置条件,表示确保实现方法的返回结果满足谓词的要求。

signals:表示抛出异常

assignable:方法执行时修改对象的数据,影响后续方法的执行。

(4)JML工具链

几次作业我都用了基本的openjml工具链,我们可以通过命令行工具对JML进行规范性检查,让JML具有真正的规范意义。

openjml主要有几种功能:

​check:对JML注释的完整性进行检查。检查包括经典的类型检查、变量可见性与可写性等。

static check:对规格内容的检查,例如前置后置条件等是否符合

runtime check:运行时动态检查,进一步对运行中的程序是否符合规范进行检查.

​JMLUnit:自动化单元测试,通过构造不同层次的单元测试,可以对各个功能进行自行构造测试数据集,自行断言测试的功能

总结来说JML对编程者显得简单易理解,但是却要开发者付出设计复杂JML的代价。通过学习JML能提升我们规范化编程的能力,利用JML编程是一次有用的学习经历

 

 3.架构设计的梳理

第一次作业

第一次作业难度不大,只需要实现Person接口的MyPerson类和实现Network接口的MyNetwork类并根据JML规格实现接口中的方法。MyPerson类主要是存储每个person的各项属性和各自与熟人之间的距离。也需要完成查询和对比的操作。MyNetwork类用来管理所有的person,要实现新增person和添加人之间关系的功能。比较有难度的是isCircle方法的实现,我采取了深度优先遍历的方法。虽然本次作业基础测试通过,但在强测中得分是0分。程序在逻辑方面还是出现了漏洞。

OO第三单元总结_第1张图片

 

 

 第二次作业

这次作业新增了组类Group,并通过MyNetwork调用了MyGroup中的方法函数。这次作业整体难度较第一次略有提高。在Group里面的relationSum和 valueSum两个方法需要考虑到时间复杂度的问题,如果完全按照JML的规格会有O(n2)的复杂度,会出现超时的问题。

OO第三单元总结_第2张图片

 

 

 第三次作业

 本次作业实现一个社交关系模拟系统。难度较前两次作业较大。这次作业综合考察了很多数据结构和离散数学的课程内容。MinPath,StrongLinked,BlockSum这三个方法,分别对应的算法是Dijkstra,Tarjan,并查集。在学习JML的基础上对我们高效算法设计的能力也进行了考察。

OO第三单元总结_第3张图片

 

 

 总结来说三次作业我都单纯实现了JML规格种要求的大类,代码补交冗长,内部算法效率不是很高。在强测中也出现了逻辑上的错误没有得分。但是我对JML规范化的程序设计模式有了一定的了解,有了一定的进步但进步空间还很大。

4.Bug的检查和修复

因为程序在新增用户的方法里重复ID的情况没有考虑全面出现了逻辑错误。目前已改正。

第三次作业面对大量数据依然出现了很多WA和异常,目前还在修改阶段。

 

5.学习心得体会

通过这一单元的学习,我了解了JML下的规范化JAVA程序设计。作业的完成也没有前几次那么举步维艰,但是在程序的鲁棒性上还是做的很差,有一些细节方面的逻辑错误依然时常发生。但是面对这些问题,我总会感觉孤立无援不知道如何解决看到同学们能找到人对拍互相交流确实很有用。我的问题却和他人不太一样,自己对长篇幅代码的总体把握程度还需要加强,希望之后的学习能通过努力更上一层楼。

你可能感兴趣的:(OO第三单元总结)