OO第三单元总结

第三单元总结

1. 在本单元自测过程中如何利用JML规格来准备测试数据

​ 在本单元的自测过程中,由于在编写代码时我习惯将JML规格描述复制到方法附近,所以在编写过程中我认为是相对满足JML的描述的。同时,在自测时,我相对的更加会考虑边界情况,例如一个组内最多1111人、各种各样不同的报错时机等等,我更倾向于针对这几个方面去构造测试数据。

2.梳理本单元的架构设计,分析自己的图模型构建和维护策略

​ 本单元中由于有着JML规格的存在,使得对于大部分方法、类而言,都是“说什么,我就做什么”就可以做到很完美。因此,我没有选择去刻意的构建一个所谓的图,但是所有的信息都保存在每一个类中。换言之说,MyNetwork类中存了所有的节点,而所有的边都存在MyPerson类中。这样的一张无向图就构造出来了,而对于每个方法,我选择的是再用特定的数据结构去储存处理该请求需要的信息。

​ 在本单元中,所有的异常计数我都是采用一个计数类来实现的,只是对于每次作业新增的异常在这个计数类中需要做出扩充。

​ 我在exception包中构造了一个Counter类,并运用单例模式进行计数。

  • hw9

​ 对于第九次作业,需要重点处理的有isCircle()和queueBlockSum()两个方法。由于queueBlockSum()本质上是要判断二者是否在同一个连通分支内,而isCircle()本质上是判断二者之间是否存在通路,因此在本次作业中采用了并查集的结构来实现。而在每次查询时,选择将被查询的对象以及查询路上所遇到的对象都直接挂在根节点上,方便下一次查询。

  • hw10

​ 对于第十次作业,在第九次作业的基础上多了queueLeastConnection()方法,这个方法本质上是要生成一个最小生成树。因此,在本次作业中我采用了Krustal算法,同时在Krustal算法的计算过程中同样使用并查集的方法,从而进行优化。

  • hw11

​ 对于第十一次作业,在第十次作业的基础上需要处理的关键请求又多了sendIndirectMessage()方法。这个方法本质是寻找最短路径,因此我采用的是带有优先队列优化的dijsktra算法。

3.按照作业分析代码实现出现的性能问题和修复情况

​ 首先,异常处理的性能也没什么能卡的(计数,输出),所以主要的性能优化都集中在了各类正常处理的请求上。

  • hw9

​ 第九次作业的性能问题主要出自isCircle()和queueBlockSum()上。我一开始没有选择并查集优化而是选择了不做任何优化的DFS,结果,栈溢出了。在bug修复的时候,我将这两个方法用并查集进行优化同时运用find()方法减少递归/循环的运算量,最终还是相对比较好修改的。

  • hw10

​ 第十次作业我的性能问题主要出在了qgav和qgvs的处理上。我选择的是每次查询的时候现场计算,然后就又悲剧了。最终我在MyGroup类中加入了ageTotal, squareTotal两个变量,在每次加减人、加减关系的时候处理,在询问时只需要进行O(1)的运算,减少了运算量。

  • hw11

​ 第十一次作业我的性能问题出现在我对dijsktra算法没有进行优先队列优化(事实上,如果我没算错,我的写法的复杂度甚至直逼O(n^3)),然后又被hack烂了。

4.对Network进行扩展,并给出相应的JML规格

public void addProduct(Producer producer, Advertiser advertiser);

public void buyProduct(Customer customer);

/*@ public normal_behavior
@ requres containProduct(product);
@ ensures \result == (\sum(int i;
0 <= i && i <= products.length && (products[i] == product && isBuy(products[i])); product[i].getValue()));
@ also
@ public normal_behavior
@ requires !containProduct(product);
@ ensures \result == 0;
@*/
public /*@ pure @*/ int findProductCount(Product product);

/*@ public normal_behavior
@ requres containProduct(product) && isBuy(product);
@ ensures \result == getAdvertiserOfProduct(product);
@ also
@ public normal_behavior
@ requires !containProduct(product) || !isBuy(product);
@ ensures \result == null;
@*/
public /*@ pure @*/ Advertiser findProductWay(Product product);

//@ ensures \result == (\exists int i; 0 <= i && i < products.length;products[i] == product);
public /*@ pure @*/ boolean containProduct(Product product);

public /*@ pure @*/ boolean isBuy(Product product);

public /*@ pure @*/ Advertiser getAdvertiserOfProduct(Product product);

5.本单元学习体会

​ 在本单元的学习过程中,我从简单到复杂逐渐理解了JML的部分语法和语义,同时能够读懂JML规格到底想要要求我去做什么。与此同时,我意识到对于项目开发时有着一个明确的规格限制在开发时能够带来的便利之处。(实际上,我本单元更多的采用的都是“说什么,我就做什么”的策略,然后基于这个策略进行优化。如果说的不明确、包含的情况不全面,那么做的时候显然做不明白。)

posted @ 2022-06-06 15:31  普通桑  阅读(17)  评论(0编辑  收藏  举报