写在最前面:

  转眼间就又到了一月一次的总结时间,这次的三个作业,我个人感觉可能是最令人难受的三次作业了。不只是因为它们是多线程,更是因为它们几乎是全新的三次作业,每次的代码几乎都要重头开始。

第五次作业:

复杂度分析:

  首先来看看类的复杂度:

  可以看出我的Elevator电梯类和Get输入线程类和Many_Schedule多线程调度类都是复杂度偏高,下面我再截取里面的方法复杂度一探究竟:

  我回头仔细看一下我的代码,以我目前来看我觉得只有一个地方写的不太好,就是我把电梯类的判断运动方向,上下楼,等待,输出等都写到了run()方法中,这个地方的确是有些不妥。其他的地方例如getstring()这样的获取输入的方法,我觉得复杂度高一点也没事吧.....毕竟你需要利用正则表达式一步步判断,然后输出提示等,需要判断的条件多了,复杂度自然会比较高。

类图:

协作图:

关于BUG:

  这次作业我拿到的那份作业好像是没有bug(时间有点久,记不太清了),我记得我的作业是有两个bug,一个是输入的时候我用split()分割出现了问题(其实是一个比较简单的bug,是我对split方法不熟悉导致,在此也就不过多说明);另外一个bug我想着重说明一下,就是关于时间误差的bug。这个bug从多线程第一次作业到第三次出租车作业一直伴随着我,我感觉这个bug我还会一直伴随着我走下去。其实这个问题就是用“真时间”还是“假时间”的问题。我一直采用的是真时间,也就是输出系统时间。那么问题就来了,程序在运行以及线程之间的切换,总是需要花费时间的,那么就会导致时间的误差。例如我sleep100ms,但是由于线程切换等种种原因,可能真正sleep了110ms,然后这个误差就会一直累积下去。这样最后的输出就产生了误差。很多同学采用了“假时间”,也就是不输出系统时间而是计算出时间然后输出,我个人认为这虽然可以让你的结果是正确的,但总给人感觉有点不对劲。其实就我个人的想法,这种情况在现实生活中的应用的程序可能这个误差是无伤大雅的,因为生活中的大多数情况不会以ms为单位,即使有也不会以输出时间的误差来评判对错的。

关于设计:

  在这次的作业中,我认为我有两个方面的设计还是比较好的。1)我给每个电梯单独设置了请求槽,调度器只需扫描总的请求槽,然后将合适的请求推送给每个电梯的请求槽,电梯每次只需从自己的请求槽中拿出请求执行就可以了。2)在判断同质的请求时,我模拟了生活中的电梯灯。当某个请求发送成功后,相应的灯就会亮起,到时候只需判断灯是否亮就可以过滤掉同质请求了,十分简便。

  关于线程安全,惭愧的讲,写这次作业的时候我还不知道怎么弄线程安全,并且以我当时的愚见来看我觉得我这次不需要线程安全,因为我对于共享资源的读以及写,都只有一个对象进行操作,我觉得好像是没什么必要让它更加安全。唯一一点可能出现问题的是可能出现对于一个队列同时读和写,但是我感觉及时同时读和写也没啥问题。

第六次作业:

复杂度分析:

  首先来看看类的复杂度:

  可以看出这次类的复杂度比上次作业有了很大进步,下面详细看一下具体方法的复杂度:

  Get类里的读取输入的方法复杂度高就不说了,读取输入复杂度我每次都高,我认为无伤大雅。下面的复杂度高的还有几个就是监督器的四种监督类型的方法。我回头看了一下其实觉得写的其实已经很好了......以我目前的水平可能已经无法继续改进了,所以总的来说这次作业我写的十分满意。

类图:

协作图:

关于BUG:

  这次我给别人测的时候,主要发现了这么几个问题:1)还是输入鲁棒性的问题,其实还是很简单的,只是他可能漏掉了。2)他的线程启动顺序可能没有安排好。我如果不进行sleep在测试线程的一开始就执行文件操作,他的监控器就无法监控到了。

  关于我的bug,我只想说:我觉得我的程序没有啥bug。我举几个我被发现bug的例子:1)我在看第一版指导书的时候,上面写的是不超过10个线程,我认为就是一条请求开一个线程嘛。然后第二版指导书改成了要同时支持10个监控对象。我还以为是一个请求开一个线程,支持开10个线程,没想到原来是这个监控对象上做文章了,要最多支持40个线程。2)我的程序监控的是文件的变化,如果监控范围是目录的话实质上也是监控的具体文件的变化,这一点我可能没有在Readme里详细说清楚,造成了误解。(总的来说我觉得我不存在设计上的bug,被找到的bug只能说是语言沟通上的bug,其实被发现几个bug我都无所谓,我自己觉得我写了一个自己很满意的程序,自己感到很开心这样就够了!)

