OO第三单元总结

一.JML相关

JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言。
一般而言,JML有两种主要的用法:
(1)开展规格化设计。这样交给代码实现人员的将不是可能带有内在模糊性的自然语言描述,而是逻 辑严格的规格。
(2)针对已有的代码实现,书写其对应的规格,从而提高代码的可维护性。这在遗留代码的维护方面 具有特别重要的意义。
理论基础: JML是一种行为接口规格语言(Behavior Interface Specifification Language,BISL),基于Larch方法构建。BISL提供了对方法和类型的规格定义手段。所谓接口即一个方法或类型外部可见的内容。JML通过注释结构与JML表达式,对代码做出形式化的约束。其中JML表达式包括原子表达式如: \result,\old;量化表达式如:\forall,\exists等;集合表达式,操作符等。并通过特点的语言对方法或类型做出约束。
相应工具链接:有JMLUnit,JMLUnitNG,OpenJML 等
我按照讨论区给的博客使用了一下jmluniting
OO第三单元总结_第1张图片

 

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

 

 

 由于原来的Person和Group类不好测,所有我另写了一个Main.java,测试结果当然不尽人意

本以为这个东西挺好的,结果他的局限性挺大的,感觉不好用。

有一说一,还是junit测试舒服,既能实现自动测试又能手动构造测试数据。

二.构架设计

第一次作业我的构架挺简单的,因为整个结构不是很复杂,只有一个社交关系网,然后就是一些人,也没有什么复杂度特别高的操作,我就直接按规格写了。

第二次作业时出现了Group类并且出现了查询各种和的操作,其中的查询relationSum和valueSum是最难的。因为想要避免遍历求值,就得采用缓冲机制,其他的Sum的值容易操作,但是relationSum和valueSum得特别注意,因为其他sum只需要在新加入人的时候进行改变,但是这两sum得在加入关系时也进行改变。我的办法如下图:OO第三单元总结_第3张图片

 

 在addrelation中添加上图代码,在MyPerson中添加如下属性

 

便于在新增关系时更新Group的relationSum和valueSum。

且求Group的Age的方差也需要注意,由于方差和平均值都取整数,可能出现精确度和题目不符的情况。

第三次作业是本单元的大头,也是最能展现本质的一次,这次作业新增了求最短路径,求连通分量,以及查看两点之间有没有割点的要求,这些都是图论的经典问题,对我们的数据结构和离散数学的知识提出了较高的要求。虽说我们对各种算法都有了解,但是真正写起算法时发现还是有点难度,因为我们作业的情况有时候不需要实现模板算法一样具用强大功能的算法,所以我很大程度上都是自己写的,主要采用了bfs进行查找,另外新增了一个Node类来作为节点,在用优先队列找最短路径的时候使用。

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

 

 

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

 

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

 

 

查看两点之间是否存在割点,我采用的算法是,先找出两点之间的一条长度不为2的通路,再依次删去这些点,看看删去点后两点之间是否任然连通,若连通则满足。

求连通分量时我就采用了普通的bfs算法,挺简单的。

我觉得第三次作业最难的不是写算法,而是读懂JML,理解JML的真正含义,这样才能找到合适的算法。

三.bug相关

这三次作业我都写了junit测试,但是第一次作业时由于junit使用不熟悉,导致最终测评时出现了空指针的bug,这bug产生的原因是我在创建类的属性时没有new一个新的对象,给属性加元素时就直接add了,导致了空指针。

第二次作业时,我做了充分的测试,代码逻辑没有问题,但是最后强测全挂了,原因是我的people采用的数组的存储方式,导致查找元素的时间花费很大,后来我把people,value以及person的熟人列表都换成了hashmap,减少了查找时间。

第三次作业我也做了充分的测试,并且和同学对拍过,最后强测也没有逻辑错误,只是查找最短路径的测试点全超时了,因为我没有采用优先队列,而是用的hashmap保存数据,再遍历找最小值,后面改成优先队列解决问题。

四.心得体会

这个单元的JML的学习让我深深地体会到了,给出形式化描述和具体的代码实现真的大不一样,首先是形式化描述可能会掩盖问题的本质,像这次的第三次作业里的对图的各种操作,我一开始都没看懂这是要求啥,只会按照规格进行暴力实现,后来与同学讨论发现原来是求各种图的经典问题。其次是根据JML规格实现方法并尽可能的优化有很大的难度,因为在优化时,你就离JML的直接表述越来越远,最后可能优化出一堆bug。

 

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