OO第二阶段作业总结
第五次作业:
设计策略:
本次作业设计的基本思路是按照指导书所给的推荐方法来完成的,即共用对象为队列盘,线程有电梯、调度器、以及扫描器,扫描器将控制台输入的有效指令加入到队列盘中,调度器依据指导书的原则分配任务给电梯,然后电梯将其一条条执行。在电梯的类中,加入了一个小队列,即电梯依次需要完成的任务。在同步控制中,对队列盘对象加锁,在某一线程使用时,其他线程无法更改,但是可以访问。这样存在一些时间上不同步的问题,导致了一些bug的出现。
度量:
类图:

本次的类图较为简单,由于实际使用的类并不是很多,List类为扫描器,scheduler类为调度器,Elevator类为电梯,由于是三个电梯同时运行,因此实例化了三个电梯来同时运行。这次作业实现的好处在于思路简单,并且各类间的关系明确,易于在后续的找bug工作中提供帮助。但是缺点在于,类中只有run()方法,代码的可读性太差,没有将各个工作模块化,全部工作塞在一起显得臃肿,并且代码复杂度极高,导致一些不必要的问题出现。
Metrics度量图:
第一行的红色标记,表明了本次作业中,我对从控制台读取有效命令的方法部分模块复杂度过于复杂,并且嵌套深度也过深,这在第三行中也表明了出来。这依旧是因为,我在处理控制台的输入时,将正则判断也加入了这个模块,这导致了一个方法承担了许多任务和工作,因此让该模块的复杂度直线上升。并且对一条输入进行了多次正则匹配,也直接导致了模块代码的复杂度和嵌套程度加深。对代码的优化和提炼做得还不够。
分析自己程序的bug和不足:
本次作业出现了两个bug,一个是由于没有使用继承机制,直接使用了以前的调度器和调度方法。事实证明,偷懒是没有好处的,测试者真的很细心,这样都能发现我用了以前的调度器。另一个bug是如果最后一条命令是(#ER,1,1),我的程序就会crash,这依然是使用之前的调度方法的问题。还有一个bug测试者并未发现,在我的设计中,调度和扫描只能交替进行,这是由于对同步控制错误导致的。虽然没被发现,但是如果不及时改正,对接下来的其他作业必定会造成影响。这次作业还是存在许多的不足,某个方法依然显得臃肿复杂,模块化和可读性程度都极差。对线程的同步控制也是做得不够完美,在调度上也存在一些问题,导致了程序crash。
第六次作业:
设计策略:
这次作业是实现对文件的监控和管理,明白ifttt原理。虽然老师一直说这次作业很简单,但是我觉得一直写到深夜的应该不止我一个人。这次作业最大的难点就是,需要自己先自学java里对文件的操作怎么描述。这就花去了我许多时间。其实这次的作业难点在于架构,基本方面在于,扫描器扫描控制台的输入,读取文件的路径,监控内容等。在文件经过相应的操作后,能够作出对应的响应。并且需要写一个类,让测试者能够操作目标文件。我的策略就是每两秒扫描一次目标文件所在的文件夹,然后判断是否做出了监控器监控的动作,如果出现了,就执行需要执行的输出。按照指导书的要求,判断各个操作是否出现。
度量:
类图:

其中List类是扫描器,负责处理控制台的输入。monitor类是监控器,也就是程序的主体,负责判断各个监控器的内容是否出现。detail记录了文件或文件夹的先后名臣,先后路径,先后大小和先后最后修改时间,并且输出到指定位置。summary类记录了监控器监控内容发生的次数,并且输出到指定位置。filevisit类是提供给测试者操作文件的另外线程。这次的优点在于我将detail和summary另起一类,让各个变量间独立,使结构更加清晰明了,输出到文件就不易于犯错。缺点在于需要在monitor中调用这两个实例化对象,会造成代码量变大以及monitor类中的变量增多,易读性就大大降低了。
Metrics度量图:
根据这次的metrcs度量图,可以看到已经没有红色的字体出现了。但是模块复杂度最高的还是我的扫描器对控制台输入的部分,由于这次对输入格式并未作要求,因此在正则匹配上就没有那么多的工作量,因此没有造成模块的过于复杂。嵌套程度最深的是我的监控器类的监控方法,由于调用了很多其他方法来监控文件,所以嵌套程度最深。这次对各个模块代码的优化和简练还是做得比较满意,模块化的程度也较高,并没有预料中出现过于复杂化的模块的出现。
分析自己的bug和不足:
这次作业的bug存在很多,主要原因是对recover要求处理不到位,对这个要求的并没有去测试,只是完成了基本代码,但是在自己测试的时候并没有考虑这个情况,因此就直接交上去了。然后错了一堆bug,才发现对recover,也就是将文件还原的操作是错误的,有时候程序还会不响应。后来在检查过程中才发现执行recover操作时,没有记录更改前目标文件的路径和名称,只是将文件的位置改变了而已,由此造成了极大的失误。还有一个比较严重的bug是没有设计好多个监控内容的情况,如果监控多个目标文件,时间上会不同步,导致输出到detail的最后修改时间错误。这是由于同步控制做得不好导致的。
第七次作业:
设计策略:
这次作业要求完成一个基本出租车功能的程序。基本方法在于,由扫描器扫描控制台乘客的目的地和所在地,然后由调度器调度附近符合要求的出租车去接送乘客。本次作业的难点我认为在于去完成最短路径的寻找,虽然由GUI提供的方法能够稍微魔改一下去找到最短路径,但是会花费大概3~4秒的时间,初始化时间太长我觉得不太合理。就想到了数据结构使用的链表方法,使用了一个差不多的方法来查找最短路径,事实证明效果还不错。在程序实现时也直接引用了GUI的方法,让程序能够可视化。另一个难点在于圈出4*4区域,让进入的出租车能够响应。
度量:
类图:
这次需要完成的类有很多,因此看上去结构比较复杂。这是主要的缺点。并且可以看到各类之间的互相调用很多,导致了程序的嵌套程度很深。但是结构上的复杂必然就会有思想上的简单。Dis类用来计算两点间的距离。map类用来从文件中读取地图。scan类即从控制台读取乘客的需求。queue类即等待对列。taxi类即是出租车类。各自处理各自需要实现的功能,不会互相影响,并且可读性极高,后续的debug工作容易进行,这也是本次作业没有被找出bug的原因之一吧。
metics度量:
第一行所指出的最复杂的模块是指导书所给的GUI模块中的让地图显示出来的部分。由于地图一直需要刷新,这是理所应当的。然后第三行,嵌套程度最深的又是我的扫描器的读取输入的函数。这次作业我对程序的优化和简练应该是做得比较好的,可能是由于这个线程需要一直从控制台读取有效输入导致的,这个线程在设计上是需要一直运行的,因为需要不断的接受乘客的请求。这是理所应当的。
分析自己的bug和不足:
这次作业在互测阶段并没有被找出bug来,可能是测试者没有发现,但是我自己在设计中有个缺陷,这也是我交上去作业的一瞬间才想起来的。如果控制台同时输入两个或两个以上的乘客请求,我的程序只会响应其中的一个。另一个不足在于,对于指导书提到的4*4区域,如果出租车一开始在该区域,但之后驶出区域后,应当是加入抢单队列的,但是我没有 处理这个出租车。虽然侥幸没被测试出来,但是确实存在这些小问题。必须在下次作业之前改进。
心得体会:
这三次作业据老师说已经是所有作业中比较难的了,希望如此吧。能够活过第二阶段还没有无效作业已经是万幸,希望以后也不要有无效作业出现吧。然后就是努力完善自己的程序吧,既然不喜欢给别人找错,那就让自己的程序变得更无懈可击就好了。
OO第二阶段作业总结的更多相关文章
- OO第一次作业总结
OO第一次学习总结 1.第一次作业:多项式加法 从未接触过java的我,在从输入输出开始学了几天后,按照C语言的思路,写出了一个与面向过程极其接近的程序. 在这个程序中,存在两个类:一个是Comput ...
- oo第二阶段总结
第五次作业--多线程电梯 一.设计策略 本次作业是我们第一次接触多线程,给程序添加多线程功能后最大的挑战是实现共享数据的安全.避免冲突,由于这次作业是第一次尝试多线程方法,因此采用了将所有方法都加上s ...
- oo第一次作业
前言: 这是一篇面向对象作业总结,作业内容是对多项式进行求导,一共有三个阶段,具体要求不详述,第一阶段只要求’+’连接coeff*x^pow的形式,第二次支持*连接的幂函数及三角函数,第三次则需要支持 ...
- 从入门到不放弃——OO第一次作业总结
写在最前面: 我是一个这学期之前从未接触过java的小白,对面向对象的理解可能也只是停留在大一python讲过几节课的面向对象.幸运的是,可能由于前三次作业难度还是较低,并未给我造成太大的困难,接下来 ...
- 面向对象(OO)第二阶段学习总结
0.前言 此阶段总共进行三次大作业,其中第一次作业中的第一题,水文数据校验及处理中,遇到较大的难题,第一次接触正则表达式,编码过程中显得难度特别大.第二次作业同样也是对于一元多项式求导中对单项的正则校 ...
- OO第二阶段纪实
$ 0 写在前面 往往是那些令人格外痛苦的经历,会带给人以最快的成长.转眼间,半个学期的时间过去了,时间匆匆,不管之前对这几次充满了怎样的畏惧,在身边朋友们的帮助和努力下,我也渐渐度过了一个个难关.回 ...
- OO——电梯作业总结
目录 电梯作业总结 程序结构与复杂度的分析 第一次作业 第二次作业 第三次作业 程序BUG的分析 互测 自动评测 有效性 总结 电梯作业总结 程序结构与复杂度的分析 第一次作业 1.设计思路 第一次作 ...
- OO——JML作业总结
目录 第三单元博客作业 JML语言理论基础 1.注释结构 2.JML表达式 3.方法规格 4.类型规格 应用工具链 JMLUnitNG使用实例 作业架构设计 第一次作业 第二次作业 第三次作业 BUG ...
- OO电梯作业总结
(一)第五次作业 一.设计思路 生产消费者模型,输入接口是producer,调度器是tray,电梯是customer.由于只有一架电梯,所以生产消费模型满足以下条件: 一个生产者,一个消费者 托盘不为 ...
随机推荐
- Jmeter之集合点与关联
在Jmeter中,实现类似于LoadRunner中集合点的方法是采用同步定时器(Synchronizing Timer),而实现类似于LoadRunner中关联的方法是采用正则表达式提取器. 一.集合 ...
- 视频直播时的QoS策略
一.如何判断当前的网络状况 可以以发送一帧视频数据的时间为依据,判断当前网络拥塞情况. 网络中出现丢包和抖动,导致接收端接收数据超时,会激发发送端数据重传,重传机制本身挤占网络带宽,导致send ...
- 逻辑卷管理-LVM(Logical Volume Manager)
一. 概念与由来 LVM:逻辑卷管理(Logical Volume Manager) 普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某文件时,这个文件因为受上层文件 ...
- 使用Jquery Viewer 展示图片信息
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...
- PHP+Ajax+plupload无刷新上传头像代码
很简单的一款PHP+Ajax+plupload无刷新上传头像代码,兼容性很好,可以直接拿来用.你可以自定义各种类型的文件.本实例中只能上传"jpg", "png" ...
- 【转】mxGraph教程-开发入门指南
原文:https://blog.csdn.net/sunhuaqiang1/article/details/51289580 mxGraph教程-开发入门指南 概述 mxGraph是一个JS绘图组件适 ...
- 可用的ntp服务器
操作系统中带的:time.windows.com 和 time.nist.gov 网上查到一个公共的:cn.ntp.org.cn 以上三个连接多次才成功一次,速度不好. 在移动电视盒子上有一个配置: ...
- RMAN中建立Catalog 用数据库的例子
RMAN中可以备份metadata到control文件,也可以备份metadata到数据库中,此数据库称为catalog database. 本文参考网上文章,建立一个例子: 使用机器: 机器1:ta ...
- Famous框架系列一:famous/core/Surface
famous/core/Surface 既然是Famous的第一篇文章,就先给Famous打个广告:http://periodic.famo.us Famous12年的作品,点击右下角Fun thi ...
- 简单的redis工具类
import java.util.Arrays; import java.util.List;import java.util.Set; import org.apache.commons.lang. ...