BUAA_OO 第二单元总结
作业分析
第一次作业
本次作业是单次可捎带电梯的设计,主要是初步了解多线程的设计实现和测试,本身算法设计非常简单。这次作业整体来说不是很难,是多线程的入门,主要目的就是让我们认识,了解一下什么是多线程。所以主要时间花费不在架构的设计,在于认识,理解,如何去使用多线程。思考后的想法是:一个用于存储人(Person)的类,一个用于解析输入的线程,一个电梯线程,并且维护一个共享队列,其中包括电梯队列和等待队列。有人来就进入等待队列,上了电梯就进入电梯队列,当输入线程结束且共享队列(两个队列)均为空,电梯线程结束。想法非常简单也很现实,但一开始对多线程不是很懂,实现起来用了一些时间.
第二次作业
本次作业将一部电梯改为了有输入决定的1到5部电梯,同时加入了电梯限载的设定。基本和第一次想法类似,只是加入了一些新的方法,如 personCarryIn() 和 personCarryOut() 等,到达每一层的时候看有没有人要上(捎带)下电梯,主要是条件的判断,大体上就是指导书的思路
第三次作业
本次作业将没有了通用电梯,而是改为三种不同类型的电梯,分别只能在特定的楼层停靠,这就导致了有些请求必须通过换乘来解决。还是继承了之前的想法,只是这一次需要三个电梯队列,一个等待队列。因为等待队列对所有电梯来说应该是公有的,而电梯队列是每个电梯私有的,也就是上了电梯的人。同时,将之前的电梯类改为一个抽象类,只负责实现电梯的基本功能,这三部电梯(线程)分别继承这个抽象类。
关于SOLID等设计原则分析(可扩展性见反思部分):
SRP:糟糕透了,每个模块都是一个类搞定,电梯和调度器有数十个方法,几百行的代码量,没有进一步细分其各种功能。
OCP:想了想应该是不可能了,调度算法深入了电梯调度器的每个类中,只有请求处理类可能做到。
LSP:做到了,因为根本没有自己设计的继承关系...
LOD:电梯类和请求处理类基本没有直接通信,也就没有直接调用。
ISP:只实现了RUNNABLE接口,显然是必须的。
DIP:没有设计好抽象层次。
心得与反思
本单元电梯作业的主题是认识多线程,尝试应用一些关键字、锁的机制保障线程的安全。这一单元对于多线程的学习中,不仅加强了对多线程的理解,更是深刻认识到了线程安全的重要性。一些平常没有太注意的小问题,就可能在多线程问题中被放大,并且会导致很严重的后果。因此,在写每一行代码时,一定要思考这一步是否是线程安全的。当然,能提前注意到最好,一些实在想不到或者难以理解的点,只能等到出错后再回来调试。设计肯定不是一开始就是完美的,测试数据也是完善我们设计的一部分,一定不能害怕错误,发现错误改正错误才是我们应该做的
BUAA_OO 第二单元总结的更多相关文章
- BUAA_OO第二单元作业总结——多线程
OO第二单元作业总结——多线程 单元任务 本单元主要的内容是通过模拟电梯的运行来熟悉多线程的实现,从简单的单部FAFS电梯开始,ALS电梯,到最后的多部ALS电梯. 一.设计策略分析总结 1.1 多线 ...
- BUAA_OO第二单元总结性博客作业——多线程电梯架构
一.设计策略 在第一次作业时,我刚第一次接触多线程这个东西……于是乎对于第一次VIP直上直下一次只接一个人的电梯,我借鉴了指导书中为我们提供的架构,设计了一个输入线程和一个电梯线程,并设置了一个中间类 ...
- BUAA_OO第一单元作业总结
BUAA_OO第一单元作业总结 单元任务 第一单元的任务为实现表达式的求导,其中第一次作业是对简单多项式的求导,第二次作业是对包含简单幂函数和简单正余弦函数的多项式的求导,第三次作业是对包含简单幂函数 ...
- OO第二单元作业小结
前言 转眼已是第九周,第二单元的电梯系列作业已经结束,终于体验了一番多线程电梯之旅. 第一次作业是单电梯的傻瓜调度,虽然是第一次写多线程,但在课程PPT的指引下,写起来还是非常容易:第二次作业是单电梯 ...
- BUAA面向对象设计与构造——第二单元总结
BUAA面向对象设计与构造——第二单元总结 第一阶段:单部傻瓜电梯的调度 第二阶段:单部可捎带电梯的调度 (由于我第一次写的作业就是可捎带模式,第二次只是增加了负数楼层,修改了一部分参数,因此一起总结 ...
- 我永远爱着OOP——第二单元作业总结
第二单元的电梯真是愉♂快呢,多线程编程作为java编程OOP中的重要组成部分,通过这一个单元的学习,我也是有了很多全新的认识 那么下面就先例行一下公事 三次作业分析 第五次作业 设计分析 实现的电梯是 ...
- 2019OO第二单元总结
(1)设计策略 电梯第1次作业是一个傻瓜调度电梯,使用先来先服务原则,不用考虑捎带(可以认为电梯的载客量为1),因此比较简单,调度器用一个队列就可以. 使用生产者-消费者模型,输入线程是生产者,电梯是 ...
- oo第二单元作业总结
oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...
- OO第二次博客作业--第二单元总结
第一次作业 1. 设计策略 第一次作业,一共三个线程,主线程.输入线程和电梯线程,有一个共享对象--调度器(队列). 调度的策略大多集中到了电梯里,调度器反而只剩下一个队列. 2. 基于度量的分析 类 ...
随机推荐
- 吴恩达DeepLearning.ai的Sequence model作业Dinosaurus Island
目录 1 问题设置 1.1 数据集和预处理 1.2 概览整个模型 2. 创建模型模块 2.1 在优化循环中梯度裁剪 2.2 采样 3. 构建语言模型 3.1 梯度下降 3.2 训练模型 4. 结论 ...
- c期末笔记(2)
1.定义数组 1.1.a[3][2] = [1,2,3,4,5,6],代码是定义一个三行两列的二维数组.在数组声明和初始化时,如果用户定义的元素数量超过用户规定的元素数量,以语法错误报错.(如:cah ...
- PTA | 1016 部分A+B (15分)
正整数 A 的"DA(为 1 位整数)部分"定义为由 A 中所有 DA 组成的新整数 PA.例如:给定 A=3862767,DA=6,则 A 的"6 部分"PA ...
- 【前端】HTML总结
一. HTML介绍:---------------------------------------1. 什么是HTML? 超文本标记语言, <标签名>--标记(标签.节点) 2. ...
- 给Jekyll静态博客添加ScrollSpy博文大纲目录
目录 内置TOC 添加ScrollSpy博文menu Scrollnav.js 使用方法❤ 最近又双叒把博客模板换成了Jekyll,Jekyll无论上手难度和修改难度都是目前所见流行模板中最低的(以无 ...
- Tcl编程第一天,helloworld
#!/usr/bin/tclsh puts "hello world" 注意:第一行代码表示的是tcl程序运行所需要的文件位置 puts函数代表输出
- 操作文件-取出一个60s内log日志中ip访问次数超过100次的ip
import timea=0while True: d={} f = open(r"/Users/**juan/Downloads/access.log",encoding=&qu ...
- mysql--> find your databases' local position
1. find file: "my.ini" 2.Using ctrl+F find string "datadir" then you can see y ...
- Kubernetes 二进制部署
目录 1.基础环境 2.部署DNS 3.准备自签证书 4.部署Docker环境 5.私有仓库Harbor部署 6.部署Master节点 6.1.部署Etcd集群 6.2.部署kube-apiserve ...
- pgsql中的事务隔离
pgsql中的事务隔离级别 前言 事物隔离级别 在各个级别上被禁止出现的现象是 脏读 不可重复读 幻读 序列化异常 读已提交隔离级别 可重复读隔离级别 可序列化隔离级别 摘录 pgsql中的事务隔离级 ...