zoukankan      html  css  js  c++  java
  • 第八次oo作业

    作业五

    作业五是当前最后一次电梯作业,也是我们第一次接触到多线程编程,输入方式也由之前的一次性输入变为了实时输入,其中涉及到大量的同步和冲突,其中学习多线程的使用也花了大量的时间,但总的来说为以后的作业打下了基础。

    类图

    代码分析


    从上述分析来看,此次作业仍然存在God类,究其原因主要是因为第一次接触多线程,使用不熟练,导致对电梯使用多线程时不敢将太多逻辑置于电梯类中,从而导致了大量逻辑代码都留在了调度类中,但调度类中的方法较之于之前已经更加详细具体了,方法之间已经尽量做到了高内聚低耦合。

    总结

    由于从第一次做电梯作业开始,我就是使用的模拟的方式,所以程序整体的逻辑上没有进行大的修改,但由于此次多线程的使用,尤其是多台电梯之间捎带和请求分配之间的问题,依然存在着不小的问题,所以到最后提交时,依然存在着bug————调度类中逻辑较为复杂,而且由于多线程控制不到位,对于请求队列没有完全实现线程安全,导致会出现多个电梯同时分到同一个请求的情况发生。但由于修改量的巨大,所以未能完成修改,而测试者也将为完成的修改造成的bug找了出来。

    除此之外,此次作业的时间控制也不够精确,此次作业没有考虑到程序执行带来的大量误差,直接采用了sleep(3000)的方式,导致随着程序的运行,误差会越来越大,以至于超过误差限度。
    但此次作业也第一次采用了构建一个State类的方式,将常用到的状态量定义为常量,极大的提高了代码整体的可阅读性。

    作业六

    作业六是要求实现一个简单的ifttt,将我们所学内容与实际运用结合了起来,但由于对于文件操作的不熟练,在编写代码时也遇到了不小的问题。

    类图

    代码分析


    此次作业代码量和风格的控制较于第五次作业有了较大的提升,同时对于多线程也能够较为熟练的运用了,此次作业的自由度较之于之前的作业也有所提高,故readme的书写也应该被逐渐重视起来。

    此次作业被找出了一个bug,但严格意义上来说并不能算是bug————在编写代码的时候发现一个问题,如果对于两个除了名称其余完全相同的文件,如a,b,如果在两次扫描周期中我们将b重命名为c,将a重命名为b,对于程序来说其实并不好判断其究竟是上述操作还是直接将a重命名为了c,所以我在readme中定义如果发现有重命名,而且有多个符合要求的文件,那么我会随机选一个视为修改,对于其他的,例如路径移动也是同理。但测试者可能因为没有仔细阅读我的readme,所以报了几个bug,全部都是因为这个原因。同时我测试的同学也考虑到了类似的事情,但他的readme中定义方式为对于上述这种情况,不能在同一个周期内同时操作两个除了文件名其余属性均相同的文件。代码中实现方式为将上一次扫描中没有出现的文件作为修改后的文件,可以说完全杜绝了这种情况的发生。在最后考虑到自己在readme中定义的是出现了某种情况应该怎么解释,而不是如何避免出现这种容易导致矛盾的操作,所以我最后也同意留下一个bug。

    总的来说,此次作业是比较熟练地使用了多线程编程,但仍有一些没有考虑充分的地方,在以后的作业中也可以多注意一下这一块。

    作业七

    类图

    这次作业是第一次出租车作业,相对于之前的几个线程,此次直接将出租车数量提高到了100个,对于此我是采用了开了100个出租车线程来解决,但同时也带来了内存占用巨大的结果,也有同学采用伪多线程的方式(如我测试的同学),采用循环来执行这100个出租车。对于此种方式我认为也算是一种解决问题的方式,但也难以锻炼自己多线程编程的能力,尤其是对于线程安全的控制,所以在以后的作业中我依然会采用100个出租车线程的方式。

    代码分析


    此次作业的代码风格算是这么多次作业以来最好的一次,加之此次也较为强调代码规范问题,所以整体来看代码基本能实现一看就懂的程度了。

    但此次作业也是最不甘心的一次,但是可能是因为eclipse的bug,我最后一次提交时,本地显示已经提交了,但git上并没有提交,所以最后互测的时候交的是一个错误的版本,导致了此次作业的bug都是原本能够避免的。同时由于此次作业最开始没有发现自己的代码没有成功上传,所以在互测时测试者发现的bug在我这完全不能复现,甚至让我怀疑对方是在恶意找bug,不过好在最后发现及时(就没来得及进行代码层面以外的交流了)但也给我提醒了以后在上传了代码以后最好能够再下载一遍以确认是否正确。

    此次作业做得比较好的一点(虽然最后代码没传上去)是时间控制,我一直都采用的系统时间,没有进行假时间的操作,所以此次在State类中我可以说是自己定义了一系列新的时间方法,例如sleep时首先将当前时间进行计算,计算出真实的需要sleep的时间后再执行,可以说此次作业在时间上的误差是严格限制在了误差范围之类的。

    心得体会

    这几次作业都是多线程作业,随着几次作业的进行,我对于多线程的运用也逐渐熟悉了起来,同时代码风格和规范也得到了不小的提升,像之前作业中的每次新的作业基本都要重写一遍代码的情况可以说基本也不会再出现了。希望自己在后面的学习中能够得到更大的提升。

  • 相关阅读:
    Effective C++ -- 继承和面向对象设计
    恶意软件"跨平台" 小心钱包很受伤
    定义和实现模板类不能在同一个文件
    确定只出现曾有两位数字数组
    创业公司聘请的第一个雇员值得注意 6 事
    [转] C#-using用法详解
    c#中的序列化
    C#字符串截取
    [转] C#2010 在TreeView控件下显示路径下所有文件和文件夹
    [转] SQL Server中变量的声明和使用方法
  • 原文地址:https://www.cnblogs.com/AlbertShen99/p/8981253.html
Copyright © 2011-2022 走看看