JML理论基础

  • JML规定了一些语法,用这些语法可以描述一个方法,一个类的行为,理论基础是离散数学吧

JML常用语法

  • 前置条件: 使用 require + 表达式 ,表达式一般为布尔表达式
  • 副作用: assignable列出这个方法能够修改的类成员属性,\nothing是个关键词,表示这个方法不对任何成员属性进行修改,所以是一个pure方法。
  • 后置条件: 使用 ensures + 表达式 , 表达式一般为布尔表达式.
  • 常用语法:
    • 原子表达式:

      \result: 表示返回值.

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

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

    • 量化表达式(谓词逻辑):

      \forall x;P(x);Q(x) ,对于所有的x,P(x)为真则Q(x)为真,

      \exits x;P(x);Q(x),存在x,P(x)为真则Q(x)为真,

      \sum i; 求和范围 ;累加值, 类似于数学中的求和

      \prodoct i ;求积范围 ;累乘值, 类似于数学的求积

    • 集合表达式 没用到

    • 操作符: 等价 <==> 蕴含 ==>

    • 异常:

      public normal_behavior 正常行为

      public exceptional_behavior 要抛出异常的行为

      signals (***Exception e) b_expr; 当满足表达式时,抛出异常e

      signals_only Exception e 当满足前置条件时抛出异常e

    • 类型规格:

      invariant 可见状态下满足,可见状态一般指函数运行前后

      constraint 状态变化约束对前序可见状态和当前可见状态的关系进行约束

JML工具链

模型分析

本单元的作业基本按照规格来实现即可,在模型构建上也没有过多的思考过.

bug和修复情况

  • 第一次作业出现了没进互测的情况,一共出现了两个bug,其中一个是因为在修改checkstyle的时候删掉了一个空的if语句块,错了.另外一个是dfs写的复杂度太高了.
  • 第二次作业无bug
  • 第三次作业在求最短路径的时候又出现了tle的情况,基本是卡在了2秒多一点点,采用了堆优化加diji的算法,但是在实现上还是出了点问题,导致速度比别人慢了一秒多.bug修复时,疯狂修改代码的复杂度,最后发现是因为在network里面没有记录value导致了存取有一些时间上的差异.

规格撰写和理解

写规格真的不是一件容易的事情,感觉写规格要比写代码还要复杂,现实生活中应该不会有哪个团队写代码前先写一份规格吧.规格是站在更高的角度,使得对代码的测试更加遍历,那么你对规格的正确性的测试我自己感觉是远大于直接进行代码的测试,所以在这块感觉是很没有必要去搞这个规格的.如果规格就写错了,那实现者岂不是很尴尬.

BUAAOO第三单元总结的更多相关文章

  1. linux学习笔记:第三单元 Linux命令及获取帮助

    第三单元 Linux命令及获取帮助 11) 了解Linux命令的语法格式:命令 [选项] [参数]2) 掌握命令格式中命令.选项.参数的具体含义a) 命令:告诉Linux(UNIX)操作系统做(执行) ...

  2. 面向对象OO第三单元总结

    第三单元OO总结博客 1 梳理JML语言的理论基础.应用工具链情况 由于篇幅原因,这里只梳理几个在本单元常用的 注释结构 行注释://@annotation 块注释:/* @ annotation @ ...

  3. SAP标准培训课程C4C10学习笔记(三)第三单元

    第三单元:Account and Contact management Account和Contact概念和SAP CRM里是一样的: 并且支持同ERP和CRM的客户主数据做同步. 关于具体的同步场景 ...

  4. OO第三单元总结——JML

    目录 写在前面 JML理论基础 JML工具链 JMLUnitNG的使用 架构设计 Bug分析 心得体会 写在前面 OO的第三单元学习结束了,本单元我们学习了如何使用JML语言来对我们的程序进行规格化设 ...

  5. OO第三单元作业总结

    OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...

  6. 规格化设计——OO第三单元总结

    规格化设计--OO第三单元总结 一.JML语言理论基础.应用工具链 1.1 JML语言 ​ JML(java modeling language)是一种描述代码行为的语言,包括前置条件.副作用等等.J ...

  7. 【OO学习】OO第三单元作业总结

    [OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...

  8. OO第三单元(地铁,JML)单元总结

    OO第三单元(地铁,JML)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉并了解JML来是我们具有规格化编程架构的思想.这个单元的主题一开始并不明了,从第一次作业的路径到第二次 ...

  9. BUAA OO 2019 第三单元作业总结

    目录 总 JML规格化设计 理论基础 工具链 规格验证 验证代码 代码静态检查 自动生成测试样例 生成结果 错误分析 作业设计 第九次作业 架构 代码实现 第十次作业 架构 代码实现 第十一次作业 架 ...

随机推荐

  1. Flutter 创建透明的路由页面

    原文 import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends St ...

  2. Java线程池实现原理及其在美团业务中的实践

    本文转载自Java线程池实现原理及其在美团业务中的实践 导语 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供 ...

  3. eclipse从接口快速跳转到实现类

    1.只跳转到实现类上 按住Ctrl键,把鼠标的光标放在要跳转的接口上面,选择第二个 2.直接跳转大实现的方法上 按住Ctrl键,把鼠标的光标放在要跳转的方法上面,选择第二个 对比可以发现,操作都是一样 ...

  4. 基于μcOS-II实时操作系统源码实现RMS和EDF调度(共享资源)

    μcOS-II多任务实验报告(RMS.EDF调度) 目录 μcOS-II多任务实验报告(RMS.EDF调度) 一.实验概述 二.环境搭建 三.代码分析 四.实验步骤 1 给TCB块添加扩展 2 创建并 ...

  5. Traefik-v2.x快速入门

    一.概述 traefik 与 nginx 一样,是一款优秀的反向代理工具,或者叫 Edge Router.至于使用它的原因则基于以下几点 无须重启即可更新配置 自动的服务发现与负载均衡 与 docke ...

  6. 分布式实时处理系统——C++高性能编程

    [前言]基于通信基础,介绍Hurricane实时处理系统的工程实现,主要使用C++语言. 一.IPC.socket.异步I/O epoll 二.C++11 1.linux内存管理中使用RALL原则,C ...

  7. pytorch(15)损失函数

    损失函数 1. 损失函数概念 损失函数:衡量模型输出与真实标签的差异 \[损失函数(Loss Function): Loss = f(\hat y,y) \] \[代价函数(Cost Function ...

  8. python分离不同后缀名的文件

    功能描述 根据文件后缀名处理文件,分别拷贝到对应的文件夹下 example >>> .jpg 后缀 和.mp4 后缀文件处理 代码实现 #!/usr/bin/env python # ...

  9. Java 树结构实际应用 一(堆排序2秒排完800w数据)

    堆排序 1 堆排序基本介绍 1) 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复 杂度均为 O(nlogn),它也是不稳定排序. 2) 堆是具有以下性 ...

  10. 世界国省市区SQL语句(mysql)

    CREATE TABLE loctionall ( country VARCHAR(40) , provice VARCHAR(40) , city VARCHAR(40) , CONSTRAINT ...