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 ...
随机推荐
- Spring-03 依赖注入(DI)
Spring-03 依赖注入(DI) 依赖注入(DI) 依赖注入(Dependency Injection,DI). 依赖 : 指Bean对象的创建依赖于容器,Bean对象的依赖资源. 注入 : 指B ...
- 都学Python了,C++难道真的用不着了吗?
本文首发 | 公众号:lunvey 人人都在学Python,我还学C++吗? 现在只要提及编程语言,得到的答复都是:学Python,有未来! 大家可能有一个误区,数据分析带火了Python,让人们 ...
- socket短连接太多,accept次数很多导致主线程CPU占满,工作线程CPU占用率低
1.使用epoll的ET模式: 2.开启reuseport方法: Linux 最新SO_REUSEPORT特性:http://www.mamicode.com/info-detail-2201958. ...
- Morris莫里斯遍历
程序员代码面试指南(第2版)第3章 二叉树问题:遍历二叉树的神级方法 https://leetcode.com/articles/binary-tree-inorder-traversal/ Step ...
- [数据结构与算法-13]ST表
ST表 主要用来快速查询静态数据区间最大值 思路 数组\(A[i][j]\)存储数列\(\{a_i\}\)中区间\(i \in [i, i+2^j)\)的最大值 查询时只需要查询\(max\{A[i] ...
- 文件查询 select name,age where age>22
# 员工信息表: 完善代码,背下来给代码加注释column_dic = {'id': 0, 'name': 1, 'age': 2, 'phone': 3, 'job': 4} # 将文件每一列的名字 ...
- JavaScript offset、client、scroll家族
offsetParent <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- C#开发BIMFACE系列38 网页集成开发2:审图系统中的模型或图纸批注
系列目录 [已更新最新开发文章,点击查看详细] 在运维或协同的场景中,经常需要对模型或图纸进行批注,及时记录已发现的问题并交给相关负责的人员. 在开始实现功能之前,先了解一下BIMFACE中有 ...
- java线程实现的三种方式以及静态代理
线程 一个进程中若开辟多个线程,线程的运行由调度器控制,先后顺序不能人为干预. 实现方式 继承 Thread类 调用run方法,只有主线程一条路 调用start方法,主线程和子线程并行交替执行 pub ...
- 2019HDU多校第七场 HDU6646 A + B = C 【模拟】
一.题目 A + B = C 二.分析 比较考验码力的题. 对于$c$,因为首位肯定不为0,那么$a$或者$b$至少有一个最高位是和$c$平齐的,或者少一位(相当于$a$+$b$进位得到). 那么这里 ...