OO第三单元总结
Posted aaedion
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OO第三单元总结相关的知识,希望对你有一定的参考价值。
JML
曾经在很早以前就曾经幻想过,是否存在一种规则可以约定大家的代码功能效果。知道这个单元学习了JML让我意识到,业界确实存在一些已经十分成熟的对应语言。
JML(Java Modeling Language),书写于java代码的注释中,用于表示java代码的功能,而不在乎其内部实现。通过JML,我们可以对一个项目进行一个宏观的架构,而不用考虑他内部的实现,有利于我们构架时更好的完成面向对象设计。
部暑JMLUnitNG
1 public class Add { 2 /*@ public normal_behaviour
@ ensures \\result == a + b; 5 @*/ 6 public static int add(int a, int b) { 7 return a + b; 8 } 9 10 public static void main(String[] args) { 11 add(1, 1); 12 } 13 }
使用讨论区bxy学长提供的IDEA2018.3版openJML测试JML后测试代码
1 [TestNG] Running: 2 Command line suite 3 4 Running: 5 Command line suite 6 7 Passed: racEnabled() 8 Passed: constructor add() 9 Failed: static add(-5464846548, -5464698148) 10 Passed: static add(0, -9632483648) 11 Passed: static add(2269875647, -2112489738) 12 Passed: static add(-5963483648, 0) 13 Passed: static add(0, 0) 14 Passed: static add(5967483647, 0) 15 Passed: static add(0, 2687483647) 16 Passed: static main(null) 17 Passed: static main({}) 18 19 =============================================== 20 Command line suite 21 Total tests run: 10, Failures: 1, Skips: 0 22 ===============================================
构架设计
第九次作业
这次作业的内容主要时Path与PathContainer,由于对于查询方法的要求比较高,因此全部存储都采用了hashmap,并重写了hashcode方法,用于在hashmap中使用path来进行快速的查找。
第十次作业
本次作业是实现Path和Gragh,Graph继承了第九次作业的PathContainer,主要查询算法时最短路,因此每一次对图进行修改后便需要重新建图。最短路算法我采用了dijkstra算法。但是我当时犯的错误在于,没有很好的利用之前dijkstra算法的中间结果,导致了令人窒息的CTLE。如果我可以利用之前的缓存结果,那么我可以做到在我的程序中dijkstra算法运行速度越来越快。
第十一次作业
本次作业是实现Path和RaiwaySystem,其中RailwaySystem继承了Graph。本次作业的难点主要在于图中的换乘带来的最短路复杂问题。我个人采用的方式是每一条线路中添加了一次换乘代价的权值。用floyd算法计算每一条路境内最短路后,再使用floyd算法计算整体的最短路算法,防止由于路径中提供存在重复节点而产生错误。最后减去一次换乘代价的权值即可计算出最短路的结果。而连通块的数量,可以直接采用并查集的方法。
我碰到的坑点(Bug分析)
第九次作业很简单,很难出现bug...
第十次作业由于没有很好的利用之前dijkstra算法的中间结果,导致了强测中两个点的TLE,思考了很久错误原因。
第十一次作业发生了巨大的失误,原因在于floyd算法的时间复杂度时O(n^3) 这里的n为节点个数。而没有优化过的dijkstra算法的时间复杂度也是o(n^3),这里的n是边数。
因此由于我采用的边数很多的算法,如果采用bfs或者dijkstra算法。很可能TLE,虽然我的最短路算法采用了floyd,但连通块算法采用了bfs,再加上还有一点其他的bug,导致凉凉。以后要吸取经验教训。
心得体会
开源接口
这个单元中,虽然学习的主体是JML,但让我印象最为深刻的其实是官方提供的本地接口,通过深入研究本地开源接口的实现原理,让我对java的用法和思想都有了更好的理解和认识。
JML
实际上,JML虽然看起来很美好,但复杂的规格代码读起来很痛苦,而当我自己尝试书写一些复杂的JML代码时,我感受到了更大的痛苦与困难,这种对我代码行为的抽象表述花费的时间甚至多于了我书写代码的时间。只能说我对于这种1.5阶的逻辑语言使用和理解依然不够到位。
Junit
Junit的准确测试让我印象深刻,但对我来说,他最大的用处还是在于,在我使用Junit的时候,我的测试集合会越来越充分,我只需要不停的添加测试样例,junit就会自动帮我保存之前的回归测试(只要我不删掉之前的断言),这对测试无疑时十分友好的,因为我不需要担心,是否会出现这次bug的纠正导致了之前地方新bug的出现。如果没有junit,我可能会因为懒而忘记了做回归测试。
以上是关于OO第三单元总结的主要内容,如果未能解决你的问题,请参考以下文章