BUAA_2020_OO_UNIT2_REVIEW
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.........)
BUAA_2020_OO_UNIT2_REVIEW的更多相关文章
随机推荐
- 10月份上线的NGK有什么不同之处?
近日,有小道消息传出公链项目NGK即将在10月上线的消息.各大社区纷纷开始布局,市场中关于NGK项目的消息也变得更多了起来.仅是社区热度这一点,对比之下就已经优于很多项目,那么是否还有其他优势呢?让我 ...
- BGV作为拥抱新时代的DeFi项目,是否有能力超越YFI?
随着今年11月DeFi蓝筹股们的集体反弹,市场变化让投资者明白,不能再死守诸如COMP和MKR的古典DeFi了,只有拥抱新时代的DeFi们才有赚钱的可能,不要和钱过不去.经过9-10月的回调,11月的 ...
- django学习-25.admin管理后台里:把表名称和表字段名称的展示值都由英文显示改为由中文显示
目录结构 1.前言 2.完整的操作步骤 2.1.第一步:修改模型类Article 2.2.第二步:重启服务 2.3.第三步:退出登录并再次成功登陆admin管理后台 2.4.第四步:查看最新的表名称展 ...
- MacOS下PHP7.1升级到PHP7.4.15
最近写SDK的时候需要用到object类型提示符,PHPStorm智能提示说需要PHP7.2以上才能支持这种类型提示. 我一查我本机的PHP是7.1.30版本,于是考虑升级一下PHP版本. 首先要尝试 ...
- vscode 配置表
{ "git.ignoreMissingGitWarning": true, "editor.multiCursorModifier": "ctrlC ...
- CDN失效时使用本地js文件:window.jQuery || document.write
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></ ...
- Kubernetes-3.安装
docker version:19.03.14 kubernetes version:1.19.4 本文介绍使用kubeadm安装Kubernetes集群的简单过程. 目录 使用kubeadm安装k8 ...
- kali 将家目录下的中文文件名修改成英文
修改vim ~/.config/user-dirs.dirs 打开`文件,删除那些中文目录 在目录下创建英文目录 重启 参考 https://elementaryos.stackexchange.co ...
- Mac创建Root用户
1.打开Mac终端管理工具 前往-实用工具-终端 2.用命令的形式创建账户 sudo passwd root 3.输入当前登录用户密码 4.输入root用户密码并验证
- tibco EMS 8.2.0安装
安装环境 序号 项目 值 1 OS版本 Red Hat Enterprise Linux Server release 7.1 (Maipo) 2 内核版本 3.10.0-229.el7.x86_64 ...