oo第三次博客-JML规格

这三周的作业主要是围绕以JML来约束代码开发,以确保程序的正确性与鲁棒性。

Part 1:三次作业的实现与bug

第一次作业没有任何算法和数据结构上的难度,对于Path和PathContainer的各个方法的实现按照给出的规格复读即可。唯一的难点(大约也不算难点)便是将NodeId进行映射,用hashmap就好,不过注意不要做一个调包侠,hashmap中有的方法譬如遍历很慢,虽然看上去只差常数,但是这个常数巨大,如果在第一次作业中不加处理就会在第二次作业中TLE。

第一次作业也让我们了解了抛异常,我个人认为JML对于抛异常的处理是值得称道的,通过这样的约束可以控制程序在犯了一些明显的错误后及时停止而不是越错越远浪费计算资源,造成更严重的后果。

 

第二次作业是在第一次的基础上写一个Graph类,这个类继承PathContainer,将不同的Path汇总成一个图,并能够查询最短路。

对于第二次作业,首先要吐槽的是给出的接口,在需要继承的情况下应该声明为protect,才能更好地实现数据的继承,而给出的接口使用了private,给我们的选择便只有重新声明数据,每当使用的时候get一次以更新或者将第一次PathContainer的代码复制到Graph中,我为了偷懒选择了后者,结果第三次就只能靠疯狂压行来改正代码风格。

对于第二次图的实现,介于图中边权均为1,求最短路和是否连通均可以使用BFS。在BFS中将查找到的点均进行更新就好,这样,在询问两点是否连通或者他们的最短路时,可以先查找对应图中两点间值是否为初始值,若是则BFS查找更新,否则直接返回结果。同时只有当需要查找两点间最短路或者连通情况且Path有过remove或add且上一次Path改变后没有更新才更新图。

 

对于第三次作业,其实是在求带权最短路。这里再使用BFS就不太合适了。

对于连通块数量,可以使用并查集,也可以选择图中一个点开始BFS,终止后若没有遍历所有点则选择一个未遍历的点继续BFS,如此往复至图中所有点被搜索过即可。这两者后者更快。

对于三种不同的最短路,王嘉仪同学给出的关于图的数学性质是正确的,利用这个性质我们可以更简洁的完成最短路。

以最短花费为例,设边权为1,跨路径一次消耗2,则最终消耗=边数+2*换乘数-2,此时,对于同一路径内任意两点,我们先求出图内floyd最短路图,将其中的值全部加上2,再将这些图合并后使用迪杰斯特拉求出两点间最短路,得到的值减去2就是正确答案。注意求起点a到终点b的最小花费时,使用迪杰斯特拉算法更新的点答案均是正确的,所以若是询问的两点的最短路值不是初始值就可以直接输出了。其余几种最短路可以类推。

 

这三次作业只有最后一次有bug,我将最短路的图设置为了1000,没想到UnpleasentValue的最小值超过了1000.

关于这三次作业的不足,我觉得最大的问题在于继承复用上。因为接口里给出的类型是private,没有办法使用protected继承数据,导致继承时需要把所以数据使用时get一次,而我选择了偷懒的办法,直接将被继承的代码写入了新的代码中,这导致我第三次作业的Railway很长很丑。

Part 2:关于JML

 JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言。

JML能够用形式化语言来规范代码,提高代码可维护性。

