OO第三单元

JML语言理论基础,应用工具链


JML语言基础

  • JML简介

    定义: JML 是一种形式化的、 面向 JAVA 的行为接口规格语言

    作用:

    1. 开展规格化设计。这样交给代码实现人员的将不是可能带有内在模糊性的自然语言描述,而是逻辑严格的规格。
    2. 针对已有的代码实现,书写其对应的规格,从而提高代码的可维护性。这在遗留代码的维护方面具有特别重要的意义。
  • 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第三单元的更多相关文章

  1. OO第三单元作业总结

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

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

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

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

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

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

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

  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时间的限制,还考察了大量优化策略及数据结构中关于图的知识,是一次非常注重细节 ...

  10. OO第三单元作业(JML)总结

    OO第三单元作业(JML)总结 目录 OO第三单元作业(JML)总结 JML语言知识梳理 使用jml的目的 jml注释结构 jml表达式 方法规格 类型规格 SMT Solver 部署JMLUnitN ...

随机推荐

  1. ubantu下载源详细目录

    都说ubantu系统自带的下载源不给力,一般使用时体现不出来,也没有必要更换.我是在安装gnuradio时,安装了好久,没安装上,后来就去更改下载源(后来发现不是下载源的问题),不过还不错,最起码最下 ...

  2. VueJS学习资料大全

    参考:http://www.worktle.com/articles/2467/ 文档&社区 Vue.js官方网站(中文) :http://cn.vuejs.org/ Vue论坛:http:/ ...

  3. DataGridView高度自动调整

    AutoResizeGrid.cs代码 /// <summary> /// 根据行数据,自动调整DataGridView高度 /// </summary> public sea ...

  4. CommonsCollections2 反序列化利用链分析

    在 ysoserial中 commons-collections2 是用的 PriorityQueue reaObject 作为反序列化的入口 那么就来看一下 java.util.PriorityQu ...

  5. go 1.14上怎么下载第三方包

    终端 go env -w GO111MODULE=on GOPATH-->src/pkg/bin in src源码包中 某个包中 go mod init   XXX(表示当前报的第三方依赖) 然 ...

  6. 缩减Centos7xfs磁盘空间

    问题描述:df -h查看 root目录仅有20G空间,其余300G空间全在home目录下.xfs不可以直接缩减,所以只能删除xfs盘然后重新添加. 解决办法: 1. 注释想要删除的磁盘,此处以cent ...

  7. js 之k个一组翻转链表

    题目描述 将给出的链表中的节点每\ k k 个一组翻转,返回翻转后的链表如果链表中的节点数不是\ k k 的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身.要求空间复杂度 \ O ...

  8. PHP中的强制类型转换

    学过静态语言开发的朋友对类型转换不会陌生,比如Java.C#.C++等.静态语言的好处就是变量强制必须指定类型,这也是编译的要求,所以大部分编译型的语言都会有强制变量类型的要求.而PHP据说也会在PH ...

  9. 关于PHP的方法参数类型约束

    在之前的文章PHP方法参数的那点事儿中,我们讲过关于PHP方法参数的一些小技巧.今天,我们带来的是更加深入的研究一下PHP中方法的参数类型. 在PHP5之后,PHP正式引入了方法参数类型约束.也就是如 ...

  10. discuz连接微博登陆,第三方登录

    首先记一下discuz的ucenter的架构: ucenter 是用户中心.其他的应用都是和ucenter连接,包括discuz也是ucenter的一个应用(默认的); 第一步: 在ucenter新建 ...