一.什么是JML
JML即java建模语言(Java Modeling Language),是一种进行详细设计的符号语言,它鼓励你用一种拳心的方式来看待java类和方法。面向对象的一个重要原则ijushi过程性的思考应该尽可能地推迟,不过遵循了这个原则的大多数人也不过是把这个原则适用到方法实现这个级别上。它有一套自己的语法,有前置条件、后置结果等等。其实就是准确描述一个方法的作用而不是直接的代码实现。好处就是对使用代码的人来讲更加清楚快捷的读懂代码。
jml的相关语法:
1.jml表达式:
a.原子表达式:\result,\old(expr)
b.量化表达式:\forall,\exists,\sum,\max,\min
c.操作符:\nothing,\everthing
2.方法规格
a.前置条件:\requires
b.后置条件:\ensures
c.副作用:assignable 或 modifiable
3.其他
a.不会对对象的状态进行改变:/*@pure@*/
b.对容器中所有的变量进行约束:\forall,\exists
c.相应的规格所在包范围内所有其他规格都可见:/*@public
工具链:根据jml生成jar文件,然后检测代码。
二.架构梳理及重构
1.第一次作业
第一次写的时候有点不知所错,因为是第一次接触这样形式的作业。但通过对jml的学习之后,就明白了。在实现上大部分用了Vector来存储,应为Vector在查找添加删除的时候提供了很便利的方法,本以为代码应该没有什么问题了,结果发现强测竟然一个都没过,但由于时间关系,实在没空去处理了。
2.第二次作业
第二次写的时候就实现了图的存储,但是由于第一次的作业是有问题的,到第二次的时候就显现了出来。通过代码的调试发现是路径的删除有了问题,就是在删除路径的时候,虽然路径队列和路径名队列删掉了,但是在图里的删除却是不正确的,通过调试找到这个问题之后改掉之后就通过了中测。本次作业涉及到了最短路径问题,我的算法一直很差劲,所以用了最笨的dij,解决了问题。
3.第三次作业
很遗憾第三次作业无效了,原因有两个,第一个对jml语言理解不到位,不知道如何通过jml来实现自己代码的写法,第二个算法对于最小换乘和最小不满意度尝试了几个算法但都失败了,一来是编程能力差,二来是对算法不擅长。
三.bug
第一次的代码中removePath和removePathById部分写错了,但侥幸通过中测,但没能通过强测,同时cpu时间也超了。
第二次把第一代码中的两个方法改正之后,但还是没能解决cpu的问题。
第三次没能写出来。
四.心得体会
本单元主要内容是规格化设计,学习了jml的相关知识语法等,并且在作业中利用它进行了规格抽象,有了JML语言,就回事先帮我们设计好思路,我们只要实现功能就好了,而不去关心具体的实现细节。本单元作业中,题目已经事先给我们写好了规格,我们只需要通过规格进行代码事先就可以了,这样写代码的思路就很清楚了,本以为是让我们自己写规格,没想到是这样!不过,我读规格的时候还是比较困哪,首先是时间投入少,然后就是练习不够,接下来就要好好努力继续迎接接下来的工作了。