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.由于只有一架电梯,所以生产消费模型满足以下条件: 一个生产者,一个消费者 托盘不为 ...
随机推荐
- 【转】C++三大特性
又重新看了一个多月的书,也算是基本上了解了一些很基础的东西,学习C++就得掌握它所具备的三大特性. 封装性是基础,继承性是关键,多态性是补充,并且多态性存在于继承的环境中. 封装性 C++语言中支持数 ...
- UCOS时钟节拍的讲究
其实这个值取适中即可,100,200都行,看你的片子是什么,Cortex-M3的片子取200较合适这个值太小,系统调度周期较长,各个任务之间切换较慢,适时性降低,而太大了,中断周期与调试周期接近了,那 ...
- redis 数据库随笔 (一)
redis数据库的基本类型分析: 1.string 最基本的数据类型.只存贮一个值,key-value,最大值存储512M. 创建命令:hmset 读取命令:hget 2.hash 集合,存储为一个 ...
- fixed fluid layout
<div id="fixed">Sidebar</div> <div id="fluid">Content</div& ...
- Google官方网页载入速度检测工具PageSpeed Insights 使用教程
相信有接触前端开发的大神们都听说过Google官方的PageSpeed Tools,这个网页载入速度检测工具有在线版本也有一个 Chrome 扩展,叫PageSpeed Insights,在此之前,J ...
- 《Java 程序设计》课堂实践项目-简易计算器
<Java 程序设计>课堂实践项目简易计算器 课后学习总结 目录 改变 简易计算器实验要求 课堂实践成果 课后思考 改变 修改了博客整体布局,过去就贴个代码贴个图很草率,这次布局和内容都有 ...
- mfc 创建一个C++ 类
类创建向导 添加一个C++类 #pragma once的作用 认识类视图 一.类创建向导 二.添加一个C++类 认识类创建向导: 创新一个处理文字信息的类CMessage CMessa ...
- 02-分页器,自定义分页器,解耦函数分页器,分页器class
1 .批量数据导入 主url from django.contrib import admin from django.urls import path, re_path, include urlpa ...
- 4 伪ajax:jsonp、cors 跨域请求
一.同源策略 https://www.cnblogs.com/yuanchenqi/articles/7638956.html 同源策略(Same origin policy)是一种约定,它是浏览器最 ...
- 4553: [Tjoi2016&Heoi2016]序列
4553: [Tjoi2016&Heoi2016]序列 链接 分析: 注意所有m此操作中,只会发生一个,于是考虑dp.dp[i]=dp[j]+1,j<i,a[j]<=L[i],R[ ...