OO第三单元总结

本单元主要是JML语言的学习及完成一个社交关系模拟系统,通过输入的指令完成系统内数据的增删查改等交互。

一、设计策略

本单元主要是针对JML代码逻辑完成主体代码部分的书写,首先根据第一次作业的JML Level0手册学习JML语言相关语法,大致理解系统设计的思路,然后根据每个相应的接口JML规格,去写对应的类文件及其中的方法,同时还有各种抽象异常类的接口,都要兼顾到。

 

总体流程大概是:

JML规格→类→变量、方法→类之间方法的相互调用

 

在相应方法中也存在JML规格比较复杂,就需要去先自己理解其逻辑,找到适合的算法,然后在自己的代码中实现,比如第一次作业中用到的并查集算法,第三次作业中用到的最短路径算法(如我的代码实现中用到简易的dijkstra算法)

 

二、测试方法

在前两次作业中我都是根据系统实际需要的功能进行测试,比如第一次作业的检查person间连通性,这种一般比较低效,但是因为作业内容并不是很复杂,所以在测试过程中并没有出现大问题,但是在第一次作业的强测中出现了代码超时的情况,问了同学才知道算法复杂度高容易导致这个问题,就引入了一些间接的写法去降低复杂度,比如第一次的并查集,后来确实不会出现这样的问题。

 

三、容器选择

容器选择上主要是HashMap和ArrayList,这两种基本上能够符合JML规格,同样为了降低复杂度,也会在一些常用的变量存储上单独进行存储,方便遍历和维护。也会用到像List和Map之类的但是具体差别不大,也没什么区别。

 

四、容易出现的问题

本单元的作业中我认为最主要的问题还是代码超时的情况,最主要的解决方法我总结有下面几个:

第一是优化算法降低方法的复杂度,比如采用的并查集算法,使用dijkstra的时候需要进行优化;

第二是数据结构上,也是容器选择上选择适合函数的对应参数存放的容器;

第三是经常调用的一些值需要单独拿出来维护;

 

五、心得体会

这单元的作业我理解为看代码写代码,更像是通过理解JML规格中描述的功能去写相应的类,但是在具体实现的时候不能盲从JML,比如某些变量JML没有规定的,我可以拿出来单独写,方便一些值的维护,又比如一些方法JML也没有规定,但是我可以通过自己去写一些方法或者类来降低算法的复杂度,这样既方便也不容易出错,而且还利于后期debug。总结起来就是JML说了什么我就得实现什么,但是我怎么实现可以参考JML的描述,却不能生搬硬套,那样的代码要么根本跑不起来,要么WA要么TLE。但是对JML的学习还是很有必要的,我理解上这种对JAVA进行规格化表述的语言在工业模式里很好用,虽然只学了其中一部分,但是也感觉受益匪浅。

上一篇:OO 第三单元总结:JML?离散!照抄完事。


下一篇:面向对象第三单元总结