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这种规格化的方法,更是契约式编程的思想的充分体现。这也给我从另一个角度体会到如何开发一个高质量的软件。
这个单元我还学习了测试的方法。单元测试在某种程度上极大的提高了我们定位找到问题的效率,也提供了一种较为有效的检查方式。这种方式更能保证我们能够顺利通过回归测试。随着学习的深入,我的单元测试也越来越完善。