BUAA-OO 第三单元作业 JML 总结与思考
一、需求分析
利用java线程的相关知识实现
1)实现两个容器类 Path 和 PathContainer
JML规格⼊⻔级的理解和代码实现
2)实现容器类 Path 和数据结构类 Graph
JML规格进阶级的理解和代码实现、设计模式的简单实战,以及单元测试的初步使用尝试。
3)实现容器类 Path ,地铁系统类 RailwaySystem
JML规格进阶级的理解和代码实现、设计模式和单元测试的进阶级实战。
二、思路分析
1、基于度量的程序结构分析
代码行数统计(利用Statistic插件)
第一次
第二次
第三次
代码设计复杂度(利用MetricsReloaded插件)
ev(G)基本复杂度,用来衡量程序非结构化程度 iv(G)模块设计复杂度,用来衡量模块判定结构 v(G)独立路径条数
第一次
第二次
第三次
2、BUG分析
第一次:
强测中得分 100
互测:未被hack。未hack到别人。
坑点:
同学在第三次作业强测中。亡羊补牢,为时不晚。
第二次:
在强测中得分 100
互测:未被hack。未hack到别人。
坑点:
第三次:
在强测中得分 100
互测:未被hack。未hack到别人。
坑点:
3、架构分析
第一次:
五容器大法
Path:
ArrayList保存边
HashSet处理本质不同边数计数的问题
PathContainer:
Hash
关于容器的选择:
HashMap OR TreeMap?
第二次:
相比第一次,加入了
保存图:二维矩阵实现的邻接表,用arraylist套hashset来保存,能够有效地处理重边和自环的问题。
因为点的id在int范围内,而点数不多,故将点离散化。采用hashmap单独离散化,可以方便查找点是否存在。
每次修改的时候重构图,并求n次单源最短路。
关于最短路算法:
第三次:
完全没有重构。
相比第二次,我认为
借鉴了xg的写法,
修改了通过连边权0实现缩点的方法、通过并查集求联通块的方法。感觉架构上比较好看。
缩点:bfs
求联通块:
关于最短路算法:
每次修改
关于构图:
菊花图:
两种建法:
堆优化dijstra和spfa均可。
缓存的实现:
菊花图
标程架构学习:
三、知识技能总结
1、JML语言的理论基础、应用工具链情况:
任何情况下,如果当前类或所依赖的类已经提供了相应pure方法, 则应直接使用相应方法来构造当前的方法规格
作业中的示例:
•通过repOK来进行运行时检查
•LSP替换原则
•在任何父类型对象出现的地方使用子类对象都不会破坏user程序的行为
•Java提供的Iterator接口定义了三个操作
public Interface Iterator {
public boolean hasNext();
public Object next() throws NoSuchElementException;
public void remove() throws IllegalStateException, UnsupportedOperationException;
}
•集合类型需要提供一个迭代方法来返回一个生成器**(generator)**
•一个集合类型可以定义多个迭代器方法来提供多个生成器
•生成器的类型为Iterator
•生成器能够以迭代方式生成相应元素的对象,它实现了Iterator 接口
•迭代方法的规格定义生成器的行为,生成器的规格则遵循Iterator 接口规格
2、部署JMLUnitNG/JMLUnit,针对Graph接口的实现自动生成测试用例, 并结合规格对生成的测试用例和数据进行简要分析
3、JUnit
四、心得体会
1、规格撰写:
2、个人理解: