学不会OO的第二单元反思
总体情况:第一次71+被锤四次,第二次76+互测无伤,第三次未通过公测
一、多线程设计策略
总体策略:让电梯去跑,到了哪层就检查能不能接人,接了就接着跑。
第一次:设input线程作为生产者,设transport线程作为消费者,实现生产者-消费者
第二次:采用取模分配的方式,每次轮流检查多个电梯并进行下一轮操作
第三次:设公共队列Queue负责解决换乘问题(但最后未成功实现)
二、可扩展性
第一次:预设了人数限制,便于后续扩展
第二次:设置了可停靠楼层记录数组。
三、程序结构分析
第一次作业
源代码说明 提供了四个class
-
Main 初始化,启动多线程
-
Input 解析输入并送入电梯
-
Transport 激活电梯运行
-
Elevator 电梯核心控制代码
核心思想
第二次作业
提供了五个class
-
Main 初始化,启动多线程
-
Input 解析输入并送入电梯
-
Transport 激活电梯运行
-
Elevator 电梯核心控制代码
-
Control 控制程序结束?
四、程序bug分析
第一次测试出现了运行跳层的问题,经过检查是输出的位置加了一个错误的条件,删掉后即可解决。
第二次未测试出WA性质的bug,出现了一次RTLE,初步判断是由于调度策略不好引起。在重新提交后通过bug修复。
第三次未通过公测,根据分析有两方面:一方面是在对于是否接人的判断上处理不当,导致换乘后第二个电梯无法准确接到乘客;另一方面是调度时采用同步的方式导致减慢了AB梯的速度,且采用了全楼层轮转,大大加大了时间。一方面考虑可以对PersonRequest进行操作来满足换乘后检查的需求,另一方面也考虑更换电梯的算法进行重构。
五、互测策略
互测主要抱着学习的态度,主要测试点为自己构造的一些简单以及和同学讨论的一部分。采用的是手工评测
根据自己出现的情况,主要检查点为在输入的同时有没有出现运行过快以及最后出现丢人等情况。
还是需要学习一下重定向等方法构建自动化评测吧。
六、心得体会
两个单元过去了,都存在第三次作业无法按时通过测试的情况,问题是每次都会在一个比较重要的部分卡住然后一直到最后都没有解决。在这里以后还是要去主动寻求帮助,解决知道大概思路但是写不对的情况。电梯作业是我上OO前所听说的最多的。前两次作业我都没有出现线程安全错误,也让我比较舒心。第三次到互测后才知道可以通过打表的方式来解决换乘的问题,这也反映出我对之前学习过的一些方法不会迁移。希望在之后的学习中能够做到融会贯通吧。