- 分析在本单元自测过程中如何利用JML规格来准备测试数据
阅读JML, 理解数据要求,正常行为和异常行为。在满足前提的条件下,准备正常行为和异常行为的数据。比如增加之前不存在或之前存在的人,以测试EqualPersonIdException.
- 梳理本单元的架构设计,分析自己的图模型构建和维护策略
我将图的数据存在两个地方。
一处是在Network上,存放边两端ID的二元组和权值,用于组的queryValueSum.(查找两端都在组内的边)。
一处是各个People节点上,存放边的另一端和权值,用于其他查询和算法。
为优化isCircle, 我还为每个人记录一个Circle编号,属于用一Circle的People之间都存在一条路径。
- 按照作业分析代码实现出现的性能问题和修复情况
在前两次作业中,我没有在各节点上记录它们的连接,在queryLeastConnection时要遍历所有的边来找到一个节点的邻边,现在只需要在节点本身上找。
- 本单元学习体会
学习了阅读JML规格,体会到规格与自然语言的区别,和规格的严谨。
复习了图论知识,实现了一些图论算法。
- 请针对下页ppt内容对Network进行扩展,并给出相应的JML规格
假设一个Producer只卖一种商品
查询Producer销售的商品(int id)
/*@ public normal_behavior
@ requires contains(id) && getPerson(id) instanceof Producer
@ ensures \result = ((Producer) getPerson(id)).product
@
@ also
@ public exceptional_behavior
@ requires !contains(id) || !getPerson(id) instanceof Producer
@ signals (PersonIdNotFoundException e) !contains(id1);
@ signals (WrongPersonTypeException e) contains(id1) && getPerson(id).type != PRODUCER
@*/
public /*@ pure @*/ Product queryProductOf(int id);
查询商品的销售额(int n)
/*@ public normal_behavior
@ requires (\exists Person p; p in peoples; p instanceof Producer && ((Producer) p).product.equals(pr))
@ ensures (\exists Person p; p in peoples; p instanceof Producer && ((Producer) p).product.equals(pr) && \result == ((Producer) p).sales)
@
@ also
@ public exceptional_behavior
@ requires (\forall Person p; ... ; ...)
@ signals (NoSuchProductException e) ...
@*/
public /*@ pure @*/ int queryProductSales(Product pr);