学不会OO的第三单无反思(JML爪8

JML理论基础:

  在大一的离散结构课程中,我们学习叻关于谓词逻辑的相关知识。作为一名周六还得补考离散二的菜鸡,我只能爬。我个人理解上JML语法格式是谓词逻辑和java的生动结合,让读者在理解与讨论的过程中收获极大的欢乐,并基于契约化编程的思想来解放程序员于bug之中->如果完全按照规格实现,那么WA就可以甩锅给写规格的了(

  总体来说,JML是从上层来解决程序需求不具体明确和bug的易产生的一种(应该是)重要的工具(不过好像搜到的都是贵系人的资料)

JML知识点总结:

    • pure:
      纯粹查询,无任何副作用。
    • 数组:
      仅仅是规格层次的描述,不一定要数组实现
    • no_null:
      该对象不能为空。
    • \result:
      该方法的返回值。
    • require:
      前置条件,即调用该方法时参数以及成员变量需要满足的条件。
    • assaignable:
      副作用范围,列出所有可能会被修改的成员变量。
    • \nothing:
    • ensure:
      后置条件,即调用该方法之后参数和成员变量需要满足的条件。
    • \old():
      表示调用该方法前的该对象或表达式的值。
    • \type():
      表示该类(type)的类型(class)。
    • \typeof():
      表示该表达式的类型。
    • \forall():
      相当于离散数学中的"任意"符号。
    • \exits():
      相当于离散数学中的"存在"符号。
    • <=, =>, <=>:
      离散数学中的蕴含,等价等
    • public_normal_behavior:
      正常功能规格。
    • public_exceptional_behavior:
      异常功能规格。
    • also:
      分开正常和异常两种规格。
    • signals () ___ :
      满足条件抛出异常

JMLUnitNG/JMLUnit:

  由于本人最近都在用mac,所以没有找到成型的完整工具链。经过两周多的努力,依旧没有整好,于是👴放弃叻(希望有朝一日有时间仔细整理一下)

  总体来说jml自动化测试主要对各个参数的边界条件进行了测试(但没找到什么用?)

 

JUnit单元测试!!!!:

  这单元我对单元测试有较大感悟。回头单开一个博客再施工(https://www.cnblogs.com/kongyou/p/12940427.html

  总体来说,单元测试能够较有效的解决如wa等问题。在解决tle等问题上有局限性,但不是不能。配合本人魔改runner,基本能够做到准确定位。

 

架构设计:

  对于JML来讲,将抽象的JML描述转变为具体的架构设计是非常重要的。从数组管理上,我大部分选用了ArrayList,利用了其动态性和遍历速度较快的特点。最后一次作业把money作为了Person的属性,更方便我们去进行操作。

  而算法上,缓存处理显得更为重要。再hw10的bug修复环节,我将Group进行了缓存,提高了重复查找的效率。

 

代码实现的bug和修复情况:

  hw9: 强测0,锅出在wa。dfs搓错了,重写成bfs后通过,我太菜了

  hw10: 强测0,锅出在ctle和wa。wa是1111没有判断,对jml的理解不够准确。ctle是缓存不够,经过修改得以通过。

  hw11: 强测75,互测-3。问题应该还是qmp和qsl,不知道怎么修orz爬了

 

心得体会:

  这单元对我来说学习到的不止有JML这种规格化的方法,更是契约式编程的思想的充分体现。这也给我从另一个角度体会到如何开发一个高质量的软件。

  这个单元我还学习了测试的方法。单元测试在某种程度上极大的提高了我们定位找到问题的效率,也提供了一种较为有效的检查方式。这种方式更能保证我们能够顺利通过回归测试。随着学习的深入,我的单元测试也越来越完善。

posted @ 2020-05-22 23:24  kongyou  阅读(254)  评论(0编辑  收藏  举报