关于设计:

  这次作业我同样觉得我有两个方面的亮点:

  1)在进行屏幕快照时,我利用了Hashmap,利用文件的绝对路径作为哈希值,快速找出两次屏幕快照中的不同文件(这个方法在出租车中也用到了,我觉得这个方法对于快速找不同十分实用)

  2)关于线程安全的设计。我认为在此次作业中,唯一可能出现安全问题的是在进行屏幕快照的过程中不能执行文件的修改操作,只需控制了这个其他应该不存在问题了(我认为同时读文件不会造成安全问题,只是时间先后问题罢了)。下面我给出我设计的思路:

  首先构造一个控制类Global:

public class Global{
private int flag;
public Global{
flag=0;
}
synchronized public boolean fileask() {
if(busy==0) {
busy=1;
 return true;
   }
return false;
}
synchronized public void filend() {
   busy=0;
}
}

  然后在文件读写前后加入以下代码:

while(!global.fileask()){
;
}
snapshot();// or modified file// global.filend();

  这样就控制了snapshot和文件修改不会同时进行,保证了线程安全。

第七次作业:

复杂度分析:

  首先给出类的复杂度:

  总的来说还算不错,除去gui类以外有三个类复杂度比较高,其中PassengerThread是输入线程,也就是我每次复杂度都高的那个,我就不说了。接下来截取了具体的几个方法来看:

  我觉得这两个方法是我认为写的不是很好的,第一个是GrabWindow,也就是抢单窗口线程,我为每一个乘客请求都会开一个抢单窗口,但是不好的地方是我把抢单窗口要做的所有事情都写在run方法里了。还有Taxi出租车线程,我采用的类似有限状态机的原理,将状态转移以及要做的事也都写在了run方法里,回头看来这样也不是很好。

类图:

协作图:

关于BUG:

  在这次作业中,我发现别人的bug只有一个就是他在进行输出的时候没有输出抢单窗口结束时刻的车辆信息,而是输出了抢单时刻的车辆信息,应该是没有仔细阅读指导书导致的吧。

  关于我的bug,我这次被发现了一个bug,和我在第五次作业中写的一样,还是时间误差的问题。我这里就不详细说了,下一次作业怎么都得使用假时间了。

关于设计:

  这次作业我还是认为我有两个比较好的设计,其实和上一次作业的两个亮点设计是一样的。

  1)关于出租车派单安全问题。由于一辆出租车可能参与多个订单的抢单,所以在分配订单的时候,很可能出现多个订单分配给了同一辆车,这就需要我们进行控制。我采用的方法和第六次作业给出的代码一样,我控制了每次只有一个订单可以进行派单操作。

  2)关于抢单,我仍然利用了Hashmap。由于抢单窗口的时间是3s,所以就需要不断扫描发出请求的区域,看是否有新的车进来,这时候利用Hashmap,以id作为哈希值,就很容易找到新进入的车了。

心得体会:

  OO课过了一半了,上一周可能是最艰难的一周,经历了“周三电工实习焊一天板子”+“周三晚上OOddl”+“周三晚上被拉取上博雅”+“周四上午操作系统理论考试”+“周四操作系统实验上机测试”的恐怖一周,后面的日子可能会好过一些了。其实对于OO,越写越觉得,其实这个分呀,bug呀,从斤斤计较变得没那么重要了。我觉得能让我感到开心的是每一次完成作业,能有一个自己很满意的设计,并且写出了自己很满意的代码,这样或许就足够了。最后希望,接下来的作业能够继续加油,坚持就会有收获。

