【BUAA-OO】第二单元作业总结
第二单元作业总结
——电梯恐惧症患者的极限自救
一、 第一次作业程序分析
1. 设计策略简略分析
线程:主线程、输入线程和电梯线程,另有一个持有请求队列的调度器,一个对输入进行处理的Request类,主要采用生产者-消费者模型。
分工:输入线程负责接收控制台输入,处理后存入调度器队列。
电梯线程负责向调度器申请请求、运送请求,并输出相关状态信息,本次作业采用轮询方式进行等待。
调度器负责对请求进行调度,在电梯申请请求时将队列内第一个请求发送给电梯。
Request类负责处理输入,主要任务是将null输入改变成一个from=to的请求加入队列,以达到实现停止电梯的目的。
调度策略:FAFS。电梯内无请求时向调度器申请一个请求,若队列空则轮询等待,若得到请求则开始运送, 接收到特殊请求时结束。
2. 基于度量的程序结构分析
1) 类的度量
类的属性个数、方法个数如下:
类的代码规模如下:
由于本次作业较简单,代码规模均较小。
2) 方法度量
其中Elevator类的run方法复杂度较高,是因为本次作业将电梯所有运行逻辑全部在run中实现,没有单独的方法将其划分。
3) 类图及其分析
本次作业比较基础,完成基础上未做其他事情,暂不分析优缺点。
4) Sequence Diagram
5) SOLID设计检查
SRP:符合,每个方法都只有一个明确的职责。
OCP:符合,基本通过扩展来实现新功能。
LSP:符合,无子类。
ISP:符合,无接口。
DIP:符合。
3. bug分析
在前期出现诸如当前楼层未更新等低级错误,后期测试中暂未出现bug。
二、 第二次作业程序分析
1. 设计策略简略分析
线程:未改变
分工: 电梯增加功能,在每一层向调度器询问是否有可捎带人员,内置主请求与捎带请求队列,改为wait等待。
调度器增加功能,在电梯询问时根据电梯运行情况查询是否有可捎带人员,并返回给电梯。
输入线程增加功能,接收到新请求后notify电梯。
调度策略:ALS。电梯内无请求时向调度器申请一个请求,若队列空则wait等待,若得到请求则开始运送,运送过程中在每一层查询捎带,主请求处理结束后更换主请求并继续处理,接收到特殊请求时结束。
2. 基于度量的程序结构分析
1) 类的度量
类的属性个数、方法个数如下:
类的代码规模如下:
与上次作业相比,这次主要的更改在调度器对捎带的查询和电梯的调度算法,因此这两个类的规模显著提升。
2) 方法度量
其中Elevator类的run方法、go方法以及Queue的getStatus方法复杂度较高。其中run方法承载了ALS调度的全部逻辑,所以较为复杂;go方法计算电梯的运行方向,没有仔细设计,实现比较随意;getStatus方法根据电梯状态计算捎带队列,实现比较复杂,应当拆分。
3) 类图及其分析
优点:线程和锁较少,不容易出现线程安全问题。
缺点:调度器内部结构复杂,容易出错。
4) Sequence Diagram
5) SOLID设计检查
SRP:符合,每个方法都只有一个明确的职责。
OCP:基本符合,除一些在现有条件下完全无用的方法被重写外,其他已有方法均通过扩展来实现新功能。
LSP:符合,无子类。
ISP:符合,无接口。
DIP:符合。
3. bug分析
在前期出现由于设计考虑不周全在主请求上出现一些错误,后期测试中暂未出现bug。
三、 第三次作业程序分析
1. 设计策略简略分析
线程:电梯线程改为三个,额外增加一个输出类,以保证线程安全。
分工:Request类新增标记位,区分换乘人员与直达人员。
电梯更改功能,只在可到达层向调度器询问是否有可捎带人员;增加功能,将换乘人员重新加入调度器队列。
调度器更改功能,主请求选择规则为可直达优先,不选择其他电梯可直达的请求作为主请求;捎带规则改为只捎带可直达人员;增加换乘队列,
调度策略:电梯内策略不变,调度器调度策略更改,在换乘楼层特别处理。
2. 基于度量的程序结构分析
1) 类的度量
类的属性个数、方法个数如下:
类的代码规模如下:
与上次作业相比,这次主要的更改依旧主要是调度器和电梯的调度算法,而Request类中则增加了equels方法。
2) 方法度量
其中Elevator类的run方法、go方法以及Queue的getStatus方法复杂度同上次作业一样较高,本次Queue的getMain方法由于主请求选择较复杂而复杂度也较高。
3) 类图及其分析
优点:简单,可扩展性好。
缺点:调度器内部调度太复杂,容易出错。线程增多,易出现线程安全问题
4) Sequence Diagram
5) SOLID设计检查
SRP:符合,每个方法都只有一个明确的职责。
OCP:基本符合,新增一些方法,其他已有方法均通过扩展来实现新功能。
LSP:符合,只有一个输出子类,后续使用均为子类。
ISP:符合,无接口。
DIP:符合,电梯统一建模。
3. bug分析
线程安全问题:三部电梯在等待结束信号时出现notify丢失导致RTLE。
四、 Bug寻找策略
人工看代码,手动写样例。
我要是能找到bug我就不会在第三次死的这么惨了……
五、 心得与体会
1. 前期需要先规划好每个线程的作用,明确分工,努力实现低耦合,这样后期写码会容易很多。
2. 密切注意线程安全问题,密切注意线程安全问题,密切注意线程安全问题,不然会死的不明不白。
【BUAA-OO】第二单元作业总结的更多相关文章
- 电梯模拟系统——BUAA OO第二单元作业总结
需求分析 官方需求 本次作业需要模拟一个多线程实时多电梯系统,从标准输入中输入请求信息,程序进行接收和处理,模拟电梯运行,将必要的运行信息通过输出接口进行输出. 本次作业电梯系统具有的功能为:上下行, ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- 电梯也能无为而治——oo第二单元作业总结
oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...
- oo第二单元作业总结
oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...
- OO第二单元作业总结【自我反思与审视】
第二单元作业的完成史,就是一部心酸的血泪史…… 多线程的出现为我(们)打开一片广阔的天地,我也在这方天地摸爬滚打,不断成长!如果说第一单元之前还对Java语法有所了解的话,那么这单元学习多线程则完全是 ...
- OO第二单元作业小结
前言 转眼已是第九周,第二单元的电梯系列作业已经结束,终于体验了一番多线程电梯之旅. 第一次作业是单电梯的傻瓜调度,虽然是第一次写多线程,但在课程PPT的指引下,写起来还是非常容易:第二次作业是单电梯 ...
- OO第二单元作业分析
前言 这一单元关于线程安全的作业结束了,在助教提供的接口的帮助以及老师提供的设计模型的指导下,这三次作业还是相对轻松地完成了,中间也没有出现什么bug,可能就是因为简单的逻辑不容易出错吧,可惜两次都由 ...
- 你电梯没了—OO第二单元作业思考
写在前面 这三次电梯调度作业,主要是学习多线程并行操作,对于各个线程的时间轴的把握,互相的配合与影响,通过使用锁来解决访问冲突等方面. 个人在学会Thread相关操作之外,写出来一些奇怪结构的诡异操作 ...
- 北航OO第二单元作业总结(2.1~2.3)
在经过第一单元初步认识面向对象编程思想后,本蒟蒻开始了第二单元--多线程部分的学习.本单元的作业是构造符合条件的"目的选层电梯"模型,自行设计调度算法,进行合理调度,完成所有乘客的 ...
- OO第二单元作业——魔鬼电梯
简介 本单元作业分为三次 第一次作业:第一次作业要实现单部简单电梯,停靠所有楼层,无载客容量,性能分考量电梯运行时间. 第二次作业: 第二次作业实现多部电梯,电梯数量由初始化设定,每部电梯都停靠所有楼 ...
随机推荐
- vue 通过自定义指令实现 置顶操作;
项目需求:要求当前项目每个页面滑到超出一屏的距离时,出现 backTop 按钮,点击则回到最顶端:俗称置顶操作: 因为涉及到的页面较多,每个页面都加肯定显得重复累赘,最终想到了 Vue 的自定义指令 ...
- 『转载』判断一个正整数是不是素数,时间复杂度为O(根号n)
原文链接:https://blog.csdn.net/liangdagongjue/article/details/77895170#commentsedit PS:新手上路,实在找不到怎么转载,所以 ...
- 小程序:scroll-view组件滑动多次触发scroll事件的bug解决
在项目开发过程中,组件是微信小程序提供给我们的一个分页器,一般滑动到底部时会触发scroll事件,scroll事件中往往包含对后端数据的请求:若是还未滑动到底部时频繁触发事件,则会频繁发请求,达不到想 ...
- MFC关于.rc文件 .rc2文件
.rc文件和.rc2文件 c和rc2都是资源文件,包含了应用程序中用到的所有的资源. 两者不同在于:rc文件中的资源可以直接在VC集成环境中以可视化的方法进行编辑和修改; 而rc2中的资源不能在VC的 ...
- 24.C# Lambda表达式
1.Lambda表达式的含义 Lambda表达式是C#3.0引入的一种结构,使用它可以简化C#编程. 2.Lambda表达式与匿名方法 我们知道匿名方法可用于事件处理,如下delegate声明了一个匿 ...
- C++实验三
part2 graph.h #ifndef GRAPH_H#define GRAPH_H// 类Graph的声明 class Graph { public: Graph(char ch, int n) ...
- django请求接收及文件上传
在写后端交互页面的时候常常会遇到接收来自前端页面请求的情况,例如 在写注册页面的时候,会提交一些页面信息,这时需要分三种情况讨论 第一种,接收单项信息: v = request.POST.getlis ...
- jquery datetimepicker 日期时间控件的使用及参数说明
首先下载 jquery.datetimepicker.css jquery.datetimepicker.main.js 1. 引入css和js (注:该控件要依赖于jquery) <link ...
- CSS之CSS的三种基本的定位机制(普通流,定位,浮动)
一.普通流 普通流中元素框的位置由元素在XHTML中的位置决定.块级元素从上到下依次排列,框之间的垂直距离由框的垂直margin计算得到.行内元素在一行中水平布置. 普通流就是html文档中的元素如块 ...
- 在C#中GUID生成的四种格式
var uuid = Guid.NewGuid().ToString(); // 9af7f46a-ea52-4aa3-b8c3-9fd484c2af12 var uuidN = Guid.NewGu ...