第五次作业:

        设计策略

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

  1. OO第一次作业总结

    OO第一次学习总结 1.第一次作业:多项式加法 从未接触过java的我,在从输入输出开始学了几天后,按照C语言的思路,写出了一个与面向过程极其接近的程序. 在这个程序中,存在两个类:一个是Comput ...

  2. oo第二阶段总结

    第五次作业--多线程电梯 一.设计策略 本次作业是我们第一次接触多线程,给程序添加多线程功能后最大的挑战是实现共享数据的安全.避免冲突,由于这次作业是第一次尝试多线程方法,因此采用了将所有方法都加上s ...

  3. oo第一次作业

    前言: 这是一篇面向对象作业总结,作业内容是对多项式进行求导,一共有三个阶段,具体要求不详述,第一阶段只要求’+’连接coeff*x^pow的形式,第二次支持*连接的幂函数及三角函数,第三次则需要支持 ...

  4. 从入门到不放弃——OO第一次作业总结

    写在最前面: 我是一个这学期之前从未接触过java的小白,对面向对象的理解可能也只是停留在大一python讲过几节课的面向对象.幸运的是,可能由于前三次作业难度还是较低,并未给我造成太大的困难,接下来 ...

  5. 面向对象(OO)第二阶段学习总结

    0.前言 此阶段总共进行三次大作业,其中第一次作业中的第一题,水文数据校验及处理中,遇到较大的难题,第一次接触正则表达式,编码过程中显得难度特别大.第二次作业同样也是对于一元多项式求导中对单项的正则校 ...

  6. OO第二阶段纪实

    $ 0 写在前面 往往是那些令人格外痛苦的经历,会带给人以最快的成长.转眼间,半个学期的时间过去了,时间匆匆,不管之前对这几次充满了怎样的畏惧,在身边朋友们的帮助和努力下,我也渐渐度过了一个个难关.回 ...

  7. OO——电梯作业总结

    目录 电梯作业总结 程序结构与复杂度的分析 第一次作业 第二次作业 第三次作业 程序BUG的分析 互测 自动评测 有效性 总结 电梯作业总结 程序结构与复杂度的分析 第一次作业 1.设计思路 第一次作 ...

  8. OO——JML作业总结

    目录 第三单元博客作业 JML语言理论基础 1.注释结构 2.JML表达式 3.方法规格 4.类型规格 应用工具链 JMLUnitNG使用实例 作业架构设计 第一次作业 第二次作业 第三次作业 BUG ...

  9. OO电梯作业总结

    (一)第五次作业 一.设计思路 生产消费者模型,输入接口是producer,调度器是tray,电梯是customer.由于只有一架电梯,所以生产消费模型满足以下条件: 一个生产者,一个消费者 托盘不为 ...

随机推荐

  1. L2-014. 列车调度

    L2-014. 列车调度 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 火车站的列车调度铁轨的结构如下图所示. Figure ...

  2. Linux Shell常用技巧(七)

    十六. 文件查找命令find: 下面给出find命令的主要应用示例:    /> ls -l     #列出当前目录下所包含的测试文件    -rw-r--r--. 1 root root 48 ...

  3. Centos7安装elasticsearch、logstash、kibana、elasticsearch head

    环境:Centos7, jdk1.8 安装logstash 1.下载logstash 地址:https://artifacts.elastic.co/downloads/logstash/logsta ...

  4. UOJ#206. 【APIO2016】Gap(交互,乱搞)

    描述 提交 自定义测试 有 NN 个严格递增的非负整数 a1,a2,…,aNa1,a2,…,aN(0≤a1<a2<⋯<aN≤10180≤a1<a2<⋯<aN≤101 ...

  5. Linux文本编辑器-vi/vim

    vi是Linux命令行界面下的文字编辑器,vim是vi的增强版(Vi IMproved),完全兼容 可以理解成普通的txt文本与word文档之间的差距. 注:还有一款全屏编辑器是nano,可以了解下 ...

  6. C语言__LINE__实现原理

    在test.c中写如下代码: 1 #include <stdio.h> 2 3 int main() 4 { 5     printf("line:%d\n", __L ...

  7. python中的控制流

    ifpython条件语句是通过一条或多条语句的执行结果(True或false)来决定执行的代码块 if语句用于控制程序的执行,基本形式为:if 判断条件:执行语句....elif判断语句:执行语句.. ...

  8. lua表类型

    Lua的表的定义: typedef struct Table { CommonHeader; lu_byte flags; lu_byte lsizenode; /* log2 of size of ...

  9. Nodejs-第一篇(什么是NodeJS)

    NodeJS 介绍 Node.js 是什么? 1.Node.js 是一个开发平台,就像Java开发平台..Net开发平台.PHP开发平台.Apple开发平台一样: 什么是开发平台?它们有对应的编程语言 ...

  10. SVG动画总结

    SVG可以在内部定义CSS动画样式,包括动画,如下面的格式: <svg> <defs> <style> </style> </defs>&l ...