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的更多相关文章

随机推荐

  1. Python算法_三种斐波那契数列算法

    斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列&qu ...

  2. 执行Python程序时模块报错

    1. 在执行python程序时遇到 'ModuleNotFoundError: No module named 'xxxxx'' : 例如: 图片中以导入第三方的 'requests' 模块为例,此报 ...

  3. 开源OA办公平台搭建教程:O2OA+Arduino实现物联网应用(一)

    O2OA平台是一个企业办公类系统的低代码开发平台,更够方便的开发和部署协同办公.流程管理等应用,但它能做的远不止这些,今天这个案例就为大家介绍一下,O2OA可以做的更多. 最近对养鱼产生了浓厚的兴趣, ...

  4. 用cmd编译java程序

    此时D:****/WorkSpace/javaCode文件夹中有一个Hello.java程序(****为任意的位置,不重要) 1 public class Hello { 2 public stati ...

  5. 生产者与消费者以及ActiveMQ

    生产者与消费者以及ActiveMQ 一. 多线程实现生产者与消费者 1.1 生产者与消费者头文件 #pragma once #include <iostream> #include < ...

  6. System.IO.IOException:“找不到资源“window1.xaml”。” 解决方法

    报错:找不到资源"window1.xaml 原因:在编译时使用的是en-US选项进行编译并生成了en-US为名的文件夹,里面包含了可本地化的内容:但是你的本地系统使用的是zh-CN,在你运行 ...

  7. 《C++ Primer》笔记 第5章 语句

    空块的作用等价于空语句. case标签必须是整型常量表达式,default也是一种特殊的case标签. 标签不应该孤零零地出现,它后面必须跟上一条语句或者另外一个case标签. 如果在某处一个带有初值 ...

  8. 使用python进行接口自动化测试,批量执行测试用例

    工作中,使用python的requests库进行接口自动化测试是一个比较不错的选择,今天就以某网站的免费接口为例,展示以get请求进行批量执行测试用例.话不多说直接开讲 分析一下接口信息, 请求地址: ...

  9. 开发过程中遇到的js知识点总结,面试题等,持续更新

     1.Object.freeze() 方法用于冻结一个对象,即将对象设置为不可扩展.将对象的所有自有的属性和方法(包括Symbol值的属性和方法)配置为不可配置,不可写. Object.freeze( ...

  10. pytorch(08)数据模型的读取(2)

    import numpy as np import torch import os import random from PIL import Image from torch.utils.data ...