BUAA-OO-2021 第四单元作业

BUAA OO 第四单元总结

作业架构设计

第一次作业

自己加了 MyClass、MyOperation、MyInterface 几个类来处理相关的询问。

另外加了一个 MyWrongTypeException 来处理属性类型异常和参数类型异常。

实际上还应该补一个类用来专门处理重名元素异常的,但由于想到这点时已经是第二次作业了所以就懒得改了。

所有询问都可以 \(O(n)\) 暴力处理,只需要注意在各种遍历祖先的 \(\text{dfs}\) 操作中及时剪枝即可。

image

第二次作业

本次作业加入了顺序图和状态图,不过和第一次作业没什么本质区别,新加入几个类就可以解决。

image

第三次作业

本次作业新增了模型有效性检查,实际上还是暴力 \(\text{dfs}\)。每个类的检查都是可以 \(O(n)\) 完成,总复杂度 \(O(n^2)\)

另外受代码行数上限所迫,本次作业把类图、顺序图、状态图三个模型分开处理了,感觉架构清爽了不少。

image

测试与BUG

本次作业由于生成样例比较麻烦,再加上互测取消、ICPC 邀请赛、考期将至等各方面原因,就放弃自测了。

第一次、第二次作业均没有 BUG,第三次作业终于遭到报应了,经过检查,发现就是一个地方的 \(\text{dfs}\) 剪枝的判断条件写错了,实际上稍微写个样例自测一下就可以发现,果然不自测还是不行的。

四个单元中架构设计及OO方法理解的演进

第一单元

主要考察面向对象思维。本单元作业是表达式求导,从面向对象角度考虑,除了变元、常量是对象,加减乘除等二元运算符以及三角函数、幂函数等单元运算符也是对象。用好面向对象思维,就使得代码的可拓展性大幅增加,比如本人第二次作业到第三次作业的代码框架在功能实现方面基本没有改动,仅在优化方面进行了修改。

第二单元

主要考察多线程,包括多线程的同步,并发,同时学习了生成者消费者模型、单例模式、观察者模式。本单元作业是多线程电梯,代码设计时用到之前的设计模式,然后注意请求分配器和电梯的功能的解耦即可。

第三单元

主要考察 JML 的理解,包括对各种规格的理解,为未来的工程项目代码编写打好基础。本单元作业是一个社交网络,根据 JML 实现代码即可,注意时间复杂度控制,同时需要掌握一些图论的基本算法。

第四单元

主要考察 UML 的理解。代码方面其实暴力遍历或者 \(\text{dfs}\) 就可以解决,对于面向对象设计思维的要求感觉还不如第一单元。

四个单元中测试理解与实践的演进

第一单元

\(\text{C++}\) 递归下降随机生成数据和构造极端样例,然后用 \(\text{python}\) 自带库检验求导结果正确性,最后用 \(\text{C++}\) 编写测试脚本。

第二单元

\(\text{C++}\) 随机生成数据和构造极端样例,然后运行测试脚本,不检验正确性,仅检验多线程死锁和电梯调度引起死循环,然后肉眼检查是否存在离谱的错误。

第三单元

\(\text{C++}\) 随机生成数据和构造极端样例,然后运行测试脚本,通过与同伴对拍实现正确性检验。

第四单元

无测试,原因见上文。

测试总结

总的来说都是用 \(\text{C++}\) 编写随机数据生成器和测试脚本,然后中间结果用 \(\text{python}\) 或者对拍的方式检验正确性。在时间允许的情况下,本人还会考虑用 \(\text{C++}\) 编写正确性检验程序,比如去年计组,但今年实在太忙了,没有时间。由于随机数据强度不高,所以不能发现程序比较隐藏的 \(\text{BUG}\),同时也不容易测出 \(\text{TLE}\) 数据,所以在测试时还会构造一些极端数据弥补随机数据不足。

课程收获与改进意见

主要收获是第一单元面向对象的思维和第二单元的多线程设计,感觉第三单元、第四单元学的知识不多。

第三单元其实能看懂 JML 和理解规格即可,个人感觉布置一次作业即可,没必要布置三次作业,这三次作业没有本质区别,而且偏离了重点,感觉数据结构和图论反而成了主角。

第四单元的作业感觉比较谜,一开始没有任何提示,仅通过官方包来写代码感觉无从下手,如果官方题解没有外泄感觉写不出第一次作业。另外为了帮助学生对 UML 的理解,最好给一份尽量详细的样例,里面类图、状态图、顺序图的每种元素至少包含一个。

最后是实验课部分,首先实验课成绩和题解建议公布一下。另外实验课目的不明,个人想出了三个解决方案:

  1. 如果实验课的目的是希望让学生学到更多知识,那么可以取消实验课,在训练部分增加更多必做内容,并在提交截止时间后公布答案。
  2. 如果实验课的目的是希望检验学生的知识,那么可以参考计组和操作系统上机,禁止讨论,然后对作业内容进行增量开放。
  3. 如果实验课的目的是希望培养学生的合作能力,可以考虑把第三第四单元压缩成一个单元,然后在最后布置一个组队大作业来取代实验课。
posted @ 2021-06-26 15:56  jxm2001  阅读(60)  评论(0)    收藏  举报