zoukankan      html  css  js  c++  java
  • 北航OO第三单元总结

    JML基础梳理及工具链

       JML的全称是Java Modeling language,即Java建模语言。JML是一种行为接口规格。它为严格的程序设计提供了一套行之有效的方法。通过JML不仅可以基于规格自动构造测试样例,还可以以静态方式检查代码对规格的满足情况。

      一、注释结构

        行注释://@annotation

        块注释:/*@ annotation @*/

      二、JML表达式

      (1)原子表达式

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

        old(expr)表达式:用来表示一个表达式expr在相应方法执行前的取值。

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

         ot_modified(x,y,…)表达式:限制括号中的变量在方法执行期间的取值未发生变化。  

         onnullelements(container)表达式:表示container对象中存储的对象不会有null。

       (2)量化表达式

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

        exists表达式:与forall表达式使用结构类似,为存在量词修饰的表达式,表示对于给定范围内的元素,存在某个元素满足相应的约束。

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

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

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

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

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

       (3)集合表达式

          集合构造表达式:可以在JML规格中构造一个局部的集合(容器),明确集合中可以包含的元素。

       (4)操作符

          (1) 子类型关系操作符: E1<:E2 ,如果类型E1是类型E2的子类型(sub type),则该表达式的结果为真,否则为假。

          (2) 等价关系操作符: b_expr1<==>b_expr2 或者 b_expr1<=!=>b_expr2 ,这两个表达式的意思是 b_expr1==b_expr2 或者 b_expr1!=b_expr2 。

          (3) 推理操作符: b_expr1==>b_expr2 或者 b_expr2<==b_expr1 。

          (4) 变量引用操作符:JML提供了几个概括性的关键词来引用相关的变量。 othing指示一个空集;everything指示一个全集.

      三、方法规格

        (1)  前置条件:requires

        (2)后置条件:ensures

        (3)副作用范围限定:assignable或modifiable

      四、类型规格

        从课程要求来看有

        (1)不变式限制

        (2)约束限制

    部署JMLUnitNG/JMLUnit及实现自动生成测试样例

    针对如下的compare代码

     

    利用JMLUnitNG生成测试样例:

     

     可以看到自动生成的测试样例包括了正数,负数,0以及边界条件的各种组合。覆盖非常的全面。

    架构设计分析

     

     第一次作业直接填写方法,没有太多自己设计的地方。

    第二次作业需要设计一个图结构来计算最短路径。

    增加了一个数点个数的HashMap,来判断增删路径后结点是否还存在。

    增加了一个数路径的HashMap,来判断增删路径后边是否还存在。

    增加了记录一个点与哪些点连接的HashMap。

    第三次作业比较麻烦。我参考的是讨论区的拆点法,然后用迪杰斯特拉求解最短路径,特殊的,在求解最少换乘时采用的是染色算法。

     

    bug分析及修复情况

     第一次作业的bug很惨。当时比较大小只写了同长度比较大小的算法,备注了三个?,然后忘了没写完,就把备注删了,导致最后提交的时候出现了bug。

     第二次作业难度依旧很小。没有什么bug。互相测试时出现一个判断大小的bug,原因是一个判断条件写错了。

    第三次作业比较难。拆点之后用的迪杰斯特拉算法。但是我并没有完全按照讨论区的做法,导致算法上有误。在修修补补多处之后仍然无济于事的我最后选择了重构。

    心得体会

    OO作业每次发布的时候都会觉得好难,感觉无法完成。把作业指导书反复地读几遍之后,任务看起来似乎又很简单,只要做到A,B,C三点问题就解决了。然而实际操作的过程中,A,B,C似乎轻而易举地解决了,但是一旦把代码跑起来,就发现漏洞百出,各种莫名其妙的bug。然后一环一环地测试,每一小步都会发现问题。码代码贵在细节。无论哪里错了,结果都会相去甚远。

  • 相关阅读:
    在Azure虚拟机上安装SQL server
    Azure的负载均衡机制
    如何在ARM中创建Express Route
    如何将已部署在ASM的资源迁移到ARM中
    Azure上的那些IP
    使用mysqlslap对mysql进行压测,观察Azure虚拟机cpu使用率
    在Azure虚拟机上安装VNC
    DataGridView中实现checkbox全选的自定义控件
    jquery checkbox 实现单选
    如何通过Azure Service Management REST API管理Azure服务
  • 原文地址:https://www.cnblogs.com/buaayzx/p/10908017.html
Copyright © 2011-2022 走看看