又到了喜闻乐见的博客周,没有OO的周末仿佛拥有了所有时间。
(1)总结分析自己实现规格要求所采取的设计策略
提示:设计策略一般指整体性的设计思路分析
- 可是,JML的最大优势,就是不用考虑整体性。
- 事实上,本单元的设计是一种典型的trade-off。如果在查询上节省时间,就要在维护时多花费时间。
- 比如,增加O(1)、查询O(n^2),在优化后变成增加O(n)、查询O(n),看起来只快不慢,但实际上也有隐患。据说互测时有人被5000条ap指令hack到……
- 当然,上面的例子比较少见。多数情况下,在维护上多花一点时间可以让整体的运行速度更快。
(2)结合课程内容,整理基于JML规格来设计测试的方法和策略
白天吃白片,不瞌睡;晚上吃黑片,睡得香。
本单元主要用到两种测试方法:白盒测试、黑盒测试。其中基于JML规格设计测试对应白盒测试。(本部分内容感谢第12周研讨课上赵悦鸣同学的讲解)
- 白盒测试:又叫做逻辑驱动测试,即在了解程序的内部逻辑之后,对所有的逻辑路径进行测试,注重于验证程序的基本功能是否正确。对于本单元而言,对应的是Junit单元测试。
- 由于JML已经从形式上定义了程序的规格,因此:
 整个程序的所有逻辑路径 -> 每个方法的所有逻辑路径
- Junit单元测试目标
- 不同逻辑路径下,方法是否满足JML规格
- 在不同场景下,类的状态是否正确
 
- Junit单元测试方法
- 根据JML的前置条件设置对象的状态
- 调用方法并检查后置条件是否满足
- 测试数据量较小的边界情况和所有逻辑分支
 
 
- 黑盒测试:又叫做数据驱动测试,即不考虑程序的内部结构,从输入和输出的对应关系对接口进行测试,注重于测试程序的性能和鲁棒性。主要体现为对拍,对拍的关键在于数据的生成,此次不再展开。
(3)总结分析容器选择和使用的经验
- 本单元作业中大量使用Hashmap作为容器。
- 相比于较常用的Arraylist,Hashmap在执行查找任务时具有得天独厚的优势,可以将查找的时间复杂度从O(n)降到O(log2n)。
(4)针对本单元容易出现的性能问题,总结分析原因
 提示:如果自己作业没有出现,分析自己的设计为何可以避免
很荣幸,我成功地在每一个坑里体验到了自由落体的美妙。
| 作业 | 第一次作业 | 第二次作业 | 第三次作业 | 
| 潜在耗时指令 | qbs | qgvs | sim | 
| 最直接思路 | 深度优先搜索(dfs) | 现问现算 | 迪杰斯特拉(Dijkstra)算法 | 
| 最直接思路的病根 | 慢 | 慢 | 慢 | 
| 优化方法 | 并查集 | 预存有关变量 | 暂时不会 | 
| 优化方法的疗效 | 不用算,直接查 | 不用算,直接查 | 之后再补 | 
总结经验:永远不要相信自己的第一判断,最先想到的思路直接OUT。
(5)梳理自己的作业架构设计,特别是图模型构建与维护策略
 提示:针对最终形成的架构进行分析,应和设计策略部分的相关阐述配合起来
- 严格来说,因为确实没有做过架构设计,所以这一部分空着比较好,更符合实际情况。
- 可惜空不得。。。
- 不过话说回来:
“黑格尔关于逻辑学说得很妙:这是一种“偏见”,似乎它是‘教人思维’的(犹如生理学是‘教人消化’的)。”——列宁 
 
- 所以,还是简单说说:
 第三次作业中,我用了邻接矩阵完成了Dijkstra算法,强测CTLE。
OO第三单元总结博客
原文:https://www.cnblogs.com/Mayday777/p/14839059.html