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类负责不断从输入流中读取命令,如果 ...
随机推荐
- IntelliJ Idea Error Address localhost 1099 is already in use.
Reference: https://stackoverflow.com/questions/38986910/intellij-idea-address-localhost1099-is-a ...
- wxWidgets源码分析(8) - MVC架构
目录 MVC架构 wxDocManager文档管理器 模板类创建文档对象 视图对象的创建 创建顺序 框架菜单命令的执行过程 wxDocParentFrame菜单入口 wxDocManager类的处理 ...
- android上实现0.5px线条
转: android上实现0.5px线条 由于安卓手机无法识别border: 0.5px,因此我们要用0.5px的话必须要借助css3中的-webkit-transform:scale缩放来实现. 原 ...
- 内核报错kernel:NMI watchdog: BUG: soft lockup - CPU#1
1.现象描述 系统管理员电话通知,描述为一台服务器突然无法ssh连接,登录服务器带外IP地址并进入远程控制台界面后,提示Authentication error,重启后即可正常进入系统,进入后过20分 ...
- MongoDB4.2 副本集扫盲说明
说明: 在扫盲MongoDB相关的一些知识的时候,顺手做下笔记.本文将说明副本集相关的内容.在比较早之前已经对这些有过说明,可以看MongoDB 副本集的原理.搭建.应用.MongoDB中的副本集是一 ...
- 痞子衡嵌入式:盘点国内Cortex-M内核MCU厂商高性能产品
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是国内Cortex-M内核MCU厂商高性能产品. 在8/16位中低端MCU领域,国内厂商的本土化产品设计以及超低价特点,使得其与国外大厂竞 ...
- 使用伪类(::before/::after)设置图标
使用伪类(::before/::after)设置文本前后图标.减少标签的浪费,使页面更加整洁. 如图: <!DOCTYPE html> <html> <head> ...
- BuaacodingT651 我知道你不知道圣诞节做什么 题解(逻辑)
题目链接 我知道你不知道圣诞节做什么 解题思路 第一句话:x,y不都为质数. 第二句话:对于xy=t,存在唯一一种x+y使得x,y不都为质数. 第三句话:对于x+y=s,存在唯一一种t=xy使得对于任 ...
- 在go中通过cmd调用python命令行参数量级过大问题解决
问题描述如下: 在go中使用cmd调用python命令行 cmd := exec.Command("python", "dimine/Kriging/matrix.py& ...
- .Net5 下Dictionary 为什么可以在foreach中Remove
在一个讨论群里,看见有人说Dictionary可以在foreach中直接调用Remove了,带着疑问,写了简单代码进行尝试 class Program { static void Main(strin ...