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的更多相关文章
随机推荐
- moment.js 时间格式转换
moment.js 时间格式转换 moment.js 时间转化 bug 格式错误 bug 02:00 => 14:00 format HH 与 hh HH === 24 小时制 hh === 1 ...
- PM2 in depth
PM2 in depth ecosystem.config.js module.exports = { apps : [{ name: "app", script: ". ...
- Captain technology INC:高性能电池助力新能源车企销量暴涨
来自七个欧洲国家的11个合作伙伴共聚一堂,投身于HyFlow研究项目,共同开发一种可兼顾高性能和能源需求的混合氧化还原液流储能系统.为此,科学家们希望将高性能钒氧化还原液流电池与超级电容器相结合. 到 ...
- 云原生系列6 基于springcloud架构风格的本地debug实现
debug是程序员在日常开发中最常使用的操作, 那么,你是如何快速在微服务架构风格下快速debug后端服务呢? 开发现状 开发的理想状态 本地调测的使用步骤 登录智能网关 如果集成开发环境是在本地局域 ...
- 17_MySQL分组查询的应用
本节涉及SQL语句: -- 分组查询 SELECT deptno,AVG(sal) FROM t_emp GROUP BY deptno; -- 四舍五入 SELECT deptno,ROUND(AV ...
- epoll使用
epoll通过下面3个epoll系统调用为用户提供服务. (1)epoll_create系统调用 epoll_create在C库中的原型如下: int epoll_create(int size); ...
- [C语言学习笔记五]复合语句和操作符的区分
复合语句的概念和用法 在部分时候,语句必须要与其他语句相结合才能实现应有的功能.放在花括号 {} 里的代码叫做复合语句. 例如: int a,b; if (a == b) ... ... /* 这一部 ...
- call、apply和bind的实现
call方法 基础版, 只能修改指向,不能传参 Function.prototype.myCall = function(context) { // 获取调用者,这里为bar context.fn = ...
- Ability之间或者进程间数据传递之对象(Sequenceable序列化)
鸿蒙入门指南,小白速来!0基础学习路线分享,高效学习方法,重点答疑解惑--->[课程入口] 这两天51cto上的一个粉丝朋友问了我一个问题,Ability之间使用Sequenceable序列化传 ...
- docker启动ubuntu的桌面环境
一.概述 由于最近一段时间在家办公,国内服务器在阿里云,国外站点在aws.家里的移动宽带比较差,无法访问aws. 所以尝试在阿里云启动docker,找到一个lxde桌面环境的ubuntu镜像. 二.启 ...