OO第三单元作业总结

OO第三单元作业总结

JML语言

理论基础

表达式

原子表达式

原子表达式 含义
\result 非void方法执行后的返回值
\old(expr) expr在方法执行前的值
\assigned(x,y,...) x,y,...变量在方法执行时允许被修改
... ...

量化表达式

量化表达式 含义 举例
\forall 全称量词修饰的表达式 (\forall int i,j;0<=i&&i
\exists 存在量词修饰的表达式 (\exists int i;0<=i&&i<10;a[i]<0)
\sum 返回给定范围内的表达式的和 (\sum int i;0<=i&&i<5;i)
... ... ...

操作符

类型 举例
子类型关系操作符 <
等价关系操作符 expr1<==>expr2
推理操作符 expr1==>expr2
变量引用操作符 \everything,\nothing

方法规格

  • 前提条件
    requires关键词修饰的字句(注意可以有多个requires,其实并列关系)
  • 后置条件
    ensures修饰
  • 副作用范围限定
    assignable,modifiable等修饰

类型规格

  • 不变式:所有可见状态下都必须满足的特性
  • 状态变化约束

应用工具链情况

常用工具有:OpenJML(对JML进行语法检查)、JMLUnitNG、JMLUnit(自动化单元测试生成工具)等。但是工具链较不完善,还有些因为很久没有维护导致了与JDK等不兼容的情况(所以使用起来效果不是很好)。

JMLUnit

目前配置还存在问题,为了防止晚交作业先把报错信息贴上。
OO第三单元作业总结_第1张图片

架构设计

  • 架构上主要遵循了课程组提供的设计,仅仅在第三次作业中引入了边这个类服务于优先队列。类图如下:
    OO第三单元作业总结_第2张图片
    这一单元的代码复用效果很好。一般前面出现的指令在后面作业中是不需要改的。另外,可能是因为容器选择与使用方法较为得当,这一单元作业并没有使用诸如并查集等高级算法也没有发生TLE。
    了解了大佬们的架构后发现大佬们很喜欢用泛型,能够极大地提高代码复用性。了解了一下发现不算特别难,下次可以试一试。

bug及修复情况

  • 本单元最后一次作业在Tarjan算法上除了问题,主要原因是没有理解算法的本质。所幸在对拍时发现了错误并予以了更正。本单元强测和互测没有发现BUG,希望继续努力!

心得体会

  • JML让我初步体会到了多个人编程时规范的重要性。他可以避免在转交代码时费时费力且不精确的向他人解释的环节。规范化真的很重要。
  • 通过本单元对离散数学的图论和数据结构的内容进行了复习。在期间还意识到了差距。比如一些高级的算法,搞过竞赛的同学很容易就拿来用了。刚开始心里还是有些卑微,不过后来发现其实只是起步早晚的问题。不会的东西学就行了,这才是学习应有的态度。

你可能感兴趣的:(OO第三单元作业总结)