面向对象2022-第三单元作业总结
1|0面向对象2022-第三单元作业总结
-
1|1分析自测过程中如何利用JML规格来准备测试数据
根据JML代码,可以枚举出所有的分支,从异常情况再到普通操作,构造具有针对性的测试数据,再检验输出结果是否与预期结果相同。下方的queryValue
是一个相对简单的例子。
这个函数存在4条分支,首先是不包含id1,其次是不包含id2,然后是id1和id2两者并不相连,最后才是输出正确结果。针对这四种可能,可以构造一个包含3个人的例子,1和2相互连接,1和3不连接。前两种情况就可以对应queryValue(0, 1)
以及queryValue(1, 0)
,后两种情况是queryValue(1, 3)
以及queryValue(1, 2)
。如此一来,这个函数中所有的情况都被列出,通过测试后则可以保证本函数自身功能无误。当然,也要保证函数不能有多余的副作用。
再复杂一些的函数,同样也是根据JML来遍历可能性构造测试数据,只是有时读起来要费神一些。
-
1|2梳理本单元的架构设计,分析自己的图模型构建和维护策略
得益于社交网络在现实生活中的形象性,本单元的架构也简单易懂。在代码运行后会根据MyNetWork
生成一个社交网络图,第一个单元只在这个图中添加了MyPerson
和MyGroup
,你可以想象MyGroup
就是网络中的俱乐部,MyPerson
则是里面的成员。当然,MyPerson
可以不是任意一个俱乐部的成员,也可以在多所俱乐部中做客。二三单元则是让这个社交网络更加热闹起来,彼此之间可以发送邮件,而邮件的形式也变得多样。
总体的架构已经很清楚了,不过针对要求指令,代码中还实现了信息维护。如query_value
,要求返回一个俱乐部中所有成员的相互价值(若两个成员是熟人,则存在一定价值)之和。JML代码中对此给出了一个n2复杂度的代码,实现功能完全没有问题。但是,由于query_value
指令没有被限制使用次数,多次调用该指令将使得评测超时。其余的一些量,比如俱乐部成员的平均年龄,由一个人展开生成的最小生成树,也需要进行维护。
不过维护并没有听起来那么简单,一是需要考虑维护成本和实用性,二是维护的正确性。维护的成本是指每次条件修改时都需要修改有关变量,而这种修改其实是不属于JML说明的副作用,使得单条指令的性能下降了。维护的实用性则是这样的维护是否有价值,比如由英国科学家林柯卡特提出的LCT算法,可以实现对最小生成树的维护。但如果评测指令中请求输出最小生成树的次数很小,比如10000条指令中最多只有100次输出,那么这种维护可能并不值得。
还有一点就是维护的正确性,要求考虑到条件改变的所有情况。比如你作为club的管理员,那么就不仅要在成员入会的时候修改信息,在成员离开的时候也要进行修改。
-
1|3按照作业分析代码实现出现的性能问题和修复情况
多亏了和舍友的讨论以及往年学长的博客,对于可能出现的性能问题都有效规避了。此处谈一下看到的别人中弹的情况吧。第一次代码中有些同学只看到了较为复杂的isCircle
函数,忽略了不限次数的看似简单无害的query_value
,没有在有限时间内完成。不过在经过这一次的经验学习后,也转换为使用维护策略,后期通过了测试。
-
1|4Network进行扩展,并给出相应的JML规格
“天下熙熙,皆为利来;天下攘攘,皆为利往。“ ——司马迁 《货殖列传》
此处我们假设4种Person
均是通过原有的addPerson
加入到网络中,在解析时进行分类到不同的容器中。此处或许还要额外设计商品Product
类,并且也要存在NetWork
中,类似于表情包的存在。Advertiser
,Producer
,Customer
也会有涉及到Product
的属性。不过也有可能被简化,只是作为记录。
核心业务功能1号:int querySales(int id)
,实现销售额查询
核心业务功能2号:void buyProduct(int customerId, int advertiserId, int ProducerId, int productId)
,购买产品,客户向广告商发送请求购买产品,然后广告商从生产者处转移商品。其实这个函数有点依赖于架构,因为如果只是各方的金钱数目变化,则本质上和产品没有关系。而且是否需要考虑货存的数目,生产者可以生产什么种类的产品也需要考虑。鉴于此,我们简化的认为生产者一定可以给出相应产品,并不把产品这个概念真正的纳入代码中,而仅是从逻辑变化上来理解这一过程。(甚至不考虑消费者钱够不够)
核心业务功能3号:int storeProduct(int id)
,上市新产品。
-
1|5本单元学习体会
本单元是最容易对拍的一个单元,和小伙伴们一起对拍,最棒!
JML的确很好,将规则描述的很清楚。不过读起来并不是特别容易,为了实现准确性而失去了一些简洁性,或许还可以进行改进。但是借助于JML方法进行单元化测试时,的确可以很好地覆盖所有可能性。
__EOF__

本文链接:https://www.cnblogs.com/lqhthethird/p/16334249.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效