OO第三单元总结

OO第三单元总结

在本单元主要练习了jml语言规范以及书写,根据jml规格来实现相关的代码等。在具体的作业中结合图的相关知识考察算法设计能力,以及对代码的测试。总的来说,和前两单元比较,本单元的代码框架基本上都已经给出,重点在于算法的设计实现问题上,综合考量算法复杂度,还是具有一定的难度。

JML理论基础

JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言。JML是一种行为接口规格语言(Behavior Interface Specification Language,BISL),基于Larch方法构建。BISL提供了对方法和类型的规格定义手段。所谓接口即一个方法或类型外部可见的内容。
利用JML语言,我们可以(1)开展规格化设计。这样交给代码实现人员的将不是可能带有内在模糊性的自然语言描述,而是逻辑严格的规格。(2)针对已有的代码实现,书写其对应的规格,从而提高代码的可维护性。这在遗留代码的维护方面具有特别重要的意义。
总之,JML就像一盏明灯,只需要跟着它走就可以了。

JML应用工具链

常用的JML应用工具链有以下几个:

  • OpenJML: 主要用来检查JML规格是否正确。
  • SMT Solver: 用来检查代码实现是否是严格安装JML规格进行的。
  • JMLUnitNG/JMLUnit: 可以根据JML规格自动构造测试数据进行测试

JMLUnitNG/JMLUnit的部署

在部署jmlunitNG的时候,参照了几位同学在博客中介绍的方法,但是还是莫名报各种各样的错误,于是就放弃了。

作业架构分析

由于三次作业迭代进行,后一次作业涵盖了前一次作业的所有内容,这里只贴出第三次作业的UML图:

总的来说,由于课程组已经给出了大半代码,三次作业在总体的架构上并没有太大的变化。
在接触到第一次作业的时候,看到指导书的要求,感觉这也太简单了吧,就是照着给出的提示写代码嘛,虽然有些jml语言比较难懂,但花点功夫还是搞定了,与之前的作业相比还是比较轻松的,课程组也没有设置除jml外的其他坑点,稍有难度的时iscycle函数涉及到BFS图遍历的问题。到了第二次作业,指令变成了10W条,这就对程序性能提出了很高的要求,简单的按照jml编写虽然能保证正确性,可是必定会超时,也就出现了在各种地方钻牛角尖节省时间开销的情况,包括将arraylist换成数据量大时查找效率更高的hashmap,涉及到重写所有查找部分的代码,还是比较麻烦的。第三次作业就是换了脸,感觉就是在做一道图的算法题,加权最短路径,连通块等的判断,考察个人的算法设计能力,也是本单元最难的一个地方了。

BUG分析

在第一次作业中少写了一个id1!=id2,在强测中遭重了,(由于万恶的jml),对着jml写带了,疏忽了自己的一些逻辑思考。第二次作业是对性能的一次考量,最坑的是contains和getPerson的双重遍历,在此我也栽了跟头,归根到底还是没有理解jml存在的意义,jml并不是一个代码的模板,只是规定了一些代码实现的方式,要满足的条件等,不能生搬硬套,吃了大亏。第三次作业有了前两次作业的经验了,多加了功能也是算法上的设计,解决了算法,就没有什么问题了,这部分也不是jml需要管的事情。

感想

本单元相较于前两单元从0开始自己写代码来说,已有的代码设定好了大致的框架,留给我们的是具体上的代码实现,算法设计,想在本单元拿到高分,首先还是要非常细心,可能一个jml的疏忽会导致连互测都进不去。本单元让我对jml规格有了一个更清晰的认识,方法的行为竟然还可以用形式化语言表示出来,这也给了我一个起始,在今后写代码的过程中,应该让自己的代码尽量能用jml规格表示出来,不然可能就是代码太过复杂,导致容易出bug,或者说方法功能不够单一,本该由多个方法分开实现却挤在了一个方法里面。

posted on 2020-05-23 16:53  fanzk99  阅读(156)  评论(0编辑  收藏  举报

导航