OO第三单元小结

一.JML语言理论基础及工具链梳理

  在本单元我们学习了JML语言的一些基础知识,能够让我们看懂简单的JML规格并写出对应代码,

   主要用到的知识点有:

    1.requires 该子句定义了方法的前置条件

    2.\old(exp),表示执行相应方法前表达式exp的取值

    3.assignable子句,列出方法修改的类成员属性。

    4.ensure子句,定义了后置条件,如返回的结果或者该方法运行后的逻辑结果等等

    5.\result表达式,表示方法返回的逻辑上的正确的结果

    主要用的工具有:

    Openjml,junit等,主要作用是测试jml的正确性以及代码实现的正确性。

二.JUNIT的使用

import com.oocourse.specs1.models.Path;
import com.oocourse.specs1.models.PathContainer;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; public class MyPathContainerTest {
private final PathContainer pathContainer = new MyPathContainer();
private Path path1, path2, path3; @Before
public void before() {
path1 = new MyPath(1, 2, 3, 4);
path2 = new MyPath(1, 2, 3, 4);
path3 = new MyPath(1, 2, 3, 4, 5);
} @After
public void after() {
// do something here
} @Test
public void testAddPath() throws Exception {
Assert.assertEquals(1, pathContainer.addPath(path1), 1);
Assert.assertTrue(pathContainer.containsPathId(1));
Assert.assertEquals(path1, pathContainer.getPathById(1));
Assert.assertEquals(1, pathContainer.size()); Assert.assertEquals(1, pathContainer.addPath(path2));
Assert.assertTrue(pathContainer.containsPathId(1));
Assert.assertEquals(path2, pathContainer.getPathById(1));
Assert.assertEquals(1, pathContainer.size()); Assert.assertEquals(2, pathContainer.addPath(path3));
Assert.assertTrue(pathContainer.containsPathId(2));
Assert.assertEquals(path3, pathContainer.getPathById(2));
Assert.assertEquals(2, pathContainer.size()); }
}

  这一段测试代码简单地测试了addPath的基本功能,测试结果符合预期。

三.架构梳理

第一次作业: 

第一次作业中简单的使用了一个由id到PATH,一个由PATH到id的Hashmap来存储PATH,

又使用了另一个由id到出现次数的hashmap来统计不同的点个数。

第二次作业:

第二次作业中创建了一个Node类来存储有关节点的相关信息,又建立了一个类来存储

dijistra算法的实现,类方法的主要实现依托于将大数转化成小数,并且利用数组来

存储node。

第三次作业:

第三次作业中四种不同的需求其实都可以抽象成求一个图中的最短距离,唯一不同的

只是每种需求对应的图不一样,因此此次作业中使用了一个Map类来存储这4个不一样

的图,并且对每个图应用dijistra算法即可得到答案。

四.bug分析

第一次作业中没有出现bug。

第二次作业在删除点的邻接点时出现了逻辑错误,修复逻辑即成功。

第三次作业中没有出现bug。

五.总结

  在本单元的学习中,在jml的学习这一部分,入门的难度其实不是很高,因为只要

细细研读了学习手册,对于基本的jml用法就都能够掌握。看懂jml是没有问题的,但是

如果说要让我们自己去写一段jml规格,那难度就不小了,首先是对于它的一些语法书写

很生疏,其次是我们很难去保证我们书写的正确性。

  但幸好本单元的作业还是基于jml写代码,那么就没有给我们带来太多的书写jml的

困扰。总而言之,jml语言设计出来对代码的书写者是比较友好的,但是由于我们的学习中

对jml没有一套完整的学习流程,因此它对于我们初学者又非常的不友好。但最重要的其实

也不是对jml的学习,而是学习它规范代码的思维。

  相信jml的学习体系会越来越好。

  

