OO_Unit2_Review
一.JML语言的理论基础、应用工具链
1.JML语言的理论基础
Java Modeling Language(JML)是一种规范的注释语言,用于规定类的行为和接口。
JML的优点:
1、其规范性不仅使得注释更加准确。
2、同时凭此我们也可以借助JML的工具链来对某个类进行自动测试
2.jml工具链
openJML:检查JML注释的完整性。
JMLUnitNG:对有JML注释的类或者方法进行自动测例。
二. 部署JMLUnitNG
以第三次作业的addRelation函数举例,实现过程参考https://www.cnblogs.com/nbao01/p/12935615.html。
C:\Users\HooFee\Desktop\Work\OO\Unit3\HW3>java -cp jmlunitng.jar test.MyGroup_JML_Test [TestNG] Running: Command line suite Passed: <>.addRelationn(-2147483648, -2147483648, -2147483648) Passed: < >.addRelationn(-2147483648, -2147483648, -2147483648) Passed: < >.addRelationn(-2147483648, -2147483648, -2147483648) Passed: < >.addRelationn(0, -2147483648, -2147483648) Passed: < >.addRelationn(0, -2147483648, -2147483648) Passed: < >.addRelationn(0, -2147483648, -2147483648) Passed: < >.addRelationn(2147483647, -2147483648, -2147483648) Passed: < >.addRelationn(2147483647, -2147483648, -2147483648) Passed: < >.addRelationn(2147483647, 0, -2147483648) Passed: < >.addRelationn(2147483647, 0, -2147483648) Passed: < >.addRelationn(2147483647, 0, -2147483648) Passed: < >.addRelationn(-2147483648, 2147483647, -2147483648) Passed: < >.addRelationn(-2147483648, 2147483647, -2147483648) Passed: < >.addRelationn(-2147483648, 2147483647, -2147483648) Passed: < >.addRelationn(0, 2147483647, -2147483648) Passed: < >.addRelationn(0, 2147483647, -2147483648) Passed: < >.addRelationn(0, 2147483647, -2147483648) Passed: < >.addRelationn(2147483647, 2147483647, -2147483648) Passed: < >.addRelationn(2147483647, 2147483647, -2147483648) Passed: < >.addRelationn(2147483647, 2147483647, -2147483648) Passed: < >.addRelationn(-2147483648, -2147483648, 0) Passed: < >.addRelationn(-2147483648, -2147483648, 0) Passed: < >.addRelationn(-2147483648, -2147483648, 0) Passed: < >.addRelationn(0, -2147483648, 0) Passed: < >.addRelationn(0, -2147483648, 0) Passed: < >.addRelationn(0, -2147483648, 0) Passed: < >.addRelationn(2147483647, -2147483648, 0) Passed: < >.addRelationn(2147483647, -2147483648, 0) Passed: < >.addRelationn(2147483647, -2147483648, 0) Passed: < >.addRelationn(-2147483648, 0, 0) Passed: < >.addRelationn(-2147483648, 0, 0) Passed: < >.addRelationn(-2147483648, 0, 0) Passed: < >.addRelationn(0, 0, 0) Passed: < >.addRelationn(0, 0, 0) Passed: < >.addRelationn(0, 0, 0) Passed: < >.addRelationn(2147483647, 0, 0) Passed: < >.addRelationn(2147483647, 0, 0) Passed: < >.addRelationn(2147483647, 0, 0) Passed: < >.addRelationn(-2147483648, 2147483647, 0) Passed: < >.addRelationn(-2147483648, 2147483647, 0) Passed: < >.addRelationn(-2147483648, 2147483647, 0) Passed: < >.addRelationn(0, 2147483647, 0) Passed: < >.addRelationn(0, 2147483647, 0) Passed: < >.addRelationn(0, 2147483647, 0) Passed: < >.addRelationn(2147483647, 2147483647, 0) Passed: < >.addRelationn(2147483647, 2147483647, 0) Passed: < >.addRelationn(2147483647, 2147483647, 0) Passed: < >.addRelationn(-2147483648, -2147483648, 2147483647) Passed: < >.addRelationn(-2147483648, -2147483648, 2147483647) Passed: < >.addRelationn(-2147483648, -2147483648, 2147483647) Passed: < >.addRelationn(0, -2147483648, 2147483647) Passed: < >.addRelationn(0, -2147483648, 2147483647) Passed: < >.addRelationn(0, -2147483648, 2147483647) Passed: < >.addRelationn(2147483647, -2147483648, 2147483647) Passed: < >.addRelationn(2147483647, -2147483648, 2147483647) Passed: < >.addRelationn(2147483647, -2147483648, 2147483647) Passed: < >.addRelationn(-2147483648, 0, 2147483647) Passed: < >.addRelationn(-2147483648, 0, 2147483647) Passed: < >.addRelationn(-2147483648, 0, 2147483647)
=============================================== Command line suite Total tests run: 59, Failures: 0, Skips: 0 ===============================================
三.作业结构的结构度量、策略分析及BUG分析
1.WORK1
UML
方法复杂度(2)
类复杂度
2.WORK2
UML
方法复杂度(1)
方法复杂度(2)
类复杂度
3.WORK3
UML
方法复杂度(1)
方法复杂度(2)
类复杂度
4.BUG分析
本单元的问题主要集中于CPU用时的优化问题,也即算法的优化问题。解决CTLE,我主要的方向有两个。
1.对容器种类的优化:由于本单元作业频繁用到查询contain操作,所以我用了contain操作效率更高的HashMap结构来优化这个环节。
2.对多重循环的优化:本单元作业在强测阶段的数据量相当庞大,造成Group类元素个数过多,从而如果某个函数出现多重循环,将造成复杂度爆炸性增长。对此,我对每层循环的次数进行优化,将Xn循环转换成X*Y*Z*....(X>=Y>=Z>=...)。
四.心得体会
本次作业实现难度较低,但是对算法的优化要求较高,由于我在前两个单元习惯了能过中测就算胜利的思维,导致我在本单元前两次作业强测爆炸。但是总体上,难度还是相较前两单元低。在此我也建议课程组可以调整一下OO单元作业的次序,我认为第三单元完全可以作为第一单元来指导学生对JAVA进行入门学习,反而是第一单元难度过高,过于劝退。