2024年春BUAA OO第三单元总结

0.前言

嗯,抛开U3学习过程一些影响学习体验的意外因素,我个人认为JML的思想还是有一定可取之处的。

层次化设计中,类向外界提供的接口如何设计的易用?使用者调用时怎么能确认方法正确实现了需求,如何甄别其副作用?

U1单元时我学习到了命令-查询分离原则。这是一种在副作用与返回值之间的契约。它能在一定程度上避免我们调用接口时产生副作用,缺点也显而易见:不够灵活。所以,发明一种特殊的语言,来约定方法作用,应是一种理所应然的尝试。带着上述的问题,我在学习过程中不断体会,也可以说是有所收获。

值得一提的是,契约式编程的思想最早正是由 Bertrand Meyer提出。而我在U1时学习的那本《面向对象式软件构造》,正是他提出这种契约式编程的著作。想起来颇为感慨。

1.测试过程

1.1黑箱测试与白箱测试

进行黑箱测试时,测试者站在用户的角度。不关注代码的具体实现,只根据软件规格说明书等文档来检验软件的输出需求。此外,还会关注用户交互体验感,以及运行效率等因素。测试者可能会针对不同需求构造测试数据,来进行边界条件测试,压力测试,错误处理测试等,检验软件在实际使用过程中的表现。

进行白箱测试时,测试者主要从开发者(程序员)的角度出发,通过静态检查,单元测试等方法,关注软件实现的内部逻辑,算法、数据结构等,以及是否能有效覆盖各个代码路径。主要指标为代码覆盖率、路径覆盖率,错误处理等。白箱测试是针对方法本身进行检测或优化的手段,需要检测者对整个系统以及代码实现细节具有较好的掌握。当我们站在整个系统的视角下审视某个方法,或者需要进行优化,白箱测试就比较有用了。

1.2具体测试方法

  • 单元测试:单元测试用于检验程序中的最小可测试单元——通常是函数、方法或类。由于如果开发完成后整体调试想必会十分困难,所以对单元进行测试可以按模块检测正确性,降低了复杂度。

  • 功能测试:基于黑盒测试实现,检查软件是否能正常实现功能,正常进行错误处理,在压力测试下性能表现如何,以及性能如何。

  • 集成测试:模块生产完后当然要组装才能成为产品,对于产品整体也当然需要进行。可以验证各模块之间是否正确协作。

  • 压力测试:通过模拟高负载运行条件检测软件实现。如高并发访问,大数据量处理,长时间运行以及异常情况处理。由于软件在交付使用时可能面临类似情况,所以有必要进行压力测试。

  • 回归测试:确保更新或迭代有没有对原有方法造成影响,比如修改了原有方法依赖的数据结构等。而软件最好做到对扩展开放,对修改关闭。

1.3数据构造策略

(没搭评测机)但作业中主要应该关系压力测试,避免TLE的出现,以及对边界条件的检测。啊啊啊啊可恶的负数ID!

2.架构设计与图维护

在第三单元中,主要架构被JML已经被JML设计好了。由于在Person中管理acquaintance, 所以实质上是使用了邻接表存储。更总体一点,本单元主要架构如下:

Network中只保管着Person和未发送的Message。而每个Person负责管理自己的tags、acquaintances和messages. Tags里再管理其中的Person.

3.性能分析与实现设计相分离

倒是没出过什么性能问题说一下实现的优化吧

  • 第九次作业中,主要是引入了并查集维护关系网络,便于检查blockSum,在mr时为了避免不必要的维护并查集选择脏位推迟维护;对于三元环数量选用动态维护,每次ar或mr时遍历公共熟人加以修改。

  • 第十次作业中,主要是使用大顶堆维护Person的熟人队列,这样修改BestID时复杂度为O(ln n)。同时对Tag中的Age等信息进行动态维护。

  • 第十一次作业并未用到优化算法,但是addMessage消息方法中使用了Linklist来存储消息。

设计与实现相分离,对于开发者自身,对于与开发者协同的其他开发者、测试者来说都具有意义。

对于开发者自身,可以自由采取实现方式,只需要保证对外提供的接口功能正确即可。减小了模块与其他部分的耦合度,也使得软件功能可以被充分优化。

对于其他软件开发者以及测试者,规格的出现允许并行开发的实现。各开发人员可以各司其职,,最终将各模块合并。

4.Junit测试

既然JML指示了方法的实现,那我们也必然依据JML编写JUnit。依据JML,我们能分析出待检测方法的期望功能,并针对性构造测试。也就是检测在输入数据满足前置条件时,该方法是否满足了后置条件。

当方法有前置条件时,数据满足前置条件才要进行后续检测。在整个检测过程中,需要纳入考虑范围的有三个因素:后置条件,可修改范围内的数据,不可修改范围内的数据。

后置条件需要保证满足,可修改范围内的数据,按后置条件修改;不在可修改范围内的数据也需确保不被修改。

5.学习体会

前两个单元让人欲罢不能,而第三单元如缓冲剂般,给了我们反思与总结的时间。我在前两个单元中积累的一些问题,在第三单元中得到了解答。系统应如何层次化的设计?我似乎更加清晰了。

OO这门课想让学生们学的,我想我已经学到一些了。U4,真有些迫不及待呢~

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值