• 分析在本单元自测过程中如何利用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);
posted on 2022-06-05 17:27  VKQYYU  阅读(12)  评论(0编辑  收藏  举报