• OOUnit3


    第三单元总结

    一、JML理论基础、应用工具链

    1.1 理论基础

    1.1.1 简述

    JML是实现数据抽象的一种规格语言,通过前置条件、后置条件、副作用、异常行为等来约束方法的预期功能,在实现方法代码前完成约束和设计。

    1.1.2 基本语法

    前置条件

    表示调用一个方法前所必须满足的要求,该要求需要由方法的调用者保 证满足,是对调用者的要求

    requires P;
    
    后置条件

    表示调用一个方法后所必须满足的要求,该要求由方法的实现保证满足, 是对调用者的承诺

    ensures P;
    
    副作用

    表示调用方法后可能会改变哪些变量的值

    assignable < 
    othing | everything | 变量名{, 变量名} >;
    
    规格变量

    分为静态规格变量和实例规格变量,在类或接口中声明

    public [ static | instance ] model [ non_null ] 类型 变量名;
    
    表达式内语句
    (forall T x; R(x); P(x))
    //每一个T类型的元素x,如果x满足谓词R(x),则x必满足谓词P(x)
    
    (exists T x; R(x); P(x)) 
    //存在一个T类型的元素x,如果x满足谓词R(x),则x必满足谓词P(x)
    
    
    esult
    //方法返回值
    old
    //表示某变量修改前的值
    

    1.1.3 使用框架

    举例:

    /*@ public normal_behavior		//正常情况规格表示1
    @ requires [condition1] ;
    @ assignable ... ;
    @ ensures ... ;
    @ also
    @ public normal_behavior		//正常情况规格表示2
    @ requires [condition2] ;
    @ assignable ... ;
    @ ensures ... ;
    @ also
    @ public exceptional_behavior		//异常情况规格表示
    @ requires [condition2] ;
    @ assignable ... ;
    @ signals_only SomeException;
    @*/ 
    public boolean someMethod(Object obj) throws
    SomeException;
    

    1.2 应用工具链

    1.2.1 JML规格检查工具

    • OpenJml
    • SMT Solver

    1.2.2 JML单元测试工具

    • JMLUnit
    • JMLUnitNG

    二、JMLUnitNG的使用

    java -jar jmlunitng.jar test/MyGroup.java

    javac -cp jmlunitng.jar test/*.java

    java -jar openjml/openjml.jar -rac test/MyGroup.java test/MyPerson.java

    java -cp jmlunitng.jar test.MyGroup_JML_Test

    三、作业架构设计

    3.1 第九次作业

    第九次作业根据规格实现person类和net类中的方法,无需再增加自己的类。

    其中isCircle方法中有图连通问题出现,初步使用迭代,结果爆栈。查找资料后使用bfs方法。

    3.2 第十次作业

    第十次作业增加了group类和一些方法。在看了讨论区的帖子之后,修改了所用的容器提高效率。

    3.3 第十一次作业

    第十一次作业增加了图连通块的几个方法,对算法复杂度提出了更高的要求。为了节省容器扩容时间增加了默认容器大小,同时为了降低算法复杂度引入自己的几个方法。

    由于三次作业采取固定的规格,故架构相似,仅放出简略的依赖图:

    四、bug分析

    4.1 第九次作业bug分析

    第九次作业强测得到0分。通过同学的讨论得知强侧的数据远大于弱中测,问题主要出在isCircle方法使用递归或者dfs还是bfs上。

    4.2 第十次作业bug分析

    第十次作业强测虽然得分但是扣分严重,问题主要出在容器的选择上。

    4.3 第十一次作业bug分析

    第十一次作业强测同样扣分严重,在几个连通块方法上算法复杂度一直降不下去。数据量一堆叠起来直接TLE。

    五、心得体会

    5.1 对规格化撰写

    一开始认为按照规格撰写代码感觉像是找着答案写题一样的简单活。但随之发现,尽管已经约束好了输入输出,方法的规格和数据的规格,但是在具体实现上,对数据结构和容器的选取和以及对一些边界值的处理都有很大的选择空间。而这些直接影响到了程序的性能甚至正确性。

    5.2 对规格化的理解

    直接将过程处理在设计阶段解决,实现阶段只需要考虑具体的代码实现形式,这一单元工作量明显下降的主要原因就是只需要理解规格进行实现阶段,而跳过了设计阶段,省去了大量的时间。规格化设计对新手迅速上手很有帮助。

  • 相关阅读:
    Codeforces Round #174 (Div. 1 + Div. 2)
    Codeforces Round #176 (Div. 1 + Div. 2)
    [ARC101C] Ribbons on Tree 解题报告
    [CTS2019]珍珠 解题报告
    CF1349D Slime and Biscuits 解题报告
    [PKUWC2018]猎人杀 解题报告
    AGC047 解题报告
    肯德基 解题报告
    [GXOI/GZOI2019]旧词 解题报告
    [ARC084B] Small Multiple 解题报告
  • 原文地址:https://www.cnblogs.com/noharaShio/p/12943509.html
Copyright © 2020-2023  润新知