OO Unit3 总结
OO Unit3 总结
OO课Unit3人际关系网JML应用技术回顾
BUAA.1823.邓新宇
2020/5/23
梳理JML语言的理论基础、应用工具链情况
方法规格
JML中,同一个方法在不同的条件下会产生不同的行为,这种行为分为正常行为和异常行为,分别用单成一行的public normal_behavior和public exceptional_behavior作为该行为的描述的声明放在行为描述的最开始,不同的行为之间用also连接。一个方法的描述中可以有多个不同的行为类,而不同的行为类的前置条件应当互斥,并且子类的行为描述不应当与父类有冲突。
在每一个行为类中,有该行为类的前置条件、后置条件、副作用,分别用行前的requires、ensures、assignable/modifiable表示,分别表示传入参数的要求、方法完成后应当满足的条件、方法可能对其它部分产生的影响。每一个行为类中可以有多个前置条件、后置条件、副作用。
在行为的形式化描述的时候,通常需要进行全部、存在、求和的描述,分别用\forall、\exists、\sum语句来完成,它们的格式分别为:
\forall 类型 临时变量; 前提的条件(通常为取值范围); 约束条件
这表示每一个该符合前提条件的变量都需要满足指定的约束条件,即
\]
\exists 类型 临时变量; 前提的条件(通常为取值范围); 约束条件
这表示存在一个该符合前提条件的变量可以需要满足指定的约束条件,即
\]
\exists 类型 临时变量; 前提的条件(通常为取值范围); 加和数值
这表示每一个该符合前提条件的变量,按照加和数值规则进行求和,即
count = 0
for value in 前提条件:
count += 加和数值
return count
在异常行为描述的过程中,通常需要描述异常的抛出,这需要通过signals语句来完成,其格式为:
signals (异常名称 e) 抛出条件
这表示在抛出条件成立时,抛出异常名称指定的异常
类型规格
类规格主要有不变式和状态变化约束,分别用行前的invariant、constraint表示,它们都可以加上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。
查询方案
查询有两种简单方案:
- 在每次查询的时候都重新计算结果;
- 在每次可能导致查询结果发生变化的时候重新计算结果;
前者会降低查询的效率,而后者会降低每次更改的效率。前者在状态改变少、查询次数多的时候效率低下,后者在状态改变多、查询次数少的时候效率低下。
为了使二者互补,我才用了如下较复杂的方案:
在状态发生改变的时候进行标记,每次查询的时候检查标记,如果标记有效则重新计算、保存并返回查询结果,然后复位标记,否则直接返回保存的结果
这样在面对各种情况下都有比较好的效率。
按照作业分析代码实现的bug和修复情况
本次作业的bug主要分两类:
- 在上文查询方案优化中,对于“状态发生改变”的情况考虑不全,比如Group只在添加新的成员时才置位标记,但实际上对Group成员进行新的acquaintance添加时,Group的部分查询结果也会发生改变,所以后来为每个Person记录了其所在的Group,每次添加acquaintance后通知那些Group进行相应的标记置位;
- 图的查询算法实现出现bug,主要原因就是菜,对于复杂算法了解不够,自己瞎想的算法一方面有漏洞一方面效率低下。
阐述对规格撰写和理解上的心得体会
按照JML进行实现,先把握住会导致不同行为的前置条件,先利用这些前置条件把各个行为分开,然后再在各类行为之中进行实现。
虽然这次算法的复杂度并没有要求很低,但是要求算法的正确性要求很高,在现有理论十分丰富的当下,实在没必要自己去瞎发明轮子,这是一个教训,应该好好学习别人已经分享的解决方案,复用已经被证明过的轮子。
OO Unit3 总结的更多相关文章
- JML规格编程系列——OO Unit3分析和总结
本文是BUAA OO课程Unit3在课程讲授.三次作业完成.自测和互测时发现的问题,以及倾听别人的思路分享所引起个人的一些思考的总结性博客.主要包含JML相关梳理.SMT Solver验证.JML单元 ...
- OO unit3 summary
Unit3 JML(Java Modeling Language) 是用于对 Java 程序进行规格化设计的一种表示语言,它对于方法内部具体是如何实现的并无要求,只是对方法的接口以及行为进行限制, ...
- OO第四单元总结暨期末总结
OO第四单元总结暨期末总结 目录 OO第四单元总结暨期末总结 第四单元三次作业架构与迭代 整体感受 HW1 HW2 HW3 四个单元架构设计与方法演进 Unit1 Unit2 Unit3 Unit4 ...
- GLUT的简洁OO封装
毕业设计用到了OpenGL,由于不会用MFC和Win32API做窗口程序:自然选用了GLUT.GLUT很好用,就是每次写一堆Init,注册callback,觉得有点恶心,于是对他做了简单的OO封装.记 ...
- Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结 1. Sql语言应该得到更大的范围的应用,1 1.1. 在小型系统项目中,很适合存储过程写业务逻辑2 1.2. 大型 ...
- OO中,先有对象还是先有类?
就是问,在面向对象思想里,先有对象还是先有类,乍一看和先有鸡蛋还是先有鸡是一类问题,其实不然!这个问题,在lz考研复试的时候被面试官问过,一模一样,如今又在一个笔试题里看到了类似的题目,眨一下,有人会 ...
- OO方式下,ALV TREE和ALV GRID的不同之处
作为大部分报表程序的基础,ALV GRID差不多是每个ABAP开发者必须了解和掌握的内容,因此网上也不乏相关资料,而ALV TREE的应用相对较少,中文资料也就比较少见了.实际上,ALV TREE和A ...
- 从人类社会的角度看OO(独家视角)
引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的"社会"关系,从而让我们抛弃书 ...
- 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 ...
随机推荐
- DNS Rebinding漏洞原理
目录 SSRF过滤器设计 背景知识 DNS TTL 公网DNS服务器 DNS重绑定 自建DNS服务器 利用步骤图解 实战中的注意事项 防御 参考 DNS Rebinding 广泛用于绕过同源策略.SS ...
- 实现Hi3559板载自启动网卡、NFS及Telnet服务
实现Hi3559板载开机自启动网卡.NFS及Telnet服务通过直接在home目录下,编辑.bashrc,vi ~/.bashrc 1 ifconfig eth0 up 2 ifconfig eth0 ...
- 关于《Android编程权威指南》的MockWalker在模拟器中无法运行的解决方法
1.打开模拟器中的Dev Settings应用. 2.选中Allow mock locations选项. 之后应该就能正常运行了.
- C# 应用 - 多线程 3) Task.Factory
1. 与 Task.Run() 的区别: 先看一下源码: public class Task : IThreadPoolWorkItem, IAsyncResult, IDisposable { pu ...
- php-fpm的慢执行日志
通过慢执行日志,我们可以清晰地了解PHP脚本在哪里执行时间长,可以定位到行 下面介绍如何开启和查看慢执行日志 #vim /usr/local/php-fpm/etc/php-fpm.d/www.con ...
- js 判断 是否在当前页面
1.使用visibilitychange 浏览器标签页被隐藏或显示的时候会触发visibilitychange事件. document.addEventListener("visibilit ...
- Linux less命令查看文件常用查询方法
g 跳到文件开头 G 跳到文件结尾 / 往下搜索字符 ? 网上搜索字符 n 执行上一个搜索(/或者?的搜索),例如上一个搜索是使用/搜索的,则继续使用/搜索,即往下搜索结果 N 反向执行上一个搜索(/ ...
- 【odoo14】第十三章、网站开发(对外服务)
本章我们将介绍一些关于odoo web服务方面的基础知识.进阶的内容,将在第十四章介绍. odoo中的web请求是由python的werkzeug库驱动的.odoo为了操作方便,对werkzeug进行 ...
- HTTP 状态码(转载)
本文由 简悦 SimpRead 转码, 原文地址 www.cnblogs.com HTTP 状态码 (HTTP Status Code) 状态码并不是每个都有,为了后期扩展.[update201705 ...
- Python基础【基本数据类型】
基本数据类型分类 数字 int 字符串 str 列表 list 字典 dict 元祖 tuple ...