OO5-7次作业总结的更多相关文章

  1. BUAA_OO_博客作业二

    1.作业设计策略 1.1第一次作业 ​ 第一次作业指导书要求是一个单部多线程傻瓜调度(FAFS)电梯的模拟,由于为了可扩展性和模块化设计,第一次作业我采用了三线程,即输入处理线程,调度器线程,电梯线程 ...

  2. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

  3. SQLServer2005创建定时作业任务

    SQLServer定时作业任务:即数据库自动按照定时执行的作业任务,具有周期性不需要人工干预的特点 创建步骤:(使用最高权限的账户登录--sa) 一.启动SQL Server代理(SQL Server ...

  4. 使用T-SQL找出执行时间过长的作业

        有些时候,有些作业遇到问题执行时间过长,因此我写了一个脚本可以根据历史记录,找出执行时间过长的作业,在监控中就可以及时发现这些作业并尽早解决,代码如下:   SELECT sj.name , ...

  5. T-SQL检查停止的复制作业代理,并启动

        有时候搭建的复制在作业比较多的时候,会因为某些情况导致代理停止或出错,如果分发代理时间停止稍微过长可能导致复制延期,从而需要从新初始化复制,带来问题.因此我写了一个脚本定期检查处于停止状态的分 ...

  6. Python09作业思路及源码:高级FTP服务器开发(仅供参考)

    高级FTP服务器开发 一,作业要求 高级FTP服务器开发 用户加密认证(完成) 多用户同时登陆(完成) 每个用户有不同家目录且只能访问自己的家目录(完成) 对用户进行磁盘配额,不同用户配额可不同(完成 ...

  7. 个人作业week3——代码复审

    1.     软件工程师的成长 感想 看了这么多博客,收获颇丰.一方面是对大牛们的计算机之路有了一定的了解,另一方面还是态度最重要,或者说用不用功最重要.这些博客里好些都是九几年或者零几年就开始学习编 ...

  8. 个人作业-week2:关于微软必应词典的案例分析

    第一部分 调研,评测 评测基于微软必应词典Android5.2.2客户端,手机型号为MI NOTE LTE,Android版本为6.0.1. 软件bug:关于这方面,其实有一些疑问.因为相对于市面上其 ...

  9. 软件工程第二次作业——git的使用

    1. 参照 http://www.cnblogs.com/xinz/p/3803109.html 的第一题,每人建立一个GitHub账号,组长建立一个Project,将本组成员纳入此Porject中的 ...

  10. hadoop作业调度策略

    一个Mapreduce作业是通过JobClient向master的JobTasker提交的(JobTasker一直在等待JobClient通过RPC协议提交作业),JobTasker接到JobClie ...

随机推荐

  1. Layui上传文件以及数据表格

    layui对于一些前端小白来说,例如我,真的非常的好用,不用去花很多很多的心思在前端美化中,并且提高了很大的工作效率.所以建议一些觉得自己前端技术不是很强,但是想让前端美化一点的可以使用layui. ...

  2. Spring+SpringMVC+Mybatis(二)

    上一次讲的是利用mybatis提供的sqlSessionTemplate作为DAO进行数据库的操作,其实我们可以把它封装到我们自己的DAO里面,这样就是所谓的自己写DAO,这次我们写一下通过mybat ...

  3. Hello,移动WEB—px,dp,dpr像素基础

    问题点1:iphone5分辨率:640 * 1136 dp,为什么chrome浏览器F12中显示的320 *568??         iPhone5 分辨率640 * 1136指的是物理像素,而实际 ...

  4. 一道SQL面试题——表行列数据转换(表转置)

    SQL语句如下: select country, sum(case when type='A' then money end) as A, sum(case when type='B' then mo ...

  5. ECSHOP和SHOPEX快递单号查询顺丰插件V8.6专版

    发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...

  6. [转]select top n 动态赋值

    怎样实现 select top n 语句中 n 的动态赋值呢?怎样实现 select   top   n   语句中 n 的动态赋值,求教各位了. 要把这个n值传到存储过程中,再加入 select t ...

  7. WHERE条件中or与union引起的全表扫描的问题

    说起数据库的SQL语句执行效率的问题,就不得不提where条件语句中的or(逻辑或)引起的全表扫描问题,从而导致效率下降. 在以往绝大多数的资料中,大多数人的建议是使用 union 代替 or ,以解 ...

  8. PHP代码统计文件大小(自动确定单位)

    php中有一个系统自带的计算文件大小的函数,就是filesize(),但是这个函数是以字节为单位的,但是在一些情况下,我们需要很直观的了解一个文件大小,就不仅仅需要字节B这个单位了,还需要KB,MB, ...

  9. uva 253 - Cube painting(相同骰子)

    习题4-4 骰子涂色(Cube painting, UVa 253) 输入两个骰子,判断二者是否等价.每个骰子用6个字母表示,如图4-7所示. 图4-7 骰子涂色 例如rbgggr和rggbgr分别表 ...

  10. Linux中的目录功能(Red Hat 7)

    目录的基本功能: /bin:存放普通用户使用的命令 /sbin:存放管理员可以执行的命令 /home:存放普通的家目录 如张三家目录为/home/zhangsan /root:管理员的家目录 /etc ...