2024 BUAA OO 第三单元总结

余欣实-22373040 学生 2024-05-16 22:18:00

目录

  • 一、三次作业的程序结构和度量分析
  • Homework1
  • Homework2
  • Homework3
  • 二、本单元的测试过程
  • 三、性能问题与修复情况
  • 四、对规格与实现分离的理解
  • 五、利用规格信息来更好的设计实现Junit测试,以及 Junit 测试检验代码实现与规格的一致性的效果
  • 六、本单元学习体会
(2024 BUAA OO 第三单元总结)

一、三次作业的程序结构和度量分析

Homework1

  • 第一次作业架构的类图如下:

    img

  • 本次作业将 Person 之间的关系作为 Person 类的静态成员进行存储,通过一个专门设置的 Division 类,将联通的 Person 进行分组,便于 query_block_sum 等指令返回值的动态存储
  • 同时动态存储并修改 query_circle、query_triple_sum 指令的返回值,将程序的时间复杂度降到最低

    Homework2

  • 第二次作业架构的类图如下:

    img

  • 本次作业将 Person 的 Acquaintance 增加了新的数据结构,使得 Acquaintance 能实现按照题目给定的指标进行排序,便于 query_best_acquaintance、query_couple_sum 返回值的计算
  • 对于 query_tag_value_sum、query_tag_age_var 指令的返回值,则在 MyTag 中对于中 Person 的 value 的总和与平方和的进行动态维护,并通过如下公式进行计算:

    img

  • 同时对于 query_shortest_path 指令的返回值,尽管只能以 BFS 进行遍历,但我另外使用了 Cache 为同一个连通分支存储已经查询过的 query_shortest_path 的值,进一步提高了查询和遍历的效率

    Homework3

  • 第三次作业架构的类图如下:

    img

  • 本次作业没有新增的优化内容,只是按照题目要求实现了 Message 相关的功能

二、本单元的测试过程

  • 黑箱测试和白箱测试是软件测试中常用的两种方法
    • 黑箱测试是基于软件的功能需求和规格说明进行测试,测试人员不需要知道软件内部的实现细节。测试者将输入数据输入系统,然后检查输出结果是否符合预期。这种测试方法类似于用户的角度,测试的是系统的功能和用户体验
    • 白箱测试则是基于软件的内部结构和代码进行测试,测试者需要了解软件的内部逻辑和结构。白箱测试主要用于检查代码的正确性、执行路径覆盖率等,以确保软件在内部实现上是正确的
  • 单元测试是对软件中的最小单元进行测试,通常是函数或方法。功能测试是验证软件的功能是否按照规格说明正常工作
  • 集成测试是测试多个模块或组件在一起协作时的表现
  • 压力测试是评估系统在负载压力下的表现
  • 回归测试是在软件修改后重新执行之前的测试用例,以确保修改没有引入新的错误或影响了现有功能
  • 在数据构造方面,有几种策略可以使用。一种是使用真实的生产数据,这样可以更接近真实环境,但可能涉及隐私问题。另一种是使用随机数据生成器生成测试数据,以覆盖各种边界条件和异常情况。还可以使用边界值分析和等价类划分等技术来选择测试数据,以确保测试覆盖全面

三、性能问题与修复情况

  • 本单元主要产生的性能问题来自 query_shortest_path 的计算,由于性能上的微小差异,直接使用深度搜索的方法会在极特殊的情况下产生 TLE 问题,因此我加入了 Cache 机制以实现效率的提高
  • 另一个值得警醒的教训就是关于 CompareTo 函数的重写,一定要考虑整形溢出的问题,不应简单地使用减法而是 Integer 类提供的静态方法来进行大小比较

四、对规格与实现分离的理解

  • 规格与实现分离是软件工程中一项重要的设计原则,指的是将软件系统的规格与实现分开,以便更好地管理和维护软件系统
    • 清晰的责任分离:规格描述了系统应该做什么,而实现则描述了如何实现这些功能。通过将规格与实现分离,可以使软件系统的责任更加清晰明确,有利于团队成员在不同层次上的协作与沟通
    • 提高可维护性:当规格与实现分离时,如果需要修改系统的功能或行为,只需修改规格而不影响实现。这样可以降低修改的风险,并且更容易理解和验证系统的行为,从而提高软件系统的可维护性
    • 支持多种规格:规格与实现分离使得系统可以支持多种规格,例如可以根据不同的需求编写不同的规格,而共享相同的实现。这样可以提高系统的灵活性和适应性,更好地满足用户的需求
    • 测试与验证:规格与实现分离也有利于测试和验证软件系统。通过将规格作为测试的基础,可以更好地设计和编写测试用例,并且能够更容易地验证系统的正确性和一致性
  • 总的来说,规格与实现分离是一种良好的软件设计原则,有助于提高软件系统的可维护性、灵活性和测试性,从而促进软件开发的质量和效率

五、利用规格信息来更好的设计实现Junit测试,以及 Junit 测试检验代码实现与规格的一致性的效果

  • 设计 Junit 测试用例:基于JML规格信息,可以更准确地确定需要测试的行为和约束。例如,如果某个方法有前置条件和后置条件,可以将这些条件转化为测试用例中的测试条件。这样设计的测试用例将更全面地覆盖代码的各种情况,从而提高测试的有效性
  • 验证规格的一致性:
    • 通过编写 Junit 测试来检验代码实现是否符合JML规格的约束。测试用例可以检查方法的前置条件和后置条件是否得到满足,以及方法的行为是否符合预期。如果测试失败,说明代码实现与规格存在不一致,需要进一步调查和修复
    • 利用JML注解:在编写 Junit 测试时,可以使用 JML 注解来指示测试用例的前置条件、后置条件和不变量。这样做可以使测试代码更加清晰和可读,同时也能更好地与 JML 规格对应,帮助验证代码的一致性

六、本单元学习体会

  • JML规格要求我们对软件系统的需求有深入的理解,包括对输入、输出、边界条件等方面的考虑。通过学习和编写JML规格,我更加清晰地理解了软件系统的功能和约束。同时JML规格可以作为测试用例的基础,帮助我们设计和编写更加全面和有效的测试用例,通过编写JML规格并将其转化为测试用例,我意识到了测试在软件开发过程中的重要性,并学会了如何编写高质量的测试用例
  • 在架构和规格设计层面来编写 JAVA 程序,的确给人以全新的体验,程序开发又有了新的思维高度
...全文
49 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

301

社区成员

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

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