OO作业总结第二弹

  这个四月,多线程电梯,IFFF文件管理,出租车系列作业之——version1.(鬼知道我经历了什么......)

  不用说,三个作业都不是什么省油的灯(白眼)。那先从电梯系列作业终极版——多线程电梯说起吧。



  因为之前的电梯程序我写的并不好,在之前的两个版本中我也没对代码做大篇幅的改动,所以各种设计缺陷累积起来,旧的代码怕是扛不住多线程的折腾了,所以我干脆重新架构写了一份全新的多电梯调度作业。大概的设计就是把请求类用继承的方法衍生出了电梯请求和楼层请求这两个子类,似乎比较方便判断和管理;电梯类里面是一个状态机,根据调度器分配给自己的请求队列,自己调度自己运行;调度器这次没给他太大负担,只负责把请求扔给某个电梯就行,调度器不停查询访问请求队列,然后根据电梯目前的运行状态和楼层类的亮灯情况来判断同质或捎带请求,再把请求分配给某个电梯。

  我觉得多线程电梯比前两次电梯调度要考虑的逻辑方面的东西要少一些,因为多线程作业使用了Thread类的sleep方法模拟电梯真实运行情况,只要获取实时的电梯状态和亮灯情况就很容易判断请求是否同质,是否可捎带;而之前作业的时间计算完全依赖于逻辑理论分析,写的时候时间计算逻辑很容易出错,这就导致请求判断很容易出错。但是多线程也带来了线程安全问题,哪些对象需要加锁,应该为哪些代码段加锁,都是需要我们慎重考虑的事情。

  类图如下:(排了很久,是不是很hin好看!快表扬我!)

