一、JML 语言的理论基础及应用工具链

JML 是一种行为接口规格语言,提供了对方法和类型的规格定义手段。通过 JML 和其支持工具,不仅可以基于规格自动构造测试用例,并整合了 SMT Solver 等工具以静态方式来检查代码实现对规格的满足情况。

1.1 方法规格

  • JML 中的前置条件指的是在调用方法之前必须要满足的条件;

  • 后置条件指的是该方法返回时必须要满足的条件,即制定了该方法的指责;

  • 副作用范围限定指的是在执行过程中可能(允许)被修改的对象的属性数据或者类的静态成员变量。

1.2 类型规格

  • JML 中不变式 (invariant) 是要求在所以可见状态下都必须满足的特性,语法上定义 invariant P,其中 invariant 为关键词,P 为谓词;

  • 状态变化约束 (constraint) 是指对象的状态在变化时也需要满足的一些约束,这些约束在本质上也是一种不变式。

1.3 应用工具链

  • openJML

  • JMLUnitNG

二、 JMLUnitNG

我使用 JMLUnitNG 组件的流程如下:

  • 下载并安装 JMLUnitNG 组件

  • 使用 JMLUnitNG 生成测试类

  • IDEA 中运行测试类

我首先对一个简单的方法 Demo.java 进行了测试:

通过命令行输入 java -jar jmlunitng.jar Demo.java 生成测试类,然后在测试类目录下建立 project,直接在 IDEA 中运行 Demo_JML_Test 即可。

我生成的测试数据如下:

三、梳理架构设计,分析迭代中对架构的重构

第一次作业

完全按照官方接口建立。

其中 union 记录的是整个 container 中的不同的节点,每次 container 中的路径变化,更新一次 union

第二次作业

第二次作业将第一次中的 MyPathContainer 部分方法复制到 MyGraph 中,然后根据接口添加了新的方法,其他大致都没变。

第三次作业

第三次作业将第二次作业中的 MyGraph 中部分方法复制过去,然后根据接口添加了新的方法。

这一次作业比上一次添加了很多要求,且复杂度更高了,并且涉及到一些算法上的问题。

我使用的是讨论区大佬的不拆点的算法,用四个数组分别记录、完成四种功能,但其实都是基于最短路径的,只是每种功能中路径的权不同而已。每次更新 Path 时需要更新四个数组,且做四次floyd 。但因为常数较小,所以时间相对较短。

四、分析代码实现的bug和修复情况

第一次作业中,在 MyPath 中实现的 compare 方法中出现了一个小 bug,是我在遇到不相同的节点时,返回的是两值相减的值,这时没有考虑到可能会溢出。修复改为返回两值比较的布尔值。

第二次作业中吸取了第一次作业的教训,认真阅读规格,没有出现Bug。

第三次作业由于比前两次多了很多复杂的逻辑,而我的架构并不适于拓展,慌忙之下写出了一个较为严重的bug。在 containsEdge() 方法中,由于没有认真看规格,将两个同节点算作存在这条边,但实际不应该算作边;另外,在计算 least unpleasant value 时,我的方法需要在每个 path 内部另外计算 path 内节点的 least unpleasant value ,本来可以直接套用计算整个地铁系统的方法,我却另外想了一个更复杂的方法,既添了麻烦又出了错。已经修复为更简单的方法,即将路径权设为 unpleasant value ,然后跑 floyd

五、对规格撰写和理解上的心得体会

  • 对于一些较为复杂的方法,其规格的逻辑表达式很长,需要认真仔细地阅读,搞清楚前置条件和后置条件。

  • 规格只给出了需要实现的功能,而没有要求如何实现,所以仍需要考虑架构和算法上的设计。

