OO第三单元作业总结
OO第三单元作业总结
JML语言
理论基础
表达式
原子表达式:
| 原子表达式 | 含义 |
|---|---|
| \result | 非void方法执行后的返回值 |
| \old(expr) | expr在方法执行前的值 |
| \assigned(x,y,...) | x,y,...变量在方法执行时允许被修改 |
| ... | ... |
量化表达式
| 量化表达式 | 含义 | 举例 |
|---|---|---|
| \forall | 全称量词修饰的表达式 | (\forall int i,j;0<=i&&i<j&&j<10;a[i]<a[j]) |
| \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
目前配置还存在问题,为了防止晚交作业先把报错信息贴上。

架构设计
- 架构上主要遵循了课程组提供的设计,仅仅在第三次作业中引入了边这个类服务于优先队列。类图如下:
![]()
这一单元的代码复用效果很好。一般前面出现的指令在后面作业中是不需要改的。另外,可能是因为容器选择与使用方法较为得当,这一单元作业并没有使用诸如并查集等高级算法也没有发生TLE。
了解了大佬们的架构后发现大佬们很喜欢用泛型,能够极大地提高代码复用性。了解了一下发现不算特别难,下次可以试一试。
bug及修复情况
- 本单元最后一次作业在Tarjan算法上除了问题,主要原因是没有理解算法的本质。所幸在对拍时发现了错误并予以了更正。本单元强测和互测没有发现BUG,希望继续努力!
心得体会
- JML让我初步体会到了多个人编程时规范的重要性。他可以避免在转交代码时费时费力且不精确的向他人解释的环节。规范化真的很重要。
- 通过本单元对离散数学的图论和数据结构的内容进行了复习。在期间还意识到了差距。比如一些高级的算法,搞过竞赛的同学很容易就拿来用了。刚开始心里还是有些卑微,不过后来发现其实只是起步早晚的问题。不会的东西学就行了,这才是学习应有的态度。


浙公网安备 33010602011771号