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. 基于度量的分析 类 ...
随机推荐
- 面试刷题30:SpringBean的生命周期?
spring是Java软件开发的事实标准. 我是李福春,我在准备面试,今天的问题是:springBean的生命周期是怎样的? 答:spring最基础的能力是IOC(依赖注入),AOP(面向切面编程), ...
- flask中的表单文件上传
在表单中上传文件时,一定要加入 enctype="multipart/form-data" 属性 为什么要加入这个属性呢: enctype就是encodetype就是编码类型的意思 ...
- [noip2016]愤怒的小鸟<状压dp+暴搜>
题目链接:https://vijos.org/p/2008 现在回过头去看去年的考试题,发现都不是太难,至少每道题都有头绪了... 这道题的数据范围是18,这么小,直接暴力呗,跑个暴搜就完了,时间也就 ...
- nginx 安装教程
Nginx 安装教程 本教程在CentOS6.7中安装nginx 1.8.0,Nginx中加入了taobao的concat模块,nginx-upload-module模块,pcre 以及nginx-u ...
- CentOS-7.6 下搭建 NIS 服务器
##服务端配置: ####Server: 192.168.0.178(CentOS 7.6) # systemctl stop firewalld # systemctl disable firewa ...
- Three.js 中的参数调试控制插件dat.GUI.JS - [Three.js] - [dat.GUI]
不论是处于特殊功能的需要,还是处于效果调试方便,我们可能都需要修改模型中的参数值.在Three.js中,谷歌提供了一个js库,即dat.GUI.js用于处理这种需求. 通过该库,我们就不需要通过手动修 ...
- Golang入门(3):一天学完GO的进阶语法
摘要 在上一篇文章中,我们聊了聊Golang中的一些基础的语法,如变量的定义.条件语句.循环语句等等.他们和其他语言很相似,我们只需要看一看它们之间的区别,就差不多可以掌握了,所以作者称它们为&quo ...
- 项目踩坑实记 :2019年(SSM 架构)
1.Bootstarp 相关 JS 结合 Bootstarp 初始化表格后,如果是 Ajax 请求获得返回数据,重新渲染数据到表格的话,用下面的函数. ChanInfTable 是表格的 id. 2. ...
- 从零搭建一个SpringCloud项目之Zuul(四)
整合Zuul 为什么要使用Zuul? 易于监控 易于认证 减少客户端与各个微服务之间的交互次数 引入依赖 <dependency> <groupId>org.springfra ...
- python CGI 编程实践
文章更新于:2020-03-05 注1:安装 python 参见: python 的安装使用和基本语法 注2:配置 web 环境参见: Windows&linux使用集成环境搭建 web 服务 ...