JML以注释形式存在,每行以@开始,分为行注释(表示为//@......)和块注释(表示为/*@......@*/)。

JML有原子表达式,量化表达式,集合表达式等等,以及约束类型的类型规格和约束方法的方法规格。

原子表达式有\result和\old()两种,前者用来约束一个方法的返回值,后者用来表示括号内内容在方法执行前的内容。

量化表达式有forall,\exists和\sum,forall表示某范围内的元素均应满足某条件,为全称量词,相应的\exists为存在量词,而\sum返回的是给定范围内表达式的和。

集合表达式则构造一个容器,明确其包含的元素。

操作符包含子类型操作符<,等价操作符<==>,不等价操作符<=!=>,推理操作符==>,上述操作符均返回bool型值。

对于方法规格,我们通过requires语句约束前置条件,通过ensures语句约束后置条件,同时JML也给出了副作用、异常的约束,通过saaignable和modifiable来约束副作用,并利用signals来抛异常。

对于类型规格,主要利用不变式invariant P来进行约束。

部署JML UnitNG/JML Unit

安装后,编写测试样例如下:

测试结果如下:

关于JML的使用,我个人感觉它只应该是一种严格的约束。事实上,我们的代码和JML都是形式化语言,而我们使用JML是为了自然语言表述不清导致代码bug。

我认为,规格应该是宏观的,整体的,针对于方法的输入输出形式,而不应该是对于代码实现的全盘描述,若是后者,那写代码岂不成为了对于规格的翻译?那我们为什么不直接写规格?规格应该是规范而不涉及具体的内部实现。

举个例子,形式化的规格语言可以作为伪代码来描述算法,我们利用这种形式化的语言来详尽的描述算法,在用java语法来翻译规格语言,这显然是在做重复无谓的工作。

在这几次作业中,尤其是最后一次作业,我们可以发现,新增的方法具有大量的规格,不少同学都吐槽过这个规格又臭又长,而我发现这些又臭又长的规格真正有用的部分是在于对于输入输出数据合法性判断以及抛异常的部分,剩下的部分其实是在表达算法思想,而我认为描述算法不应该是规格应该做的。

转载于:https://www.cnblogs.com/lzyckd1/p/10906394.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kinect开发笔记之一Kinect详细介绍

毕业设计的课题我选择了结合Kinect和Unity3D开发体感游戏&#xff0c;这是我十分感兴趣的一个课题&#xff0c;所以做好当然责无旁贷。准备再写一系列Kinect的学习笔记&#xff0c;记录自己毕设一步一个脚印的历程。1、Kinect背景介绍众所周知&#xff0c;Kinect是一款集成了很…

获取2个地址之间的距离(高德API)

2019独角兽企业重金招聘Python工程师标准>>> string startLonLat SiteHelper.GetLonLat("大连"); //获取起始地经度纬度 string endLonLat SiteHelper.GetLonLat("沈阳"); //获取目的地经度纬度 int distance SiteHelper.GetDistance(star…

WPF属性学习

一.WPF属性系统 CLR属性 .NET中的属性称为CLR属性 转载于:https://www.cnblogs.com/programme-maker/p/10910166.html

Unity3D学习笔记之六创建更多的Prefab

在写完第五篇后&#xff0c;因为不知名的原因&#xff0c;我突然不能够上传100KB以上的图片在博客中了。等了几天还是这样&#xff0c;所以我用PS把图片的分辨率一张张调低&#xff0c;让图片的大小都在100左右&#xff0c;将积攒了四篇的学习笔记一起发上来&#xff0c;也算弥…

四、构建Node Web程序

---恢复内容开始--- 一、HTTP 服务器的基础知识 1、Node如何向开发者呈现HTTP请求 2、一个用“Hello World”做响应的HTTP服务器 它用了默 认的状态码200&#xff08;表明成功&#xff09;和默认的响应头 3、读取请求头及设定响应头 Node提供了几个修改HTTP响应头的方法&#x…

datagrid 什么时候结束编辑_2020年中考结束后,什么时候出分?什么时候报志愿?...

导语7月19日下午16:00&#xff0c;2020年北京中考正式落下帷幕。考试结束后&#xff0c;很多家长和考生都会长舒一口气&#xff0c;但北京中考在线团队提醒你&#xff0c;现在还不是放松的时刻&#xff0c;中考结束后&#xff0c;还有成绩查询和填报志愿等重要事件等着你。那么…

Unity3D学习笔记之七创建自己的游戏场景

到现在为止我们已经拥有了比较完备的Prefab&#xff0c;已经可以创建宏大的游戏场景&#xff0c;并以第一人称视角在场景中漫游了。这里给大家做个小的示范&#xff0c;建一个小场景大家在创建场景的时候需要自由发挥&#xff0c;做个尽量大的场景出来。这一系列教程以及素材均…

excel if in函数_【Excel函数】Small+Index+IF 一对N返回

通常情况下&#xff0c;Vlookup和lookup函数只能返回满足条件的第一个&#xff0c;剩余的都不会返回。 这也是其函数的一个弊端之一。 若是按照条件&#xff0c;返回所有满足条件的数据&#xff08;1->N&#xff09;的&#xff0c;可是适用组合函数。 Index返回位置&#xf…

Unity3D学习笔记之八为场景添加细节(一)

这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程《Unity游戏引擎的基础入门视频教程》&#xff0c;下载链接附在第二篇学习笔记中。我花了30分钟做了一个中等大小的迷宫场景&#xff0c;不知道大家自己发挥&#xff0c;做的场景大小如何。在完成场景之后&#xff0c…

哪个app最费电_微波炉和烤箱,买哪个划算?

微波炉和烤箱不能说买哪个划算&#xff0c;而是看哪个更适合&#xff1f;我家微波炉和烤箱两个都有&#xff0c;所以这个问题我来回答一下。虽然外形上看起来&#xff0c;微波炉和烤箱似乎没有多大的区别&#xff0c;从功能上看&#xff0c;它们也都是加热&#xff0c;但它们侧…

Unity3D学习笔记之九为场景添加细节(二)

上节为场景中添加了第一块带有碰撞器的石头&#xff0c;本节我们来利用Prefab&#xff0c;将场景细节都添加进去&#xff0c;并且做的更完善。这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程《Unity游戏引擎的基础入门视频教程》&#xff0c;下载链接附在第二篇学习…

wifi名称可以有空格吗_收购公司后可以变更公司名称吗,变更公司名称和股权如何处理?...

【点击文末小程序&#xff0c;免费咨询法律问题】公司收购是指二手设备收购&#xff0c;指向目标公司的二手设备&#xff0c;废旧物资&#xff0c;进而获取目标公司的全部或部分业务&#xff0c;取得对拆除的控制权。那么&#xff0c;收购公司后可以变更公司名称吗&#xff0c;…

震惊的网站,都是干货

分享15个鲜为人知的的小众网站&#xff0c;每一个可以让你打开新世界的大门&#xff0c;让你震惊。 1&#xff1a;仿知网 https://www.cn-ki.net/ 仿知网是一个完全可以代替知网的精品网站&#xff1b;是一个非常强大的论文搜索网站。 首先这个网站的论文检索结果和知网的搜索结…

怎样制作滴滴截图_滴滴老了吗?

作者 / 薛静 来源 / 盒饭财经(ID&#xff1a;daxiongfan)滴滴最近有点忙。6月11日&#xff0c;滴滴地图与公交事业部负责人柴华还在忙于解答消费者对于滴滴司机绕路的质疑&#xff0c;网上就流传出了滴滴司机直播性侵的消息。当晚&#xff0c;滴滴急忙在官方微博中做出回应称已…

Kinect开发笔记之三Kinect开发环境配置详解

0、前言&#xff1a;首先说一下我的开发环境&#xff0c;Visual Studio是2013的&#xff0c;系统是win8的64位版本&#xff0c;SDK是Kinect for windows SDK 1.8版本。虽然前一篇博文费了半天劲&#xff0c;翻译了2.0SDK的新特性&#xff0c;但我还是决定要回退一个版本。其实我…

opencv python 图像缩放/图像平移/图像旋转/仿射变换/透视变换

Geometric Transformations of Images 1图像转换 OpenCV提供了两个转换函数cv2.warpAffine和cv2.warpPerspective&#xff0c;可以使用它们进行各种转换。 cv2.warpAffine采用2x3变换矩阵&#xff0c;而cv2.warpPerspective采用3x3变换矩阵作为输入。 2图像缩放 缩放只是调整图…

.net调用c++方法时如何释放c++中分配的内存_C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)...

一、C语言程序的构成与C、Java相比&#xff0c;C语言其实很简单&#xff0c;但却非常重要。因为它是C、Java的基础。不把C语言基础打扎实&#xff0c;很难成为程序员高手。1、C语言的结构先通过一个简单的例子&#xff0c;把C语言的基础打牢。C语言的结构要掌握以下几点&#x…

Kinect开发笔记之四检测并调试Kinect设备

之前我们已经装好了Developer Toolkit 1.8&#xff0c;下面我们来做进一步的测试。首先到开始菜单中找到Kinect for Windows SDK v1.8&#xff0c;点击其中的Developer Toolkit Browser v1.8.0。打开后&#xff0c;有许多东西&#xff0c;我们选择最右边的Tools来筛选一下&…

mysql 开发基础系列22 SQL Model(带迁移事项)

一.概述 与其它数据库不同&#xff0c;mysql 可以运行不同的sql model 下&#xff0c; sql model 定义了mysql应用支持的sql语法&#xff0c;数据校验等&#xff0c;这样更容易在不同的环境中使用mysql。 sql model 常用来解决下面几类问题&#xff1a; (1) 通过设置sql mode, …

Kinect开发笔记之五使用PowerShell控制Kinect

这是第一次用MarkDown编辑器来写博客&#xff0c;挺喜欢这种没有任何格式舒服的编辑器&#xff0c;自由洒脱更加易读&#xff0c;留一个不自然的自然段纪念下找到舒服的编辑器。 这次要记录使用win7/win8内建的PowerShell来控制Kinect&#xff0c;改变Kinect的俯仰角度。 在我…