OO第三次博客作业--第三单元总结的更多相关文章

  1. OO第四次博客作业--第四单元总结及课程总结

    一.总结第四单元两次作业的架构设计 1.1 第一次作业 类图如下: 为了突出类.接口.方法.属性.和参数之间的层次结构关系,我为 Class 和 Interface 和 Operation 分别建立了 ...

  2. [BUAA OO]第三次博客作业

    OO第三次博客作业 1. 规格化设计的发展 我认为,规格化设计主要源自于软件设计的两次危机.第一次是由于大量存在的goto语句,让当时被广泛应用的面向过程式的编程语言臃肿不堪,在逻辑性上与工程规模上鱼 ...

  3. OO第三次博客作业——规格

    OO第三次博客作业——规格 一.调研结果: 规格的历史: 引自博文链接:http://blog.sina.com.cn/s/blog_473d5bba010001x9.html 传统科学的特点是发现世 ...

  4. OO第四次博客作业!

    oo第四次博客作业 一.测试与正确性论证比较 测试只是单方面片面的证明对于当前的输入程序是正确的,测试只能证明程序有错误,不能说明程序是对的. 正确性论证是程序达到预期目的的一般性陈述,是通过规范化的 ...

  5. OO第4次博客作业

    OO第4次博客作业 一.第4单元设计 第四单元主要围绕UML图的结构进行JAVA代码编写,对JAVA的层次结构进行更多的认识.个人认为编程操作在实质上与上一章的PathContainer有许多的相同之 ...

  6. [2017BUAA软工]第三次博客作业:案例分析

    第三次博客作业:案例分析 1. 调研和评测 1.1 BUG及设计缺陷描述 主要测试博客园在手机端上的使用情况. [BUG 01] 不能后退到上一界面(IOS) 重现步骤:打开博客首页中任意博文,点击博 ...

  7. OO第二次博客作业(第二单元总结)

    在我开始写这次博客作业的时候,窗外响起了希望之花,由此联想到乘坐自己写的电梯FROM-3-TO--1下楼洗澡,然后······ 开个玩笑,这么辣鸡的电梯肯定不会投入实际使用的,何况只是一次作业.还是从 ...

  8. OO第四次博客作业(第四单元作业及期末总结)

    (注意:本文写作顺序与作业要求不完全一致,但涵盖了作业的所有要求) 一学期的BUAA特色OO课程结束了. PART 1  我想先写我这一学期的感想 从第一单元满怀期待地写完多项式求值到最后看着60分不 ...

  9. 第三周博客作业<西北师范大学|李晓婷>

    1.助教博客链接:https://www.cnblogs.com/lxt-/MyComments.html 2.学生作业打分要求:   https://www.cnblogs.com/nwnu-dai ...

随机推荐

  1. 1.深入TiDB:初见TiDB

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/584 本篇文章应该是我研究的 TiDB 的第一篇文章,主要是介绍整个 ...

  2. 将JAVA API接口 改写成 Python

    AsinSeedApi 不写注释的程序员-加密 将JAVA API接口 改写成 Python JAVA import com.alibaba.fastjson.JSON; import com.ali ...

  3. Java匿名内部类只可使用一次的理解

    匿名内部类只能使用一次,就不能在使用. 为了验证"只能使用一次"的实际含义,首先在程序中实例化了两个对象.并且在相应的类中加入了实现接口的匿名内部类: package com.An ...

  4. 计算机网络参考模型和5G模型的那些事

    一.分层思想 二.OSI参考模型 三.TCP/IP协议族 四.数据封装和解封装过程 五.层间通讯过程 六.3GPP规范及5G协议栈 一.分层思想 享用牛奶的人未必了解其生产过程 使用网络的人未必知道数 ...

  5. 基于python2.7 Tkinter 做一个小工具

    1.源码:先写一个界面出来,放需要放入的点击事件的函数 # -*- coding:utf-8 -*- import Tkinter from Tkinter import * import Excle ...

  6. 求1+2+…+n

    求 1+2+...+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 示例 1: 输入: n = 3 输出: 6 示例 2: ...

  7. 树莓派修改默认pi帐号亲测有效

    # 树莓派修改默认pi帐号亲测有效### 1.我的树莓派机型:3B+,系统:Raspbian桌面标准版,连接的屏幕:电视机..###2.打开树莓派LX终端,快捷键:Ctrl+Alt+t ###3.输入 ...

  8. requests入门大全

    02 requests接口测试-requests的安装 安装常见问题 提示连接不上,443问题 一般是因为浏览器设置了代理,关闭代理. 网络加载慢,设置国内镜像地址 1.pip安装 2.pycharm ...

  9. 牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11174/F 题目大意 给出\(n,k\)求 \[\sum_{i_1=1}^n\sum_{i_2=1}^n.. ...

  10. Idea生成JavaDoc文档

    什么是JavaDoc javadoc是Sun公司提供的一个技术 它从程序源代码中抽取类.方法.成员等注释形成一个和源代码配套的API帮助文档 实现方式 命令行方式 javadoc -encoding ...