OO Unit3 总结

OO课Unit3人际关系网JML应用技术回顾

BUAA.1823.邓新宇

2020/5/23

梳理JML语言的理论基础、应用工具链情况

方法规格

JML中,同一个方法在不同的条件下会产生不同的行为,这种行为分为正常行为和异常行为,分别用单成一行的public normal_behaviorpublic exceptional_behavior作为该行为的描述的声明放在行为描述的最开始,不同的行为之间用also连接。一个方法的描述中可以有多个不同的行为类,而不同的行为类的前置条件应当互斥,并且子类的行为描述不应当与父类有冲突。

在每一个行为类中,有该行为类的前置条件、后置条件、副作用,分别用行前的requiresensuresassignable/modifiable表示,分别表示传入参数的要求、方法完成后应当满足的条件、方法可能对其它部分产生的影响。每一个行为类中可以有多个前置条件、后置条件、副作用。

在行为的形式化描述的时候,通常需要进行全部存在求和的描述,分别用\forall\exists\sum语句来完成,它们的格式分别为:

\forall 类型 临时变量; 前提的条件(通常为取值范围); 约束条件

这表示每一个该符合前提条件的变量都需要满足指定的约束条件,即

\[\forall i, i满足前提条件 \rarr i满足约束条件
\]
\exists 类型 临时变量; 前提的条件(通常为取值范围); 约束条件

这表示存在一个该符合前提条件的变量可以需要满足指定的约束条件,即

\[\exists i, i满足前提条件 \rarr i满足约束条件
\]
\exists 类型 临时变量; 前提的条件(通常为取值范围); 加和数值

这表示每一个该符合前提条件的变量,按照加和数值规则进行求和,即

count = 0
for value in 前提条件:
count += 加和数值
return count

在异常行为描述的过程中,通常需要描述异常的抛出,这需要通过signals语句来完成,其格式为:

signals (异常名称 e) 抛出条件

这表示在抛出条件成立时,抛出异常名称指定的异常

类型规格

类规格主要有不变式和状态变化约束,分别用行前的invariantconstraint表示,它们都可以加上static修饰符来表示针对静态属性的约束。

不变式是该类始终满足的条件,而状态变化约束更像是每一个方法的后置条件的提取,后者相当于在每个方法的后置条件增加该语句。

部署JMLUnitNG/JMLUnit,针对Group接口的实现自动生成测试用例,并结合规格对生成的测试用例和数据进行简要分析

一堆莫名其妙的bug,后面再补。

按照作业梳理自己的架构设计,特别分析自己的模型构建策略

由于作业主要是按照给定的Interface中的JML约束进行完成即可,所以整体架构并没有太多的设计过程。

Person功能添加

Person的接口定义中,字段acquaintance是没有访问器的,而NetWork又需要大量的与此相关的查询工作和修改工作。为了保持Person的封装性,我没有选择为Person添加访问器,因为针对acquaintance其实只有几种工作,一是为某个Person添加一个新的acquaintance,其它的都是各种查询,其实没必要直接让外部自由修改acquaintance,只需要Person提供这些查询即可。所以在设计时,为Person添加了isCircle、queryStrongLinked、queryMinPath三个查询方法,来实际执行NetWork的同名查询,为Person添加了link方法来添加一个新的acquaintance。

查询方案

查询有两种简单方案:

  1. 在每次查询的时候都重新计算结果;
  2. 在每次可能导致查询结果发生变化的时候重新计算结果;

前者会降低查询的效率,而后者会降低每次更改的效率。前者在状态改变少、查询次数多的时候效率低下,后者在状态改变多、查询次数少的时候效率低下。

为了使二者互补,我才用了如下较复杂的方案:

        在状态发生改变的时候进行标记,每次查询的时候检查标记,如果标记有效则重新计算、保存并返回查询结果,然后复位标记,否则直接返回保存的结果

这样在面对各种情况下都有比较好的效率。

按照作业分析代码实现的bug和修复情况

本次作业的bug主要分两类:

  1. 在上文查询方案优化中,对于“状态发生改变”的情况考虑不全,比如Group只在添加新的成员时才置位标记,但实际上对Group成员进行新的acquaintance添加时,Group的部分查询结果也会发生改变,所以后来为每个Person记录了其所在的Group,每次添加acquaintance后通知那些Group进行相应的标记置位;
  2. 图的查询算法实现出现bug,主要原因就是菜,对于复杂算法了解不够,自己瞎想的算法一方面有漏洞一方面效率低下。

阐述对规格撰写和理解上的心得体会

按照JML进行实现,先把握住会导致不同行为的前置条件,先利用这些前置条件把各个行为分开,然后再在各类行为之中进行实现。

