OO第二单元总结
1. 设计策略
- 总的来说,三次作业没有大的重构,都是使用了多线程进行电梯调度,输入线程和运行线程分离,主要的不同在于三次电梯调度器线程的数量有所不同,第一次为一个,第二次为n个,第三次是可添加的。
1.1 第五次作业
- 多线程刚上手,几乎不会写,一开始对对多线程的“锁”和“synchronized”关键字的理解出现了偏差,导致一开始架构出现了大问题。
- 最后在同学的指点下,理解了部分内容,顺利构建出大致的架构,使用一个等待队列,一条输入线程,和一个调度器线程,调度器线程主要用来控制电梯,等待队列主要用来处理请求和存放等待的人。
- 但是由于在调度算法上出现了致命故障,导致实际运行时间超时(三个点),强测只得到56分。
1.2 第六次作业
- 仅仅比第一次电梯多了几条线程。
- 完全重写了上次的不知道什么算法的调度算法,查阅相关资料,决定使用相对简单的SCAN算法,并重写了相关接口。
- 并顺便修复了第一次作业的bug。
- 由于这次支持多部电梯并行运行,于是我给可能存在线程安全问题的方法和代码块都用对象锁控制起来。
- 并完善了电梯相关属性(人数,可运行楼层,运行方向等)增加了部分可扩展性。
- 最终强侧由于出现了极端情况的死锁(WA一个点),经发现是某个方法未加锁造成,bug修复时修改。
- 强侧得到89分。
1.3 第七次作业
- 比上次电梯增加了动态增加电梯的选项,于是增加了电梯启动器,一开始启动线程启动三个电梯,后续调用方法增加电梯。
- 完善了电梯相关属性(电梯分类,电梯名称等)使用工厂模式创建电梯。
- 算法还是沿用第二次的SCAN算法,但是增加了换乘,于是需要一个换乘调度器
- 由于本人技术有限(
太懒),换乘调度采用了最暴力的先找中间后找两边的垃圾算法,(懒得搓图算法) - 最后由于性能原因,强侧得到89分
1.4 总结
- 最后一次作业结构图:
- 这个单元我在设计逻辑上自我感觉明显比上个单元强了不少,在动手写代码的时候更多的想的是各个结构对象之间要做什么,需要进行什么样的交互,而不是顺序的过程是什么,也尽量的把做一件事的方法单独拿出来,做到“一个方法不干两件事”。
2.扩展性
关于第七次作业
2.1 功能设计方面
- 本次电梯出现了动态增加的内容,如果出现了动态删除,电梯的启动器类也可以当做电梯的关闭器类
- 电梯的属性还可以进一步细化,比如电梯变成双子塔,只需要给电梯的楼层序号做相应变化即可。
2.2 性能设计
- 电梯的调度算法我是独立于电梯运行的,也就是说,如果想提升性能,只需更换调度算法方法,与电梯指令接口配合即可,无需重构代码
3.程序结构
三次作业并未重构,所以主要分析第七次作业
3.1 复杂度
除了换乘设置方法复杂度较高,其余较好。
总体复杂度比第一单元降低不少。
4. bug与发现bug
4.1 bugs
- 第五次作业调度算法致命故障,于是在第六次重写,(再也不敢自编算法)
- 第六次作业边界条件考虑不周,死锁。
- 第七次作业没有bug
4.2 found bugs
- 本单元作业未使用自动评测,主要通过自己在中测时踩的一些坑来hack,也取得一些加分,主要还是hack到一些死锁的同学。
5. 心得体会
- 本单元作业结束了,我第一次体验到了多线程程序是多么难维护,我之前还经常骂多线程性能差,一核有难,15核围观,自己亲身体验了,才知道其中的奥秘,醍醐灌顶。
- 同时,更进一步加深了OO的认识,明白了要知道对象应该“做什么”,而不是一步一步怎么做,在下一单元我也会继续努力写OO
- 最后感谢各位老师助教和大佬对我的指点和支持(@ZTY老师 @GYF助教 @Hangsbug @蓝头像 @胡歌滚 @笑死羊 @林雨桐 @prime21 @t123yh @bear @cjb @wpb @my @yzm @jyc @kongyou.........)