OO 第三单元总结

尹祺霖-22371157 学生 2024-05-16 12:06:45

一、写在前面

  第三单元我们完成了一个模拟社交关系查询系统,其中包含了人,关系,标签,信息等。学习了JML规格理解和代码实现,以及容器的选择和算法的优化。JML作为一种要求和规则给出了我们要实现的功能,在以后或许我们会遇到其他规格语言或者自然语言来作为规格,但是规范开发和便于测试的思想会存于我们的开发过程。同时,在读懂了JML后选择实现的方式也是至关重要的。

二、架构与模型构建

2.1 UML框架图

img

2.2 架构设计

MyPerson

img

MyPerson类仅仅按照JML的要求来构造了相应的属性,对于acquaintance和value以及tags这三个属性由于person的id和tag的id各自不会有重复的,所以选择了Hashmap来作为容器。

MyTag

img

MyTag中除了JML中要求的之外我还有个sum用于维护ValueSum,在MyNetwork中的queryValueSum这个方法的查询复杂度是N(2),如果不维护的话肯定会tle。

MyMessage

img

MyMessage仅仅按照JML填写,没有额外维护。

MyNetwork

img

可以看到MyNetwork中的容器基本上选择的是HashMap,封装了对维护类的处理和迪杰斯特拉,其中迪杰斯特拉用于查询最短路径,blockSum和triSum动态维护了关系网中块儿的数量和三角形的数量,而isDirty则是标志了维护的IdMap是否因为被修改了关系而作废了,除此之外都是JML的要求。

异常类(以RelationNotFound为例)

img

可以看到采用了static的变量,并且counter类用于计数,counter类包含了一个总的计数器以及一个Hashmap来存储id对应的数量。

img

三、维护策略

本单元中我对于查询方法中复杂度大于等于N(2)的方法进行了动态维护,在hw9中是对于queryBlockSum以及queryTripleSum两个方法进行了动态维护,方法是通过在加人,加关系和删关系的时候去相应的维护,其中blockSum的维护需要去查看并查集。

在hw10中我对于queryTagValueSum方法进行了维护是通过在MyTag中增加了sum属性,在MyTag中加人删人以及MyNetwork中加关系以及删关系中进行了维护。

四、测试理解

4.1 黑箱测试

黑盒测试,它是通过测试来检测每个功能是否都能正常使用。它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。在Unit3中体现在部分中测点以及JUnit测试之中。

4.2 白箱测试

白箱测试则是在考虑软件内部实现的情况下,对软件进行测试的方法。在白箱测试中,测试人员需要了解软件的内部结构、代码逻辑等,以便能够对软件进行有效的测试。白箱测试通常用于测试软件的可靠性、安全性等方面。体现在强测以及部分中测点。

4.3 单元测试

单元测试是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。体现在JUnit中对于单个方法的测试。

4.4 功能测试

功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。

4.5 集成测试

在单元测试的基础上,将所有模块按照设计要求组装成为子系统或系统,进行集成测试。体现在JUnit中对于main方法进行测试。

4.6 压力测试

是指对软件系统在高并发、大负荷、长时间运行等特殊条件下进行测试,以验证系统的稳定性、可靠性和性能指标等是否能够满足要求。体现在强测以及互测中大量的查询方法。

4.7 回归测试

回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。自动回归测试将大幅降低系统测试、维护升级等阶段的成本。我想是体现在对于hw10中修改了hw9中的modifyRelation方法以及相关的测试。

五、数据构造的策略

对于数据构造的话我是选择了以压力测试为主,通过调用大量的JML中的高复杂度方法来看本地运行的时间以及和同学对拍来看是否符合要求

六、性能问题以及修复情况

6.1

在Unit3中,hw9最开始我是仅仅按照JML编写,发现超时后添加了triSum和blockSum来进行维护,用到了并查集和动态维护两个优化,其中并查集里面又用到了路径压缩和按秩合并。测试没有出现性能问题。

hw10中用到了Dijkstra算法来查找最短路径,其中还用到了脏位来减少查询次数。动态维护了ValueSum。测试出现了大量的qtvs是我会tle,所以加上了动态维护。

6.2 规格与实现的分离

我认为规格仅仅是描述了要求,针对于实现而言可以不局限于这个方法,采用动态维护就是规格和实现分离的体现,我们可以在规格的要求上采用算法来优化复杂度,可以动态维护而不是选择多重循环嵌套,所以规格仅仅是描述了要求,具体的实现多种多样。

七、JUnit和体会

对于JUnit测试我认为是让我们更好的理解了规格,我们需要考虑这个方法中哪些东西会改变,哪些不会改变,如何去判断,又以什么样的比例去构造测试点来去测试,还有就是我们构造的模拟社交关系的数据点是否过于稠密或是过于稀疏,这些都是要考虑的问题,因此我认为JUnit是加深了我们对于JML的理解的。

八、Hack策略分析

在hw9中我选择的策略是压力测试,通过大量的qbs和qcs来测试是否会tle。

在hw10中我采用的也是压力测试,通过大量的qtvs来测试是否会tle。

在hw11中则是所有的查询都混合着构造数据。

九、心得体会

这个单元总体而言的难度比不上上两个单元,难度主要是在如何优化自己的程序使得不会在强测和互测中挂掉,在这个单元中我学习了很多的算法和优化上的知识,同时也认识到了规格化开发的各种好处,也更加有利于我们开展单元测试,即是以后可能会遇到其他的规格语言,但是其中蕴含的思想是一样的。还剩下最后一个单元了,革命即将成功,加油!!!!

...全文
86 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

301

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象设计与构造
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