OO第二章总结

一、设计策略

在这三次作业中,我的线程设计基本没有发生变化,都是输入、电梯、乘客三类线程,其中输入线程负责解析输入并发送给调度器,电梯线程负责接收调度器指令进行移动,乘客线程负责检测电梯状态并要求上下电梯。下面是第三次作业中三类线程的时序图:

 

二、程序结构

与线程设计类似,三次作业的整体结构也变化不大。前两次均为三种线程外加一个调度器;第三次作业增加了分派器用于选择每个人上哪个电梯,而调度器则基本沿用第二次的。

 

复杂度方面,最复杂的方法是分派器的分派方法和调度器中决定电梯运行方向的方法,这两个方法都需要考虑多种情况,相应地,bug也最多

 

单一功能原则方面,我的电梯类只负责按调度器的指令上下楼、开关门,而完全不关心乘客之类的事情;调度器知道乘客的位置和目的地,负责给电梯发指令,但不关心乘客是否要上下电梯;乘客知道自己的目的地,自行决定是否上下电梯,暴露给乘客的关于电梯的信息只有电梯是否在该乘客关心的楼层;分派器根据乘客请求和电梯停靠楼层选择电梯,不关心选择后这台电梯如何运行。

开闭原则方面,因为这三次作业后不会再扩展它了,就没有很好地落实开闭原则,各种分派调度算法都是写死的。因为不需要扩展,就没有在自己写的类之间使用继承和接口,所以后三条原则无从谈起。

 

三、BUG分析

第一次作业中,我为了套用一对现成的方法,把“有乘客出现”和“输入结束”两个无关的事件用同一个标志变量的不同取值表示,这样在电梯线程尚未处理前一个事件时紧跟后一个事件的情况下会出现覆盖的情况,导致电梯提前下班。

第二次作业中,我的调度算法中有一种情况“当前楼层上下都有楼层需要去时,保持原运行方向不变”,而未考虑到停止时同时出现上行和下行的乘客,就保持停止不变了(手动捂脸)。

第三次作业中……

 

强测喜提0分。原因是我本打算需要换乘且能在出发和目标之间换乘时,就在中间换乘,不能在中间换再选择1楼换,先写了个从低到高的循环,把下楼的情况扔进TODO了,然后  就  忘  了  。出现下楼需要换乘时会从int范围绕一大圈循环回来,导致CTLE。

 

四、心得体会

提交前记得看TODO

记得看TODO

TODO

posted @ 2019-04-23 17:15  rMuchan  阅读(126)  评论(0编辑  收藏  举报