作业五

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

类图

代码分析


从上述分析来看,此次作业仍然存在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的时间后再执行,可以说此次作业在时间上的误差是严格限制在了误差范围之类的。

心得体会

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

第八次oo作业的更多相关文章

  1. 北航oo作业第四单元小结

    1.总结本单元两次作业的架构设计 在我动手开始总结我的设计之前,我看了其他同学已经提交在班级群里的博客,不禁汗颜,我是真的偷懒.其他同学大多使用了新建一个类,用以储存每一个UMLelemet元素的具体 ...

  2. oo作业总结(四)

    测试与正确性论证 测试是通过构造一系列测试数据,通过对比程序的实际运行结果和预期输出结果来判断程序是否有bug的一种手段.同时,在测试的时候是默认看不到程序的具体实现的,即进行黑盒测试,例如每次OO作 ...

  3. oo作业总结(二)

    概述 和前三次作业相比,这几次作业最大的不同是难度的飞跃.遗憾的是在这难度的变化面前,我自己却没有做好充分的准备,错误的低估了作业难度导致给自己带来了很多不必要麻烦和损失.接下来我将对它们进行说明(度 ...

  4. oo作业总结(一)

    概述 经历了三次oo作业的洗礼,让我对java语言的强大以及面向对象编程有了初步的理解(当然,我是小白).本文接下来就将对自己这三次作业的代码进行分析以及分享自己的心路历程. 基础知识点考核 针对前三 ...

  5. oo作业总结报告

    oo第一次博客 以前从未真正的写过Java代码,接触Java也只是寒假的时候简单的看了看语法,不懂该如何面向对象,但没事,心里不惧,想着什么都是可以学的(直到真正开始写工程的时候,才发现自己还是太天真 ...

  6. 北航oo作业第一单元小结

    前言 在经过了三次艰辛的oo作业后,oo课程的第一单元告一段落,这一单元,我作为一个oo小白,开始了解oo的编程思想,也有了自己的一点心得体会.把笔粗成字,不当之处,还请各位大佬多多指教. 一.分析程 ...

  7. 《你说对就队》第八次团队作业:Alpha冲刺 第五天

    <你说对就队>第八次团队作业:Alpha冲刺 第五天 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 <你说对就队> ...

  8. #《你们都是魔鬼吗》第八次团队作业:第五天Alpha冲刺

    <你们都是魔鬼吗>第八次团队作业:Alpha冲刺 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 你们都是魔鬼吗 作业学习目标 完成最 ...

  9. 《你们都是魔鬼吗》第八次团队作业:第三天Alpha冲刺

    <你们都是魔鬼吗>第八次团队作业:Alpha冲刺 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 你们都是魔鬼吗 作业学习目标 完成最 ...

随机推荐

  1. spring静态代理和动态代理

    本节要点: Java静态代理 Jdk动态代理 1 面向对象设计思想遇到的问题 在传统OOP编程里以对象为核心,并通过对象之间的协作来形成一个完整的软件功能,由于对象可以继承,因此我们可以把具有相同功能 ...

  2. RMAN命令DELETE操作总结

    本篇总结一下RMAN命令中的DELETE操作,DELETE命令用于删除RMAN备份记录以及相应的物理文件. To delete physical backups and copies as well ...

  3. [20181219]script使用小技巧.txt

    [20181219]script使用小技巧.txt --//前几天在使用strace时遇到问题,它的输出使用标准错误句柄.--//我在想平时使用sqlplus如果输出字段很多,屏幕看起来一片混乱.-- ...

  4. layui中,同一个页面动态加载table数据表格

    效果图: 前端代码: <div class="layui-fluid" id="record-user" hidden="hidden" ...

  5. LeetCode算法题-Binary Tree Paths(Java实现-3种解法)

    这是悦乐书的第199次更新,第206篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第62题(顺位题号是257).给定二叉树,返回所有根到叶路径.例如: 输入: 1 / \ ...

  6. June. 21 2018, Week 25th. Thursday

    Summertime is always the best of what might be. 万物最美的一面,总在夏季展现. From Charles Bowden. It was June, an ...

  7. Nginx 安装配置

    Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. ...

  8. GraphQL 是什么

    我的理解,GraphQL 是一种以Json为载体实现:操作数据和获取结果的需求的查询语言!简言:以Json换Json.

  9. 试验一下Golang 网络爬虫框架gocolly/colly

    参考:http://www.cnblogs.com/majianguo/p/8186429.html 框架源码在 github.com/gocolly/colly 代码如下(github源码中的dem ...

  10. Python装饰器 [1]

    装饰器本身是个函数 import time def log(func): def wrapper(*args, **kwargs): start = time.time() result = func ...