OO第二单元总结——电梯
在电梯系列的作业中,笔者的整体架构几乎没有发生改变。现介绍如下,对于一个电梯系统,主要的工作步骤就是获取乘客请求、分派请求、执行请求。针对这样的工作模式,笔者设计了Elevator、Uselist两个主要的类(获取请求由主类完成)。在线程的配合方面,笔者采用的是消费者-生产者模式,Uselist相当于托盘,不同的是该类还负责向不同的电梯分配请求。
一、作业分析
(一)第一次作业
调度算法:严格采用可稍带原则,中途楼层遇到新的乘客就进行搭载。
UML类图:

复杂度分析:

由于只有一部电梯,因此方法都相对简单,在复杂度方面表现良好。
Bug分析:未出现bug
(二)第二次作业
调度算法:本次作业电梯数变为了多部,并且电梯增加了最大乘客数的限制。在调度方向,笔者采用了贪心策略,电梯每次都优先前往最近的有乘客的楼层,并优先去往距离当前楼层最近的楼层,在过程中仍然可稍带。从最后的结果来看,在不考虑单个乘客的等待时间的情况下,这种算法的效率很不错,达到了由及局部最优取得整体最优的效果。
UML类图

复杂度分析

在复杂度方面,本次作业的表现也较好。
Bug分析:未出现bug
(三)第三次作业
调度算法:本次作业电梯出现了不同的种类,并且不同的电梯可前往的楼层是不同的,这意味着需要换乘,除此,电梯的数量也会动态增加。笔者认为电梯数量的增加不是主要的问题,因此将作业的重点放到了换乘策略上。经过对楼层的分析,发现1层和15层是三种电梯都会到达的楼层,因此1层和15层就作为换乘的中转站。笔者采用的策略是当一个乘客进入电梯后,如果不需要换乘就前往相应楼层,如果需要换乘就根据乘客的目的楼层去往1层或者15层。这种调度方式的效率并不高,但是可以保证正确性。由于笔者能力有限,就没有做过多的优化。
UML类图

复杂度分析


可以看出部分方法被标红,被标红的方法主要的功能就是对乘客请求的调度,出现了很多对请求队列的遍历,在这方面笔者认为有很大的优化余地。但是值得注意的是,电梯的run方法也被标红,主要的原因是电梯线程在运行过程中需要大量的与请求队列进行读写操作,但是笔者还未想到如何降低电梯与请求队列之间的耦合度,这也是需要改进的一个方面。
Bug分析:在本次作业中笔者出现了重大的错误。C类电梯不能前往15层以上,而笔者错误的将C类电梯的可达楼层设置为了所有的奇数楼层。由于这个bug,在强测中只得到了35分,互测中也有被hack。但是bug修复中只修改了2行代码就完全修复了。出现了这样的错误笔者心情十分复杂,只能在之后多注意各种约束条件。
可扩展性:Uselist进行请求队列的管理,Elevator负责电梯的运行。比较符合SRP原则。但是对OCP、LSP、ISP、DIP几个原则上表现就不是很好。笔者分析后认为,对笔者来说第三次作业算是比较复杂的,在复杂程序的设计中,会出现思路不清晰,最后导致思绪复杂,使得原来各司其职的类混杂了多余的功能。在对类之间的协作上笔者还需要加强。
二、HACK策略
首先查看是否出现了轮询的情况。没有的话,就主要集中在特殊情况,比如:同一时间出现大量乘客(请求相同或者请求各不相同)、换乘的情况。
三、心得体会
在电梯系列的作业中,线程安全是一个重要的问题。笔者是第一次接触多线程相关的程序,因此在第一次作业中,感觉到很困难。但是经过了第一次作业之后,对于多线程的理解上,感觉就通透了很多。笔者比较满意的是,第一次作业设置的整体架构比较稳定,在之后的迭代中程序的整体架构没有发生大的变化,这给功能的迭代带来了极大的方便。这一点是笔者认为比求导系列作业有很大进步的地方。但是,在第三次作业中也出现了比较大的失误,对C类电梯的限制条件设置错误,导致了bug的产生,这是完全不应该的,希望能引以为戒。在作业的过程中,笔者也体会到了设计模式的精妙之处,采取适当的设计模式确实可以减轻设计的负担,因此笔者也认为要多多了解不同的设计模式,这对程序的设计是很有帮助的。
OO第二单元总结——电梯的更多相关文章
- OO第二单元多线程电梯总结
OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...
- OO第二单元多线程电梯总结分析
一.概述 这一部分的作业考察的关注点与上一次的作业有所不同,上一次的考察重点主要集中在输入输出的判定以及多态的考察上面,而这一次是让我们进行多线程程序的调度与开发.这次开发过程中最大的感受就是自己之前 ...
- OO第二单元总结——电梯调度问题
一.设计策略. 在三次作业中,多线程程序的实现分以下几个步骤: 1. 主线程Main类的创建多个线程. 2. 共享对象的synchronized锁保证线程之间的互斥访问. 3. 采用notifyAll ...
- 电梯也能无为而治——oo第二单元作业总结
oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...
- OO第二单元——多线程(电梯)
OO第二单元--多线程(电梯) 综述 第二单元的三次联系作业都写电梯,要求逐步提高,对于多线程的掌握也进一步加深.本次作业全部都给出了输入输出文件,也就避免了正则表达式判断输入输出是否合法的问题. 第 ...
- oo第二单元作业总结
oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...
- OO第二单元优化博客
OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- OO第二单元小结
OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...
随机推荐
- 用Python来控制Autocad的打印------以Pycomcad为例
from pycomcad import * #以pycomcad作为接口库为例 import win32com acad=Autocad() 打印最重要的设置都在上面的界面中,下面对这些个界面,用P ...
- docker封装nuxt项目使用jenkins发布
一.概述 vue项目可以打一个dist静态资源包,直接使用Nginx发布即可. 但是nuxt项目无法像vue那样,可以打一个dist静态资源包. 需要安装Node.js,并使用npm install ...
- token、cookie和session区别以及django中的cookie,csrf
参考:https://my.oschina.net/xianggao/blog/395675?fromerr=GC9KVenE [前言]登录时需要post的表单信息. 先跳过具体案例,讲解基础知识: ...
- Deep Unfolding Network for Image Super-Resolution 论文解读
Introduction 超分是一个在 low level CV 领域中经典的病态问题,比如增强图像视觉质量.改善其他 high level 视觉任务的表现.Zhang Kai 老师这篇文章在我看到的 ...
- springboot源码解析-管中窥豹系列之自动装配(九)
一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...
- 使用python进行接口自动化测试,批量执行测试用例
工作中,使用python的requests库进行接口自动化测试是一个比较不错的选择,今天就以某网站的免费接口为例,展示以get请求进行批量执行测试用例.话不多说直接开讲 分析一下接口信息, 请求地址: ...
- Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件
封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...
- Java 常用类——StringBuffer&StringBuilder【可变字符序列】
一.字符串拼接问题 由于 String 类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象. Demo: 1 public class StringDemo { 2 pub ...
- 苹果M1处理器Mac“翻车”:用户吐槽SSD
SSD如今被不少PC用户所推崇,其优势在于读写速度快.工作无噪音,不过,缺点是寿命较机械硬盘差点.厂商对SSD通常都会标注一个最大可写入量(TBW),提醒用户关注健康数据,以免掉盘等严重问题. 越来越 ...
- jdk 集合大家族之Map
jdk 集合大家族之Map 前言: 之前章节复习了Collection接口相关,此次我们来一起回顾一下Map相关 .本文基于jdk1.8. 1. HashMap 1.1 概述 HashMap相对于Li ...