OO第三单元作业总结

总结

面向对象第三单元的课程主要学习了Java Modeling Language(JML)语言的一些基本知识与使用,并在编程的过程中回顾java继承等特性,以及一些简单的算法

JML语言基础

JML语言是对Java程序进行规格化设计的一种表示语言

主要作用:

  • 开展规格化设计
  • 针对已有代码书写其相应规格(OKTest)
  • 不太适合人类阅读,我觉得JML是不可能大规模应用的,它增加的一层复杂度远远超过它能减少的复杂度

JML用块注释的方法定义规格,包括三个部分:前置条件require,副作用限定范围assignable,后置条件ensures

JML表达式 作用
方法的返回结果
(expr) 原有值
(type) 类型
(expr) 表达式最终结果的类型
\(\forall\)
\(\exists\)

测试

黑箱测试:数据驱动

白箱测试:代码静态分析

单元测试:以“某个最小单元”为基础进行测试

功能测试:测试程序的特征和可操作行为

集成测试:软件的不同模块被集成作为一个整体进行测试

压力测试:在系统资源匮乏的条件下运行测试

回归测试:修改了旧代码后,重新进行测试以确认修改没有引入新的错误,或导致其他代码产生错误

项目架构

由于几乎完全按照JML实现,并没有自己在上面拓展,所以架构非常丑陋

image-20230516223025537

Part 1 第一次作业

在本次作业中,需要稍微考虑一下时间复杂度的部分是动态加边+三元环计数部分,考虑在每次加边时,维护一下本次加边后三元环个数的增量即可

Part 2 第二次作业

本次作业中,需要稍微考虑一下时间复杂度的部分是删边后重构并查集,考虑删边时,对被删除边的两端分别dfs,暴力重构并查集的根为被删除边的端点

Part 3 第三次作业

本次作业中,需要稍微考虑一下时间复杂度的部分是找无向图必经过某点的边权和最小环,可以首先跑出以必经点为根的最短路树,然后枚举每一对非树边,如果非树边的端点在最短路树上的最近公共祖先为根,那么就可以形成一个环,可能形成一个最小环,我们取这些环中的边权最小者即可