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的更多相关文章
随机推荐
- c++ readIntger writeIntger
类似CE的read/writeIntger函数(外部) #include <iostream> #include <Windows.h> #include <TlHelp ...
- golang官方嵌入文件到可执行程序
目录 前言 示例程序 嵌入文件直接访问 嵌入文件列表 总结 前言 在go官方出嵌入文件的方法前我在网上找过,并且自己还研究过,虽然没有问题,但是既然官方支持还是用起来吧. 看了下go源码embed/e ...
- [转]LINUX下编译c++11的代码
转载地址: https://blog.csdn.net/lwb102063/article/details/50445201 C++11,(即ISO/IEC 14882:2011),是目前的C++编程 ...
- 深入理解Java内存模型JMM
本文转载自深入理解Java内存模型JMM JMM基础与happens-before 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执 ...
- Angular的工作原理
来源:https://www.cnblogs.com/moriah/p/6096998.html <!doctype html> <html ng-app> <head& ...
- 页面强制重新加载js的办法
1:线上强制重新加载js的办法 js后缀?v1.0 2:开发环境强制重新加载js的办法?now=Date.now() 3:开发环境强制重新加载js的办法F12进入调试页面选择network下单 dis ...
- python中yield的用法详解——最简单,最清晰的解释
转载自https://blog.csdn.net/mieleizhi0522 首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都 ...
- Java 程序员每天都在做什么?
作为一名 在大.中.小微企业都待过 的 Java 开发者,今天和大家分享下自己在不同公司的工作日常和收获.包括一些个人积累的工作提升经验,以及一些 Java 学习的方法和资源. 先从我的第一份 Jav ...
- node.js详解1
1.运行node脚本 新建app.js 写入代码console.log('hello') cmd终端执行 node app.js 2.node读取环境变量 浏览器地址:ht ...
- java 基础语法学习
kuangstudy 注释 单行注释 多行注释 文档注释 public class HelloWorld { public static void main(String[] args) { //单行 ...