下面是metrics:(为了继承上次作业的调度器,我强行把上次作业的包拉了过来)

  UML:

  可以看出主要是输入判断的函数和电梯类的run函数圈复杂度和块嵌套深度比较大,我把输入判断的条件一块儿写到一个函数里,导致这个函数圈复杂度很高;电梯类是因为run函数里我给写成了一个状态机,且run还得负责调度电梯运行(这似乎减轻了调度器的负担,但同时加重了电梯类的责任)。总的来说这次的代码度量比前几次的电梯作业蓝很多了,感觉这次的修改还是挺成功的。

  这次测评并没有被找出bug,对方的话,大概是因为bug树分支太细了吧,由于一个bug导致红了好几个节点,真的很可惜,第一次知道挂上去就撤不下来的我内心很愧疚,还好通过申诉给那位同学撤销了几个,不然我可能会想挖个洞藏起来,不然都不知道如何面对那位同学。



  好了,下一个作业。

  本来以为结束了多线程OO就可以歇会儿了,看来还是我太年轻。

  IFFF,这名字念起来就很烦的样子。这个作业也确实很烦,指导书说的并不清楚,这代表这次作业基本得全靠readme了,这次作业我写的很匆忙,大概是因为电梯写的有些累了,这次对自己也没有什么要求,readme也写的随意,我知道这是不对的,可是当我醒悟的时候已经周三了   :[

  这次我用一个监视任务一个线程,每2s做一次快照,存到Info队列里,不得不说把四种监视器合并写到一个类里面真的非常非常。。。繁琐,Trigger写了近350行,修改代码也非常困难,可是当我意识到这一点的时候,已经来不及改了,只好破罐子破摔。。。想了好几天怎么给目录做快照,想了好多方法,但都觉得太繁琐了,最后采用了将监控范围内的所有叶子节点加入到arraylist里,快照只需扫描这个list就行了。

  类图如下:

metrics太红了,我就不放了。。。

  UML:

  因为没有看issue,所以这次因为功能没写全被扣bug挺亏的,rename和path-change之后得继续跟踪文件,其实修改起来就几句话的事情,但因为没写全功能,我觉得测我的同学能帮我测完也是很善良了。以及这次作业存在不少不可复现的bug,因为时间紧迫没有考虑全线程安全问题。



  好的下一个。

  我又以为熬过了IFFF,OO就过去了,不知道听信了哪位学长的谣言,我并不觉得出租车有多简单噢╰(‵□′)╯还是太年轻。

  用一个AlltTaxi线程管理100辆出租车,每隔200ms更新一次状态;每次计算最短路径都调用一次Dijkstra算法,很浪费时间。调度系统每100ms扫描一遍订单list,并广播给所有满足接单条件的出租车,3s后订单管理类处理掉这些被派送的订单或没有缘分坐上出租车的乘客。

  类图如下:(gui太多类了图塞不下,就没拉进来)

  metrics如下:

  UML:  

  这次被抓出了不少bug,也有很多设计上不完善的地方,非常感谢测试者提出这些问题,还有很多设计在下次作业应该会做一些改动。我测试的同学似乎在信誉度的选择上有一些问题,没什么大问题。



  感想:经历过电梯作业,我发现代码可塑性很重要,与其每次都写一份一次性作业不如从第一次开始就好好思考架构方面的问题,提高代码可塑性。于其申诉一些不可复现的问题,不如当初写的时候就避免这种问题的出现。另外,对于多线程程序,线程安全是肥肠重要的一方面,一定要特别注意哪些地方需要加锁,但又不能随意加锁,避免死锁发生。

  

  

原文地址:https://www.cnblogs.com/WENSHASHA/p/8971191.html

时间: 2024-10-10 17:53:10

OO作业总结第二弹的相关文章

团队作业八——第二次团队冲刺(Beta版本)第6天

团队作业八--第二次团队冲刺(Beta版本)第5天 一.每个人的工作 (1) 昨天已完成的工作 简单模式逻辑代码涉及与相关功能的具体实现 (2) 今天计划完成的工作 修改完善注册登录内容界面,编辑错题文件写入. (3) 工作中遇到的困难 今天花了较多时间在完善登录注册界面上,这让我们比较担心,如果每天都花很多时间在解决之前的问题,当天的任务又做不好,会不会赶不上进度.如果每天都不能正常完美的完成每天任务,那冲刺最后一天结束的时候,又哪里再有一个明天给我们完善代码.且今天还遇到了写入SD存储卡文件

《我与希乐仑》第二弹

致徐敏: 如果你觉得我的这篇报道侵害了你和贵公司的权益,你可以上法院告我,但我说的都是事实,不怕你告,有事找我律师,谢谢! 我是希乐仑科技发展(上海)有限公司前员工,曾经为希乐仑立下汗马功劳.这公司从2014年2月份开始搞我,我去年的绩效是3.8/5.0,完全没有绩效问题.他们倒好,自从我查完我们公司某商业间谍之后,就给我穿小鞋,说我这个不好,那个拖延,这不是扯淡吗?公司在3月5日非法把我裁掉,而且直到现在还未支付我2月份工资,行吧,那我就不再沉默了,当我吃素的是吧!我现在把这件事情公之于众,望

团队作业八——第二次团队冲刺(Beta版本)第4天

团队作业八--第二次团队冲刺(Beta版本)第4天 一.每个人的工作 (1) 昨天已完成的工作 做一下用户注册的功能和登录功能. (2) 今天计划完成的工作 完成界面跳转 (3) 工作中遇到的困难 界面跳转涉及到逻辑性相对复杂,所以具体做的时候会出现一些小的问题. (4) 每个人的贡献比 二.燃尽图 三.代码 package com.example.asus.app_sizeyunsuan; import android.content.Intent; import android.suppor

团队作业八——第二次团队冲刺(Beta版本)第5天

团队作业八--第二次团队冲刺(Beta版本)第5天 一.每个人的工作 (1) 昨天已完成的工作 完成界面跳转界面. (2) 今天计划完成的工作 简单模式逻辑代码涉及与相关功能的具体实现 (3) 工作中遇到的困难 错题本功能完成过程中遇到一些问题 (4) 每个人的贡献比 二.燃尽图 三.代码 package com.example.asus.app_sizeyunsuan; import android.os.Environment; import android.support.v7.app.A

深究angularJS系列 - 第二弹

深究angularJS系列 - 第二弹,在初步了解了Angular的基础上,进一步的针对Angular的控制器和作用域问题深入探究O(∩_∩)O~~ Angular控制器 控制器(Controller)的理解 控制器是对view的抽象,用来接收view的事件,响应view的请求: 控制器包含view的静态属性和动态的方法: 控制器与view是一对一的关系. 控制器(Controller)的结构 1 .controller("控制器的名字",function($scoppe){ 2 ..

C/C++中容器vector使用方法<第二弹>

此文总结常用vector操作,是前一篇的续作!只有代码,详细请看代码中的注释.出于反爬虫的目的,你不是在http://blog.csdn.net/zhanh1218上看到的,肯定不是最新最全的. /********************************************************************* * file_name: vector_test.cpp * * Created on: 2014年6月28日 下午3:34:23 * Author: The_T

线段树第二弹(区间更新)

上篇文章,我们介绍了线段树的基本概念和单点更新.区间查询,今天,我们来接着上次的线段树问题继续深入研究.在解决线段树问题的过程中,我们会遇到要求修改区间中某一元素值的问题,当然也可能会遇到要求修改一段子区间所有值的问题--即区间更新问题.回忆一下上篇文章单点更新的方法是,由叶节点逐级向上进行更新,此时更新一个节点值的时间复杂度为o(log n),(点击链接了解详情:线段树+RMQ问题第二弹),那么以这样的处理效率来进行区间更新结果会怎样?现在假设待更新区间数据的规模为 n ,那么就需要进行 n

团队作业八——第二次团队冲刺(Beta版本)第7天

团队作业八--第二次团队冲刺(Beta版本)第6天 一.每个人的工作 (1) 昨天已完成的工作 登录注册功能的完善与实现和简单测试模块的优化 (2) 今天计划完成的工作 修复昨天写入SD存储卡文件权限问题,以及中级和高级功能的实现. (3) 工作中遇到的困难 只完成了部分,具体见明天... (4) 每个人的贡献比 二.燃尽图 三.代码 由于今天班级活动和班聚耽误了下午和晚上的时间,我们只完成了部分,完整的代码明天会补上的 四.模块部分截图 同样明天见... 五.项目进展 今日计划内容被打乱,只完

MongoDB第二弹——基本操作

1 查看各个项目的Project ID编号 mysql -uroot -h10.10.2xx.xx show databases; use bugfree2; desc bf_TestProject; select ProjectID,ProjectName from bf_TestProject;(查询结果如下) 2 在/var/www/html/bugfree/BugFile路径下创建文件夹 mkdir Project2  Project3  Project4  Project5  Proj