面向对象课程第三单元博客总结
自测经验
由于本单元主要内容就是学习JML规格,所以我在自测过程中也尝试通过JML规格准备数据。因为JML明确规定了类的属性的限制以及类的方法在不同情况下的行为,所以我们在设计数据生成器时有意识地让规格中每种情况都出现,通过设计参数使不同情况的概率尽量达到某种平衡。那么只要生成过足够量的数据,理论上就能达到比较完全的覆盖情况。
本单元和第一二单元情况不同:第一单元可以通过和Sympy库结果对比,第二单元可以写验证程序模拟电梯行为检查有无非法情况,而对于本单元,同学间对拍则是一个较好的检查方式。所以我本单元的自测方式即是 数据生成器+对拍 。
架构分析
规格其实基本都已经在JML中给出了,所以架构上需要自行设计的内容不多,大概只是容器的选择、以及实现基本图论算法需要的一些辅助类。
第一次架构如下:
第二次架构如下:
第三次架构如下:
性能分析
实现时首先计算每种方法的复杂度,然后对复杂度瓶颈并存在优化空间的方法进行简单优化。在强测和互测中都没有出现TLE情况。
比如查询组年龄均值和方差时,通过展开计算公式和维护中间变量降低复杂度;维护连通性时,使用了路径压缩并查集;求最短路时,使用堆优化Dijkstra(使用PriorityQueue容器)。即优化通过 架构设计+数据结构+算法。 当然其实没那么高端,因为本作业中用到不过是基础图论而已,但作为博客总结,还是可以强行抽象成为一些类似于优化思路的东西的……
拓展问题
根据我对情景的理解,社交网络可以扩展如下:
以生产商统计销售额、生产商接受产品购买消息和广告商刊登产品广告三个接口为例:
学习体会
相较前两单元,完成本单元的作业容易很多——毕竟仅需要翻译JML即可——但学到的更多应该是一种形式化的思路和方法。从开发到验证,有了规格的约束,我们的需求和目标就都规范明确了很多。
以及感慨对拍这种事确实是人多力量大,永远我一个人从头到尾设计实现完善个人评测系统的话,大概坚持不动这么多次作业吧。但有同学合作完成、有同学交换测试经验、有同学试用评测系统后给予反馈,就变得容易很多。
看起来大家写文章总是最喜欢写致谢部分,我也凑凑热闹。(集合前三个单元和已经开始的第四单元来)感谢一下不知道自己会在这里被感谢的Chenrt学长,通过他的博客我 很大程度地拓展了自己的测试思路 ,也多次在阅读后 为自己测试想摆的颓废心理感到万分愧疚,从而继续努力 。并代表Mistariano一并致以他的感谢 ,他不用天天担心我测试工具太弱了 。