OO第三单元
OO第三单元
JML语言理论基础,应用工具链
JML语言基础
JML简介
定义:
JML 是一种形式化的、 面向 JAVA 的行为接口规格语言
作用:
- 开展规格化设计。这样交给代码实现人员的将不是可能带有内在模糊性的自然语言描述,而是逻辑严格的规格。
- 针对已有的代码实现,书写其对应的规格,从而提高代码的可维护性。这在遗留代码的维护方面具有特别重要的意义。
JML语言语法相关
- 表达式
\result
:方法执行后的返回值\old(expr)
: 表示一个表达式expr
在相应方法执行前的取值\not_assigned(x,y)
表示括号中的变量是否在方法执行过程中被赋值\forall
全称量词修饰的表达式\exist
存在量词修饰的表达式\sum
返回给定范围内的表达式的和
- 操作符
E1<:E2
:判断类型E1是不是类型E2的子类型b_expr1<==>b_expr2
: 等价关系操作符b_expr1==>b_expr2
:推理操作符\nothing
空集\everything
全集
- 方法规格
- 前置条件:
requires
- 后置条件:
ensures
- 副作用范围限定
assignable
或者modifiable
- 前置条件:
- 异常
- 正常情况:
public normal_behavior
also
关键字- 异常情况:
public exceptional_behavior
- 正常情况:
- 类型规格
invariant
不变式constraint
状态变化约束
- 表达式
JML工具链
openjml
,可以编译含有JML的代码,同时内置SMT Solver,可以实现静态检查JMLUnitNG/JMLUnit
,可以根据JML自动生成测试文件.
部署JMLUnitNG
- 整个部署过程可以用非常痛苦来形容,主要是对命令行不太熟悉,导致出现了很多莫名其妙的错误,,又不知道该怎么处理,最后只是用了一个简单的类来测试一下JmlUnitNG的功能
- 实验结果如图所示(流出了眼泪)
架构分析
第一单元
- uml类图
总体的思想是维护两个MAP,,
map<path,pid>
,map<pid,path>
,分别以路径和路径id作为key
采用静态的方法维护
distinct_node
,即每次更新路径(增删),的时候更新 节点数量因为代码量比较少,也不适合再添加额外的类,所以整体只有三个类
第二单元
- uml类图
- 这次的重点是计算最短路径,为此我们有两种方法,一个是dij算法,一个是floyd算法,考虑到我们需要算出任意两点间的最短路径,所以多源的floyd算法更合适一些,且最为重要的是floyd算法只有5行,实现起来非常简单,不容易出错,所以本次作业采用的也正是floyd算法
- 整体的思想还是和上次一样,采用静态的方式存储任意两点间的最短路径,在进行图更改(增删路径)的操作之后,用floyd算法更新最短路径.
- 在代码层面,我们分析一下,在上一次的基础上需要增加哪些内容,首先是增删路径的时候,对图的邻接矩阵进行刷新,然后对邻接矩阵经过floyd算出最短路径矩阵
- 所以最好的方式当然是继承上一次的Pathcontainer类,然后增加刷新邻接矩阵,刷新最短路径矩阵的方法即可,但是笔者当时比较懒也比较忙,所以就还是三个类包干,这样造成的后果就是,整体的结构显得不是非常清晰
第三单元
- uml类图
- 这次的难度有了史诗级的提升,笔者关于如何处理换乘问题思考了非常久,结果想出的方案要么性能很差,要么实现细节太过繁琐非常容易出错,最后幸亏得同学指点,采用了这样一个算法.
- 将每条路径上的任意两点进行链接,这样每多一条边就代表换乘一次,对于每个路径采用floyd算出一个路径的距离矩阵,每次增加一个路径,就将这个路径的距离矩阵加入我们已经创建好的最短路径矩阵(票价,换乘或者不满意度),(如果比最短路径矩阵的值要小,就替换),对于每次删除操作,重新遍历,之前的每条路径进行上述操作.
- 在代码架构方面,采用类似于观察者的模式,首先我们的地铁类要继承上次的MyGraph类,新增一个专门用来计算路径联通块的类Block,然后,新增一个PathGraph类和一个PathValueGraph类,专门用来计算得到一个路径的距离矩阵和value矩阵,接着,每次增删,我们更新最少票价矩阵,更新最少换乘矩阵,更新最低不满意度矩阵,更新联通块矩阵,注意为了方便更新操作和获取矩阵,所以我构建了一个资源池,各种最短路径矩阵,连通块数等我们都放在资源池中.资源池内有更新的方法.查询操作均放在地铁类中进行.
bug分析
- 第一次的实现比较简单基本上也不会出现什么bug
- 第二次出现了一个bug,是因为我有一个异常的情况没有考虑到,这里深刻体会到了在使用一个变量的时候一定要首先判断它1是否合法
- 第三次作业翻车了,主要是前面思考了很多方案,采用多个方案对代码进行了重构,导致之后的测试的时间基本不够,所以导致产生了一个非常重大的bug,就是我在每次删除路径,之后重建图的时候并没有对图先进行初始化
心得体会
- 第一次作业的时候,我还是非常仔细的研究了规格的,但是之后的过程随着方法功能的复杂度几何式提升,规格变得越来越复杂越来越难懂,参考的意义也是基本没有,所以在后来的两次作业,我只是参考了一些简单的方法的规格,以及一些异常条件,先决条件等.规格基本成了形式化的东西,后来也没怎么用到.
- 最大的收获就是学会了很多自动化测试的手段比如JUnit真的好用,然后顺便复习了一下数据结构的知识???,还有就是初步意识到了一个良好的架构和清晰简单的算法是多么重要,(这里指的算法是整个问题的解决方案,不是floyd之类的),一个好的方案可以使你的架构变得清晰简单,整体逻辑也非常简明.还有就是我使用了一些设计模式上的方法来帮助完善自己的架构,也初步尝到了设计模式的好处.
OO第三单元的更多相关文章
- OO第三单元作业总结
OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...
- 规格化设计——OO第三单元总结
规格化设计--OO第三单元总结 一.JML语言理论基础.应用工具链 1.1 JML语言 JML(java modeling language)是一种描述代码行为的语言,包括前置条件.副作用等等.J ...
- 【OO学习】OO第三单元作业总结
[OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...
- OO第三单元(地铁,JML)单元总结
OO第三单元(地铁,JML)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉并了解JML来是我们具有规格化编程架构的思想.这个单元的主题一开始并不明了,从第一次作业的路径到第二次 ...
- OO第三单元——基于JML的社交网络总结
OO第三单元--基于JML的社交网络总结 一.JML知识梳理 1)JML的语言基础以及基本语法 JML是用于java程序进行规格化设计的一种表示语言,是一种行为接口规格语言.其为严格的程序设计提供了一 ...
- OO第三单元作业——魔教规格
OO第三单元作业--魔教规格 JML的理论基础和相关工具 JML(Java Modeling Language,Java建模语言),在Java代码种增加了一些符号,这些符号用来标志一个方法是干什么 ...
- OO第三单元个人总结
OO第三单元个人总结 JML理论与基础与应用工具链 JML是什么? Java建模语言(JML)是一种行为接口规范语言,可用于指定Java模块的行为 .它结合了Eiffel的契约设计方法 和Larch ...
- 2020 OO 第三单元总结 JML语言
title: 2020 OO 第三单元总结 date: 2020-05-21 10:10:06 tags: OO categories: 学习 第三单元终于结束了,这是我目前为止最惨的一单元,第十次作 ...
- 2020北航OO第三单元总结
2020北航OO第三单元总结 本单元要求是根据JML规格完善代码,初看是一个简单的代码照搬实现的东西,但最后才发现由于CPU时间的限制,还考察了大量优化策略及数据结构中关于图的知识,是一次非常注重细节 ...
- OO第三单元作业(JML)总结
OO第三单元作业(JML)总结 目录 OO第三单元作业(JML)总结 JML语言知识梳理 使用jml的目的 jml注释结构 jml表达式 方法规格 类型规格 SMT Solver 部署JMLUnitN ...
随机推荐
- 解析Prometheus PromQL
解析PromQL 目前对Prometheus 的promQL 的解析文章比较少,且Prometheus官方也没有提供一个公共的库来对齐进行解析.下面实现对promQL的解析,并实现注入label功能. ...
- Docker修改容器中的时间
Docker修改容器中的时间 前言 在公司开发时使用 Docker 创建数据库(SQL Server)的实例十分方便,还原数据库也只要设置好共享文件夹,在 SQL Server Management ...
- c++ if语句讲解&例题
一.if语句 1.基本语法: if(条件 布尔型){ 当条件符合执行的语句 } 2.例子: #include <iostream> using namespace std; int mai ...
- Java定时任务Quartz
第一步:pom文件中添加依赖包 第二步:创建xml文件,名称为:spring-scheduler 路径如下图: 第三步:spring-scheduler配置详情 <!--创建任务--> & ...
- java web 项目中web.xml 详解
web.xml详述: web.xml 是每个Java web 项目的必备文件,又叫做部署描述符,Servlet规范中定义的,是web应用的配置文件. 概念: .部署描述符文件就像所有XML文件一样,必 ...
- Docker入门系列之二:Docker术语
原文作者:Jeff Hale 原文地址:https://towardsdatascience.com/learn-enough-docker-to-be-useful-1c40ea269fa8 翻译: ...
- PHP中的输出缓冲控制
在 PHP 中,我们直接进行 echo . 或者 print_r 的时候,输出的内容就会直接打印出来.但是,在某些情况下,我们并不想直接打印,这个时候就可以使用输出缓冲控制来进行输出打印的控制.当然, ...
- ecshop增加调用字段问题汇总
一.ecshop文章列表页调用缩略图.网页描述等 打开includes/lib_article.php文件,大约在69行 添加 $arr[$article_id]['description'] = $ ...
- PHP 相对路径转换为绝对路径 realpath
* 相对路径 -> 绝对路径 realpath <?php /** * @param string $in_rel: relative directory * @param string ...
- Java线程类
基础知识 线程状态 根据Thread.State类中的描述,Java中线程有六种状态:NEW,RUNNABLE,WAITING,TERMINATED,BLOCKED. 就绪状态(NEW):当线程对象调 ...