目录

  • 第三单元——jmljunit与图

第三单元——jmljunit与图



〇、问题描述

​ 本单元主题为JML的学习,问题载体为一个无向图路径管理系统。在三次作业种,情景不变,需求递增。因此需要在层次上做好安排。


一、JML语言

理论基础(Level 0)
  • 注释结构

    // @annotation 行注释

    /* @annotation*/ 块注释

  • JML表达式

    • 原子表达式

      \result 方法执行后的返回值

      \old(expr) 表达式expr在方法执行前的值

      \not_assigned(expr) 表达式expr是否被赋值

      \not_modified(x,y,...) 表达式expr是否变化

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

      \type(type) 表达式:返回类型type对应的类型(Class)

    • 量化表达式

      \forall 全称修饰

       (\forall int i,j; 0 <= i && i < j && j < 10; a[i] < a[j])

      \exists 存在修饰

       (\exists int i; 0 <= i && i < 10; a[i] < 0)

      \sum 给定范围内的表达式的和

       (\sum int i; 0 <= i && i < 5; i)

      \product 给定范围内的表达式的连乘结果

      \max min 给定范围内的表达式的最大/小值

      \num_of 指定变量中满足相应条件的取值个数

    • 集合表达式

    • 操作符

      <: 子类型关系操作符

      <==> <=!=>等价关系操作符

      ==> <== 推理操作符

      \nothing \everything 变量引用操作符

  • 方法规格

    requires 前置条件

    ensures 后置条件

    assignable 可赋值

    modifiable 可修改

    public normal_behavior 正常功能

    signals 抛出异常

  • 类型规格

    invariant 不变式

    constraint 状态变化约束

应用工具链

lowa State JML : 提供了一个断言检查编译器jmlc,将JML注释转换为运行时的断言;

jmldoc: 文档生成器,用于生成Javadoc文档,增加了来自JML注释的额外信息。

jmlunit: 单元测试生成器可以从JML注释中生成JUnit测试代码。


二、JMLUnitNG/JMLUnit

public class Demo {/*@ public normal_behaviour@ ensures \result == a + b;@*/public static int add(int a, int b) {return a + b;}public static void main(String[] args) {add(12,3);}
}

[TestNG] Running:
Command line suite

Passed: racEnabled()
Passed: constructor Demo()
Passed: static add(-2147483648, -2147483648)
Passed: static add(0, -2147483648)
Passed: static add(2147483647, -2147483648)
Passed: static add(-2147483648, 0)
Passed: static add(0, 0)
Passed: static add(2147483647, 0)
Passed: static add(-2147483648, 2147483647)
Passed: static add(0, 2147483647)
Passed: static add(2147483647, 2147483647)
Passed: static main(null)
Passed: static main({})

===============================================
Command line suite
Total tests run: 13, Failures: 0, Skips: 0
===============================================


三、程序设计