虽然这次算法的复杂度并没有要求很低,但是要求算法的正确性要求很高,在现有理论十分丰富的当下,实在没必要自己去瞎发明轮子,这是一个教训,应该好好学习别人已经分享的解决方案,复用已经被证明过的轮子。

OO Unit3 总结的更多相关文章

  1. JML规格编程系列——OO Unit3分析和总结

    本文是BUAA OO课程Unit3在课程讲授.三次作业完成.自测和互测时发现的问题,以及倾听别人的思路分享所引起个人的一些思考的总结性博客.主要包含JML相关梳理.SMT Solver验证.JML单元 ...

  2. OO unit3 summary

    Unit3 ​ JML(Java Modeling Language) 是用于对 Java 程序进行规格化设计的一种表示语言,它对于方法内部具体是如何实现的并无要求,只是对方法的接口以及行为进行限制, ...

  3. OO第四单元总结暨期末总结

    OO第四单元总结暨期末总结 目录 OO第四单元总结暨期末总结 第四单元三次作业架构与迭代 整体感受 HW1 HW2 HW3 四个单元架构设计与方法演进 Unit1 Unit2 Unit3 Unit4 ...

  4. GLUT的简洁OO封装

    毕业设计用到了OpenGL,由于不会用MFC和Win32API做窗口程序:自然选用了GLUT.GLUT很好用,就是每次写一堆Init,注册callback,觉得有点恶心,于是对他做了简单的OO封装.记 ...

  5. Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结

    Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结 1. Sql语言应该得到更大的范围的应用,1 1.1. 在小型系统项目中,很适合存储过程写业务逻辑2 1.2. 大型 ...

  6. OO中,先有对象还是先有类?

    就是问,在面向对象思想里,先有对象还是先有类,乍一看和先有鸡蛋还是先有鸡是一类问题,其实不然!这个问题,在lz考研复试的时候被面试官问过,一模一样,如今又在一个笔试题里看到了类似的题目,眨一下,有人会 ...

  7. OO方式下,ALV TREE和ALV GRID的不同之处

    作为大部分报表程序的基础,ALV GRID差不多是每个ABAP开发者必须了解和掌握的内容,因此网上也不乏相关资料,而ALV TREE的应用相对较少,中文资料也就比较少见了.实际上,ALV TREE和A ...

  8. 从人类社会的角度看OO(独家视角)

    引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的"社会"关系,从而让我们抛弃书 ...

  9. HDU5288 OO’s Sequence

    Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number o ...

随机推荐

  1. 使用docker-compose配置mysql数据库并且初始化用户

    使用docker-compose配置mysql数据库并且初始化用户 docker-compose  测试创建一个docker-compose.yml测试 以下配置了外部数据卷.外部配置文件.外部初始化 ...

  2. CCF(除法):线段树区间修改(50分)+线段树点修改(100分)+线段树(100分)

    除法 201709-5 这道题有很多种方法来做,最常用的就是线段树和树状数组. 如果使用线段树来做,就会想到区间修改的update函数.但是这里可能会涉及到v是1或者a[j]是0的情况,所以用这种方法 ...

  3. 关于《Android编程权威指南》的MockWalker在模拟器中无法运行的解决方法

    1.打开模拟器中的Dev Settings应用. 2.选中Allow mock locations选项. 之后应该就能正常运行了.

  4. SpringMVC-02 第一个SpringMVC程序

    SpringMVC-02 第一个SpringMVC程序 第一个SpringMVC程序 配置版 新建一个Moudle , springmvc-02-hello,确定依赖导入进去了 1.配置web.xml ...

  5. SVHN数据集 Format1 剪裁版

    SVHN数据集官网:http://ufldl.stanford.edu/housenumbers/ SVHN数据集官方提供的有两种格式 Format1是那种在街上拍的照片,每张照片的尺寸都不同,然后l ...

  6. SpringMVC-05 Json交互处理

    SpringMVC-05 Json交互处理 Json 1.什么是JSON? JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别 ...

  7. 在linux下如何搭建jmeter的环境

    首先 我们可以选择不同版本的jmeter 转载原连接:https://blog.csdn.net/lyl0724/article/details/79474388 Jmeter历史版本下载地址 htt ...

  8. This is my first blog----文件操作基本流程

    一,文件操作基本流程. 计算机系统分为: 计算机硬件, 操作系统, 应用程序三部分 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件 ...

  9. 如何在 ASP.Net Core 中实现 健康检查

    健康检查 常用于判断一个应用程序能否对 request 请求进行响应,ASP.Net Core 2.2 中引入了 健康检查 中间件用于报告应用程序的健康状态. ASP.Net Core 中的 健康检查 ...

  10. P1177【模板】快速排序(JAVA语言)

    import java.util.Scanner; import java.util.ArrayList; import java.util.Collections; import java.util ...