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. 中心化-ESB

    服务调用者与服务提供者通过企业服务总线相连接: ESB成为瓶颈:无论在性能上还是成本消耗上,ESB都会导致瓶颈出现.

  2. 后端程序员之路 40、Pthreads

    POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准.线程这个东西在操作系统原理里讲得比较清楚了,再加上对windows那一套进程线程的东西比较清楚,所以这里还是 ...

  3. 基于Hi3559AV100 RFCN实现细节解析-(1)VGS初介绍

    下面随笔系列将对Hi3559AV100 RFCN实现细节进行解析,因为RFCN用到了VGS加框,因此本篇随笔将给出VGS视频图像子系统的具体说明,便于后面RFCN的细节实现说明. VGS 是视频图形子 ...

  4. CSDN博客转MD格式

    基于大神作品修改原文,使用了一下发现有一些小问题,爬取的博客标题如果含有字符是Windows不支持的命名格式,会卡在界面,进行了一下优化,加了一些字符过滤处理,但是tomd模块对html的处理还是不是 ...

  5. Linux速通02 命令格式

    命令的格式 # 格式:命令 [选项][参数] * 命令:告诉 Linux操作系统执行什么 * 选项:说明命令运行的方式(可以改变命令的功能).以 "-"字符开始 * 参数:说明命令 ...

  6. go中sync.Once源码解读

    sync.Once 前言 sync.Once的作用 实现原理 总结 sync.Once 前言 本次的代码是基于go version go1.13.15 darwin/amd64 sync.Once的作 ...

  7. EF Core 源码分析

    最近在接触DDD+micro service来开发项目,因为EF Core太适合DDD模式需要的ORM设计,所以这篇博客是从代码角度去理解EF core的内部实现,希望大家能从其中学到一些心得体会去更 ...

  8. javascript 之对象-13

    对象 无序属性的集合,属性可以包含基本值.对象或者函数,简单理解为对象是若干属性的集合:我们常说的面向对象(oop)编程其实是指的一种编码的思想,简单理解为用对象来封装数据,利用封装.继承.多态对代码 ...

  9. Nodejs学习笔记(5) 文件上传系统实例

    目录 2018.8.4更新:  MySQL可以存放几乎任何类型的数据(图片.文档.压缩包等),但这不是最好的解决方案,正常情况下都是在数据库中存放文件路径,图片.音乐.视频.压缩包.文档等文件存放在硬 ...

  10. 08、元组tuple

    元组(tuple) 是一个有序且不可变的容器,在里面可以存放多个不同类型的元素 元组是在最后多一个逗号,用于表示它是一个元组 tuple = (11,22,'阿斯顿','媚媚',) #后面多加一个逗号 ...