单元总结3
作业介绍
项目 | 内容 |
---|---|
作业内容 | JML |
作业正文
(1)梳理JML语言的理论基础、应用工具链情况
• JML是一种形式化的、面向JAVA的行为接口规格语言(behavioral interface specification language)
• JML允许在规格中混合使用Java语法成分和JML引入的语法成分
• JML拥有坚实的理论基础
• JML使用Javadoc的注释方式
• 结构化、扩展性强
• 块注释:/@ … @/
• 行注释://@
JML语法:
• Precondition前置条件
• /@ requires P; @/
• Postcondition后置条件
• /@ ensures P; @/
• Side-Effects副作用范围限定
• /@ assignable list;@/
• Exception异常
• /@ signal (Exception e) P;@/
数据规格
• Invariant不变式
• /@ invariant P; @/
• Constraint约束
• /@ constraint P; @/
• method result reference
• \result
• Previous expression value
• \old(E)
P:谓词;
T:类型;
R(x):x取值范围;
E:表达式。
Using private fields in specifications
private /@ spec_public @/ Type property;
Fields not null
Private /@ not_null @/ Type property;
Declare spec variable
//@ public model Type x;
Quantifiers量词
Iterating over all variables
(\forall T x; R(x); P(x))
Verifying if exist variables
(\exists T x; R(x); P(x))
Num of elements
(\num_of T x; R(x); P(x))
Sum of expression
(\sum T x; R(x); E)
• JML已经拥有了相应的工具链,可以自动识别和分析处理JML规格
• openjml:http://www.openjml.org/
• http://www.eecs.ucf.edu/~leavens/JML//index.shtml
• JMLUnitNG:根据规格自动生成测试数据。链接:http://insttech.secretninjaformalmethods.org/software/jmlunitng/
(3)部署JMLUnitNG/JMLUnit,针对Group接口的实现自动生成测试用例,并结合规格对生成的测试用例和数据进行简要分析
暂未完成。据了解测试覆盖率不够,主要考虑边界情况。
(4)按照作业梳理自己的架构设计,特别分析自己的模型构建策略
第一次作业:
按部就班,只有一个iscircle()比较难。
我建了一个BFS类,从id1开始,以广度优先搜索,暴力查找id2。当时我觉得bfs相对dfs快一点。
第二次作业:
未进行算法的优化,仍然是按部就班暴力实现。
第三次作业:
queryMinPath(int id1, int id2) ,queryStrongLinked(int id1, int id2),queryBlockSum()这三个方法相对最难。
这时候我发现单纯bfs无法解决问题了。所以我选择了dfs,同时把所有路径存起来,仍然是最简单暴力的算法。每次都要重新进行一遍dfs,复杂度肯定是不忍直视。
(5)按照作业分析代码实现的bug和修复情况
三次作业的中测都是全过了,强测都是接近0分。
第一次作业错误出在iscircle()方法里面,当id1和id2都包含,但id1 = id2 时,要返回真。
另一个错误是由id1得到person应该从network里的getPerson得到,而不是对arraylist进行get()操作。修复以后强测都过了。
第二次作业错误很多,强测的测试命令过于多,我感觉无从下手。本来想找同学的输出校对看错误在哪里,但各种原因下没找到。很可能的一个原因是算法过慢,导致ctle。
第三次作业由于第二次作业的bug并未解决,只能拿20分。
(6)阐述对规格撰写和理解上的心得体会
这一单元的作业看似简单,但容易出错,如果不能好好去理解规格并测试的话很可能就像我这样强测分数很低。
另外本单元对于算法的要求比较高。
jml可以让代码更加清晰。jml让分工更加明确,写jml的人主要任务是熟悉了解用户的需求,考虑各种情况。实现的工作则只考虑当前的任务,测试也更加方便。