类的设计——继承与递进
  • 简析三次作业涉及到的指令及实现方式:

    • 第一次:HashMap管理路径

      // 两个对应的 HashMap 存储,加快查找
      private HashMap<Integer/*id*/,MyPath/*path*/> pathList;
      private HashMap<MyPath/*path*/,Integer/*id*/> pidList;
      // 在添加和删除时管理总点数,分摊复杂度
      private HashMap<Integer/*node*/,NumberOfNode/*number of node*/> distinct;// hashcode的设定
      /*path*/
      @Overridepublic int hashCode() {return nodes.hashCode();}
      /*integer*/Integer.hashCode();
      • 添加删除类 O(n)

        在两个表中添加/删除路径;管理节点数目。包括:

        • 添加路径
        • 删除路径
        • 根据id删除
      • 查询类 O(1)

        包括:

        • 查询id
        • 查询路径
        • 获取总路径数
        • 根据id获取路径大小
        • 根据结点序列判断容器是否包含路径
        • 根据路径id判断容器是否包含路径
        • 容器内不同结点个数
        • 路径中是否包含某个结点
      • 根据id获取不同节点个数 O(n)

        path内排序+遍历第一次为O(n),其后为O(1)

      • 根据字典序比较两个路径的大小关系 O(n)

    • 第二次:HashMap存储邻接表管理无向图

      // 邻接表:边权均为1的无向图
      private HashMap<Integer/*起点*/,HashMap<Integer/*终点*/,Integer/*边数*/>> reachable= new HashMap<>();
      • 边的存在性 O(1)

      • bfs 搜索 O(v+e)

        包括:

        • 两个结点是否连通

          最短路径存在

        • 两个结点之间的最短路径

    • 第三次:UndirectedGraph

      含有图的嵌套关系;图的连接状态相同但边权不同。新增一类专门管理。

      abstract class UndirectedGraph {// 无向图private HashMap<Integer/*point*/,HashMap<Integer/*point*/,Integer/*weight*/>> undirectedGraph;// 缓存区private HashMap<Integer/*point*/,HashMap<Integer/*point*/,Integer/*weight*/>> cache;private bfs(){}private spfa(){}...
      }

      以下复杂度讨论均不考虑缓存查找。(重复查询时O(1)

      • 连通块数量

        涂色

      • spfa

        本质上都是带最短路径的问题。。。以前的沙雕方法都重写了。

        • 最低票价
        • 最少换乘次数
        • 最少不满意度
        • 最短路径
        • 两点连通性
  • 三次架构

    • 第一次:哈希表+规格方法
    • 第二次:添加可达表,原有方法不变
    • 第三次:添加图,重写查找算法相关方法
算法
  • 第二次:bfs

  • 第三次:每条path内部先构建好小图,即建立好所有的边,这样在每一条边上加上换乘权值,搜最短路 ( spfa ) 就行。共需三个权值不同的图。

    因为查询指令较多,应每次搜索都将当前起点的所有终点最短路都放入缓存。每当图结构更改应该清空缓存。


四、BUG分析

​ (本地bug)写第三次作业时,bfs写成找到目标终点即停止:

while (size != 0) {if(fr==to) return;//...for (Integer x : keySet()) {//...}
}

​ 导致第二次搜索时进行不下去。应改成一次性搜索完所有终点。


五、心得体会

​ 对于jml,语法是相对简单,理解也相对容易。难点在于自己写出一份规范的规格。因为写规格的成本比写代码高出太多,我对jml仍仅仅停留在了解阶段,还需要更多的学习。毕竟,第三单元的作业架构严格来说几乎没有自己参与……由此也可见得架构对于程序正确性、效率和可扩展性的重要性。

转载于:https://www.cnblogs.com/DilemmaR/p/10908548.html

OO第三单元总结:JML相关推荐

  1. OO第三单元总结——JML规格

    一.JML简介 1.JML语言的理论基础 JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML是一种行为接口规格语言 (Behavior In ...

  2. OO第三单元JML规格总结分析

    OO 第三单元博客作业 1. JML语言概述 1.1 理论基础 综述 Java建模语言(Java Modeling Language,JML)是一种进行详细设计的符号语言,使人们用一种全新的方式来看待 ...

  3. OO第三单元——规格化设计与地铁系统——总结

    OO第三单元--JML的使用与地铁系统 梳理JML语言的理论基础.应用工具链情况 JML The Java Modeling Language (JML) is a specification lan ...

  4. java契约式编程_第三单元总结——JML契约式编程

    OO第三单元博客作业--JML与契约式编程 OO第三单元的三次作业都是在课程组的JML规格下完成.完成作业的过程是契约式编程的过程:设计者完成规格设计,实现者按照规格具体实现.作业正确性的检查同样围绕 ...

  5. OO第三单元单元总结

    OO第三单元单元总结 测试过程 黑箱操作和白箱操作 黑箱操作我认为就是通过随机构造合法数据对代码进行测试,在测试过程中应当着重对边界条件.前置条件.结果正确性等方面进行判断.不需要具体到代码的逻辑,通 ...

  6. OO第三单元总结性博客

    OO第三单元总结性博客 JML理论基础与工具链 JML理论基础 JML是一种将java程序规格化表达的一种语言,其描述的是行为的规格,而非具体的代码实现. 通过对程序开展规格化设计,当然前提是使用JM ...

  7. java jml_面向对象第三单元总结 - JML(Java Modeling Language) - 简体版本

    面向对象第三单元总结 - JML(Java Modeling Language) - 简体版本 一.JML 理论基础 与 应用工具链 1.1 JML 理论基础 JML(Java Modeling La ...

  8. 「BUAA OO Unit 3 HW12」第三单元总结 —— JML规格化设计与基于社交网络背景的图论算法

    「BUAA OO Unit 3 HW12」第三单元总结 目录 Part0 前言 Part1 测试分析 1.1 黑箱白箱 1.2 多种测试思路分析 1.2.1 单元测试 1.2.2 功能测试 1.2.3 ...

  9. JML规格编程——BUAA OO第三单元作业总结

    整体概述 这个单元整体围绕Java Model Language(JML)展开,通过学习JML规格了解契约式编程的过程,课上实验中进行了JML规格的简要编写,课下实验主要通过阅读规格并按照规格的要求正 ...

最新文章

  1. js调用数科阅读器_阅读大型 JavaScript 源码时有什么好用的工具?
  2. linux 测试各大网站速度curl
  3. nginx 错误502 upstream sent too big header while reading response header from upst
  4. java怎么获取城市气温_获取城市天气数据
  5. 西部数据硬盘支持linux,西部数据开发新的Linux文件系统“Zonefs” 支持在分区块设备上运行...
  6. 常量指针与指针常量的区别(转帖)
  7. java invocationtarget,启动工程报java.lang.reflect.InvocationTargetException的解决详解
  8. Rokon 关于精灵的点击事件
  9. PDF转WORD工具破解版
  10. 在VMware16虚拟机安装Ubuntu详细教程
  11. python直角三角形的两个直角边、求斜边_直角三角形斜边公式计算器 两个直角边边长的平方加起来等...
  12. 系统没有安装任何软件如何查看电脑开机启动项
  13. win7升级win10系统
  14. android模拟奥克斯空调红外,奥克斯空调手机遥控器
  15. linux系统怎么设任务计划,在Linux系统上设置计划任务
  16. 单片机秒表c语言,单片机制作秒表计时器(c语言)
  17. uni-app安卓appNFC读卡
  18. 博世(BOSCH) ECU BootLoader设计思路
  19. Vector Commitment Techniques and Applications to Verifiable Decentralized Storage学习笔记
  20. 软科计算机科学与工程专业,2019上海软科世界一流学科排名计算机科学与工程专业排名莱斯特大学排名第301-400...

热门文章

  1. SMMS 2016 啟用深色主題
  2. HDU 1757 A Simple Math Problem (矩阵快速幂)
  3. Dojo中跨域获取新浪股票接口返回的数据(练习)
  4. ASP.NET MVC从视图传递多个模型到Controller
  5. Java中abstract和interface的区别
  6. LINQ to SharePoint 试用感受, 欢迎讨论~
  7. spring-boot注解详解(六)
  8. 《LoadRunner 12七天速成宝典》—第2章2.6节第二个性能测试案例
  9. 关于SqlBulkCopy SQL批量导入需要注意,列名是区分大小写的
  10. java web 程序---javabean实例--登陆界面并显示用户名和密码