JML理论基础:

    JML全称为Java Modeling Language,是一种行为接口规范语言,可用于指定Java模块的行为。它实现了对一个方法/类/程序的外部可感知行为的抽象表示,内部细节无需在JML中表示,JML把设计与实现有效的分离开。本单元我们的重点放在了JML规格化设计这一点,同时只做了前置条件,后置条件的表达式量化,方法规格的描述以及副作用限定等任务。

应用工具链:

  与规格化设计相关的主要有三个工具:VScode、OpenJML、JMLUnitNG。

  VSCode里面有JML高亮插件,这可以使我们更好的阅读JML语言。

  OpenJML用于检查JML语法问题,是否如何规格。

  JMLUnitNG主要是根据JML规格描述产生NG样例。

  

架构设计:

  第九次作业:

  

    本次作业在PathContainer中维护了三个hashMap,分别是用pathId找path,用path找pathId,用nodeId找node在容器中出现的次数(用于实现getDistinctNodeCount()方法)。

  第十次作业:

  

    本次作业引入了自定义类Edge用来存储边,包含了边的起始结点和终止结点。除了第九次作业中的hashMap这次还添加了距离矩阵和邻接矩阵,同时新建一个ArrayList记录自圈。主要算法思想是利用Floyd算法。

  第十一次作业:

   

   

    本次作业主要应用的仍然是Floyd算法。在增加一条path之后将本条path相关的信息加入到总矩阵之中,利用Floyd算法进行松弛。对于某两点之间的换乘等要求直接返回对应矩阵对应边即可。不过这种方法未被优化,删除path的时候会对已有的所有path进行松弛,造成性能上的浪费。对于连通块每增加减少path都需要重新计算,设置信号变量validConnectedBlocks,当信号变量为1时表示连通块已更  新,为0表示未被更新。在相关指令到来时先判断信号变量,为1直接取,为0更新后再取。

Bug情况:

    第三单元除了第二次作业其余都没有出现bug。第二次作业的Bug比较低级:在判断两个Integer变量是否相等时直接使用了“==”而不是使用equals,同时在自定义类中,获取hashCode的时候用的是 Objects.hash()方法。但是使用这个方法直接导致了我有几个点CTLE了,然后我换成自定义的比较简单的哈希函数fromNode + 37 * toNode就可以很快的执行程序。可能hashCode为了比较过多的哈希冲 突使用了比较复杂的函数计算,然而对于本次作业来说只需要使用比较简单的函数就能既保证较少的哈希冲突同时还可以提高效率。

规格撰写和理解上的心得:

    这个单元的主要任务是了解JML如何使用以及它的好处。每一个方法都有特定的用途,相比于使用自然语言来描述功能,JML具有意义明确,结构规整等特点,同时可以利用相关的软件来分析代码是否满足JML。因此JML可以极大的保证程序的正确性,因此在写对可靠性要求极高的代码的时候JML无疑是一个帮手。对我们的代码来说,虽然JML的意义并没有这么大,但是通过这种训练让我们对规格验  证有所了解,我觉得也是这个单元的最大收获。(当然还有重新学习了一下数据结构2333333)

posted on 2019-05-21 19:12  Tinco  阅读(152)  评论(0编辑  收藏  举报