在电梯系列的作业中,笔者的整体架构几乎没有发生改变。现介绍如下,对于一个电梯系统,主要的工作步骤就是获取乘客请求、分派请求、执行请求。针对这样的工作模式,笔者设计了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第二单元总结——电梯的更多相关文章

  1. OO第二单元多线程电梯总结

    OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...

  2. OO第二单元多线程电梯总结分析

    一.概述 这一部分的作业考察的关注点与上一次的作业有所不同,上一次的考察重点主要集中在输入输出的判定以及多态的考察上面,而这一次是让我们进行多线程程序的调度与开发.这次开发过程中最大的感受就是自己之前 ...

  3. OO第二单元总结——电梯调度问题

    一.设计策略. 在三次作业中,多线程程序的实现分以下几个步骤: 1. 主线程Main类的创建多个线程. 2. 共享对象的synchronized锁保证线程之间的互斥访问. 3. 采用notifyAll ...

  4. 电梯也能无为而治——oo第二单元作业总结

    oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...

  5. OO第二单元——多线程(电梯)

    OO第二单元--多线程(电梯) 综述 第二单元的三次联系作业都写电梯,要求逐步提高,对于多线程的掌握也进一步加深.本次作业全部都给出了输入输出文件,也就避免了正则表达式判断输入输出是否合法的问题. 第 ...

  6. oo第二单元作业总结

    oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...

  7. OO第二单元优化博客

    OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...

  8. 【OO学习】OO第二单元作业总结

    OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...

  9. OO第二单元小结

    OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...

随机推荐

  1. 死磕Spring之IoC篇 - Bean 的创建过程

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  2. 利用CORDIC算法计算三角函数

    这里主要先介绍如何利用CORDIC算法计算固定角度\(\phi\)的\(cos(\phi)\).\(sin(\phi)\)值.参考了这两篇文章[1].[2]. 一般利用MATLAB计算三角函数时,用\ ...

  3. a标签不能继承父级的颜色

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. 12. Vue搭建本地服务

    一. 搭建本地服务器 本地服务可以提高开发效率. webpack不需要每次都打包, 就可以看到修改后的效果. 本地服务器基于node.js搭建, 内部使用二十express框架. 可以实现让浏览器自动 ...

  5. 数据采集组件:Flume基础用法和Kafka集成

    本文源码:GitHub || GitEE 一.Flume简介 1.基础描述 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中 ...

  6. python的模块(module)和包(package)机制:import和from..import..

    在python用import或者from...import来导入相应的模块. 模块其实就一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中 ...

  7. 选择 FreeBSD 而不是 Linux 的技术性原因2

    ZFSZFS 文件系统是 FreeBSD 上的一等公民.这不仅意味着可以在 ZFS 上安装根目录,安装程序也支持这一点,而且还意味着很多基础系统工具都已经紧密地集成或构建了对 ZFS 的支持.在 Fr ...

  8. innerHTML,innerText

    文本替换 <p id="p1">Hello World!</p><div>神经</div><h3 class="hh ...

  9. 1-认识c指针

    1.指针和内存 c程序在编译后,会以三种形式使用内存 1静态/全局内存 静态声明的变量分配在这里,全局变量也使用这部分内存.这些变量在程序开始运行时分配,直到程序终止时才会消失 2.自动内存 这些变量 ...

  10. Linux tar 使用笔记

    常用语法 打包和压缩包 仅打包不压缩:tar -cvf usr.tar /usr 将 /usr 目录打包为 usr.tar 打包并以 gz 格式压缩:tar -czvf usr.tar.gz /usr ...