JML语言的理论基础、应用工具链情况
部署SMT Solver
失败,quit
,由于SMT在遇到\forall, \exists等复杂逻辑语句时会报错,对我们这种大学单元作业用处并不太大。
部署JMLUnitNG/JMLUnit
莫名的情况G了,不过据说JUMLUnitNG生成的测试样例大部分为null,INT_MAX,0,等等极其边界条件,测试效果较差。
架构设计与模型构建策略
由于是新单元的第一次作业,整体结构直接根据官方的接口,建立MyPerson,Mynetwork三个大类即可,接口的实现绝大部分可以照搬JML翻译,其中需要考量的有两点:iscircle的算法选择,与不同属性的容器选择。
第二次作业相较于第一次作业主要新加Group大类,并根据Goup的成员实现group中所有成员年龄平均值,方差等方法,值得思考的同第九次作业有两点:Group容器的选择;qgrs,qgvs如何优化二重遍历,避免O(n^2)。
private HashMap<Integer, Person> people1 = new HashMap<>(8192)
与 private ArrayList<Person> people2 = new ArrayList<>(8192)
两个容器来存取group中的person信息,在选取判断特定成员时,使用Hashamap,遍历全体时使用Arraylist。并根据Group存储person的最大数量限制,为两个容器开设8192的初始容量,避免后续添加person时单独开设空间的时间浪费。第三次作业的难点集中在三个方法的实现qmp, qsl, qbs,主要的设计与时间投入也集中在这块。
public Person findPa(Person son) {
if (!pre.get(son).equals(son)) {
pre.replace(son, findPa(pre.get(son)));
}
return pre.get(son);
}
void merge(Person son1,Person son2) {
Person papa1 = findPa(son1);
Person papa2 = findPa(son2);
if (!papa1.equals(papa2)) {
pre.replace(papa2, papa1);
}
}
bug和修复情况
people.get(i) == person
,而没使用重写的equal方法。阐述对规格撰写和理解上的心得体会
自我感觉第三单元的整体难度较第二单元有所下降,主要重点集中在对JML的理解,即该方法实现的目的是什么来思考,而不是机械的翻译。第三次作业由于涉及性能要求,考察了一定算法知识,思考算法层面的时间占据了绝大部分。另外一点便是由于JML已经给出了大部分的代码框架,且群佬除我,因此有一点微小的错误都会造成强测直接被专业团队愉快送走,对我们自动化测试与极端测试数据的构造都有了极大要求,all in all ,对拍真香。
原文:https://www.cnblogs.com/Ethanscript/p/12927010.html