oo第三单元学习总结的更多相关文章

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

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

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

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

  3. OO第三单元作业总结

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

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

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

  5. OO第三单元——基于JML的社交网络总结

    OO第三单元--基于JML的社交网络总结 一.JML知识梳理 1)JML的语言基础以及基本语法 JML是用于java程序进行规格化设计的一种表示语言,是一种行为接口规格语言.其为严格的程序设计提供了一 ...

  6. OO第三单元作业——魔教规格

    OO第三单元作业--魔教规格 JML的理论基础和相关工具   JML(Java Modeling Language,Java建模语言),在Java代码种增加了一些符号,这些符号用来标志一个方法是干什么 ...

  7. OO第三单元个人总结

    OO第三单元个人总结 JML理论与基础与应用工具链 JML是什么? Java建模语言(JML)是一种行为接口规范语言,可用于指定Java模块的行为 .它结合了Eiffel的契约设计方法 和Larch ...

  8. 2020 OO 第三单元总结 JML语言

    title: 2020 OO 第三单元总结 date: 2020-05-21 10:10:06 tags: OO categories: 学习 第三单元终于结束了,这是我目前为止最惨的一单元,第十次作 ...

  9. 2020北航OO第三单元总结

    2020北航OO第三单元总结 本单元要求是根据JML规格完善代码,初看是一个简单的代码照搬实现的东西,但最后才发现由于CPU时间的限制,还考察了大量优化策略及数据结构中关于图的知识,是一次非常注重细节 ...

随机推荐

  1. Cython 模块扩展 - 编程语言 替代实现 应用领域 汇总一览

    Python 本身只是一种编程语言规范,可以使用其它编程语言实现它或扩展它:譬如:采有 Python C Java .Net 等重实现 Python,而采用 Python C/C++ C# Java ...

  2. Toast控件

    ------------恢复内容开始------------ 四种常见的App弹窗设计:Toast.Dialog.Actionbar 和 Snackbar 弹窗又称为对话框,是App与用户进行交互的常 ...

  3. project read error(项目读取错误)

    maven的pom文件出现project read error 1,打开电脑cmd操作界面,在cmd界面找到打开出错项目的文件夹; 比如我的项目文件夹在D:\>eclipse-jee-file\ ...

  4. TP生成二维码插件

    安装 composer require endroid/qrcode 使用: use Endroid\QrCode\QrCode 然后 这个类库要改一下 在路径:你的项目路径\vendor\endro ...

  5. lua文件修改为二进制文件

    注意:lua编译跟luajit编译的二进制文件是不兼容,不能运行的 如果是使用luajit,请直接使用luajit直接编译二进制 第一种:luajit编译(以openresty为例,跟luac是相反的 ...

  6. 定要过python二级 第一套

    1.和强类型语言相对应的是弱类型语言,Python.JavaScript.PHP 等脚本语言一般都是弱类型的.弱类型语言有两个特点: 变量无须声明就可以直接赋值,对一个不存在的变量赋值就相当于定义了一 ...

  7. Jmeter 压力测试学习8--断言

    断言成功是不会显示的,失败会有提示. 登录断言 一.添加断言 登录->添加->断言->响应断言 二.执行,查看断言 登录配置的都是正确的用户名跟密码 如果响应断言中内容改为:&quo ...

  8. 十一、Abp vNext 基础篇丨测试

    前言 祝大家国庆快乐,本来想国庆之前更新完的,结果没写完,今天把剩下的代码补了一下总算ok了. 本章节也是我们后端日常开发中最重要的一步就是测试,我们经常听到的单元测试.集成测试.UI测试.系统测试, ...

  9. JVM学习笔记——类加载器与类加载过程

    类加载器与类加载过程 类加载器ClassLoader 类加载器 ClassLoader 用于把 class 文件装载进内存. 启动类加载器(Bootstrap ClassLoader): 这个类加载使 ...

  10. 从源码解析Electron的安装为什么这么慢

    前言 Electron作为一款跨平台的桌面应用端解决方案已经风靡全球.作为开发者,我们几乎不用关心与操作系统的交互,直接通过Web前端技术与Electron提供的API就可以完成桌面应用端的开发. 然 ...