OO第三单元总结

OO第三单元作业总结

一,JML语言理论基础

JML是对java程序进行规格化设计的一种语言,对于一个方法而言如果用JML语言进行规格化描述,我们只需要阅读JML就知道方法需要干什么,而不需要花时间阅读代码,在多人合作时显得尤为重要。

  • 原子表达式

    • \result表达式:表示一个非void方法的执行所获得的返回值

    • \old(expr)表达式:用来表示一个表达式expr在相应方法执行前的取值。注意在任何情况下都应该使用\old把关心的表达式整体括起来。

    • \not assigned(x,y,...)表达式:用来表示括号中的变量是否在方法执行过程中被赋值。如果没有被赋值,返回为true,否则返回false

    • \not modified(x,y,...)表达式:与上面的\not assigned类似。限制括号中的变量在方法执行期间的取值未发生变化

    • \nonnullelememts(container)表达式:表示container对象中存储的对象不会有null

    • \type(type)表达式:返回类型type对应的类型(Class)

    • \typeof(expr)表达式:返回expr对应的准确类型,注意与\type的区别

  • 量化表达式

    • \forall:全称量词修饰的表达式,表示对于给定范围内的元素,每个元素都满足相应的约束。

    • \exists:存在量词修饰的表达式,表示对于给定范围内的元素,存在某个元素满足相应的约束。

    • \sum:返回给定范围内的表达式的和。

    • \product:返回给定范围内的表达式的连乘结果。

    • \max:返回给定范围内的表达式的最大值。

    • \min:返回给定范围内的表达式的最小值。

  • 方法规格

    • 前置条件:对方法输入参数的限制,如果不满足前置条件,方法执行结果不可预测,或者说不保证方法执行结果的正确性。

    • 后置条件:对方法执行结果的限制,如果执行结果满足后置条件,则表示方法执行正确,否则执行错误。其中ensures是JML关键词,表达的意思是“方法实现者确保方法执行返回结果一定满足谓词P的要求,即确保P为真”。并列关系和或关系与前置相同。

    • 副作用:副作用指方法在执行过程中会修改对象的属性数据或者类的静态成员数据,从而给后续方法的执行带来影响。

  • 类型规格

    • 不变式(invariant)是要求在所有可见状态下都必须满足的特性,其中invariant为关键词, P为谓词。

二,作业分析
  • 第一次作业

    • UML类图

    • OO第三单元总结_第1张图片
    • bug分析:第一次作业没有出现bug,并且用junit对各个方法进行了测试,但最终由于忘交main导致强测0分。

  • 第二次作业

    • 第二次作业为了增加搜索性能,将第一次作业中使用的ArrayList改为HashSet。

    • UML类图

    • OO第三单元总结_第2张图片
    • bug分析:第二次作业由于没进行单元测试,MyGroup类的getConfliSum()最后没有乘2,导致出现了很多毛病。

  • 第三次作业

    • UML类图

    • OO第三单元总结_第3张图片
    • bug分析:多数为超时错误,点双连通,最短路的查询复杂度过高,最终将点双连通的查询方法改为了tarjan。

心得体会

  • 规格的撰写对于程序可读性的提升非常大,同时,通过撰写规格也能让人更加容易地发现自己的程序存在的漏洞。

  • 在阅读规格时,多层嵌套的括号容易让人产生误解,一定要仔细检查,有一点误差都会导致结果的错误。

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