第五次作业

这次作业是电梯系列作业的终极版,要求是使用多线程实现三部电梯的运行。这次作业的难点在于第一次运用多线程技术,对于线程中的行为并不了解,以及电梯功能的实现(如果之前作业采取的是扫描指令队列预先判断电梯行为,而电梯类仅用于实现状态跳转,那么就意味着这次作业要重新设计)。多线程这部分,我在完成作业的时候了解的并不多,仅仅使用了thread.sleep()方法进行对于运行时间的模拟,以及在指令队列中疯狂添加synchronized修饰方法,而并不知道这样的深刻意义。而核心的电梯行为这部分,由于前次作业我最终推到重来,按照指导书的要求采取了标记主请求,记录请求队列,并对电梯行为进行有限状态机的模拟,故而这次作业在电梯核心部分的改动并不多。

关于bug,这次作业犯了低级错误,一是忘记考虑1层向下指令以及20层向上指令的报错,二是忘记invalid和same指令的输出规范(这点我有点不服,这部分的规范助教在知道书中并没有显式更新,而是放在群里更新的,这让很多人都看不到啊……)

度量分析部分,可以观察到的是,程序的Dispatch线程中run方法的圈复杂度过高、嵌套深度过高。这体现了我在实现不同情况下对于请求分发这个过程的实现过于集中在一个run方法下的情况,逻辑判断过于集中,没有分开进行,不利于代码维护。

第六次作业

这次作业在做之前听说是做文件系统,根据往届学长分享的经验,作业难度并不高,我也就没太担心,殊不知,这险些导致我第一次无效作业产生。IFTTT主要是实现对于文件夹的监控,以及对于文件夹内改动的输出。作业核心内容就是使用多线程对文件进行监控,而文件监控这部分有File类,虽然File类存在线程不安全的情况,但是使用自己构造的安全文件类就可以解决。作业指导书看起来并不复杂,但是一些没有注意到的小细节险些杀死我。其一,指导书中并没有显式说明监控对象应为文件或是文件夹,而我在大致阅读完指导书并浏览完在File类中可用的方法之后,在潜意识里认为监控对象只能为文件。其二,没有看清楚需要输出信息的是新增文件,这就意味着,我们必须监控之前文件所在目录下的所有文件,保存后,在于当下文件夹下文件进行比对更新,再判断。跟要命的是,这两点忽视的发现并不是同时的!!!我简直是*^!@#$%

此外,由于上次作业并没有认真学习多线程程序设计,仅仅了解了如何完整所需的程序功能,导致我这次作业在多线程设计方面着实下了很大功夫。我也在最后临近提交的时候,为了保险起见,最后测试了一下程序功能。结果差点心碎,出现了很多我之前没有发现的问题,由于多线程程序调试的不便捷性,我检查起来实在费劲,最后凭借着对于debug信息的判断,勉强de掉了我发现了bug,但对于我能想到的其他一些较为复杂的情况,我没有测试。

不能不说,结果还是挺令我意外的,并没有被测试出bug。虽然这次作业实际难度不低,但是对于最后一些特别情况的处理却没有在指导书里进行显式规定,而是让我们自行在readme中说明即可。我在readme里面说明的并不是很清楚,但是我程序的测试者却没有刁难我…真的谢谢了。

度量分析部分,可以看到,还是一样的老毛病,在圈复杂度和嵌套深度上面出现了问题(这两个想必也是一起来的吧…)。主要问题是请求处理部分包括了对于字符串的处理,导致增加了部分逻辑复杂度。而核心执行部分Trigger,其对于文件的寻找search方法写的过于臃肿,没有统一设计好,而是中途为了debug而添加了许多实际上可以合并的分支,导致的逻辑复杂度过高。

第七次作业

这次作业要求我们实现打车调度功能,是后续作业的基础,十分重要。整体难度不高,核心的路程寻找算法也有给出(我们只需要在找到最短路径的距离的基础上,生成所需的导航就可以了),而图像界面也有帮我们写好(这简直让我们告别了syso debug法啊!!!)。这次作业的核心设计是比较关键的,由于也是请求——请求队列——处理分配请求——目标执行的模板,我就采取了跟我的电梯作业比较类似的设计思路,使用了RequestAdd线程进行指令生成,使用Dispatch类进行指令队列的添加,使用Car线程进行目标对象的行为模拟。由于在测试的时候可以使用gui类生成图形界面来进行程序调试,程序的完成过程变得顺理了很多,一路过来也没有什么特别的问题。

互测方面,我的程序没有被测出bug,而我也没有测出对方的bug。

度量分析部分,可以看到相比之前,有一定的提高。ps:gui的问题不怪我啊…。寻找路径的getRoute方法,在反馈的结果上来看,圈复杂度过高,23确实显得有些渗人。不过这是因为我之前很早就写了相关的内容,当时使用的是比较暴力的上下左右判断,对于点位置的获得需要使用多个if-else判断,而更好的方式应该是gui里面所写的使用{-1,1,80,-80}数组,运用数组下标控制,获得点位置,我想这应该不算是大问题。嵌套深度这边令我有些惊讶,原以为之前出现的嵌套深度问题应该是伴随着圈复杂度过高而出现的问题,这里,我却发现car类下的run方法,虽然没有出现圈复杂度过高的问题,却出现了嵌套深度的问题。我认为应该是对于汽车等待服务状态下,逻辑判断不够紧凑而导致的,7的深度也算是能够接受。

[BUAA OO]第二次博客作业的更多相关文章

  1. OO第二次博客作业——电梯调度

    OO第二次博客作业——电梯调度 前言 最近三周,OO课程进入多线程学习阶段,主要通过三次电梯调度作业来学习.从单部电梯的傻瓜式调度到有性能要求的调度到多部电梯的调度,难度逐渐提升,对同学们的要求逐渐变 ...

  2. OO第二次博客作业—17373247

    OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...

  3. OO第二次博客作业(第二单元总结)

    在我开始写这次博客作业的时候,窗外响起了希望之花,由此联想到乘坐自己写的电梯FROM-3-TO--1下楼洗澡,然后······ 开个玩笑,这么辣鸡的电梯肯定不会投入实际使用的,何况只是一次作业.还是从 ...

  4. oo第二次博客作业

    多线程协同与同步控制总结 第五次作业-多线程电梯 本次作业是我第一次接触多线程,建立了请求模拟器.调度器和电梯运行三种线程.请求模拟器负责在输入后识别有效请求:调度器在扫描有效请求后将新的请求加入请求 ...

  5. OO第二次博客作业--第二单元总结

    第一次作业 1. 设计策略 第一次作业,一共三个线程,主线程.输入线程和电梯线程,有一个共享对象--调度器(队列). 调度的策略大多集中到了电梯里,调度器反而只剩下一个队列. 2. 基于度量的分析 类 ...

  6. BUAA 2020 软件工程 个人博客作业

    BUAA 2020 软件工程 个人博客作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 ...

  7. [BUAA软工]第一次博客作业---阅读《构建之法》

    [BUAA软工]第一次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第1次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...

  8. Java第二次博客作业

    Java第二次博客作业 时间过的很快啊,在不知不觉中这门课程的学习也就快要过去一半了,现在就来总结一下在这个第二个月的学习当中存在的问题以及得到的心得. 1.前言 第四次题目集和第五次题目集给我的感觉 ...

  9. 第二周博客作业 <西北师范大学| 周安伟>

    一,本周助教小结 逐步开始适应助教工作,对学生发布的博客进行点评,查看学生对软件工程前期的准备情况. 二,助教本人博客 https://home.cnblogs.com/u/zaw-315/ 三,学生 ...

随机推荐

  1. [NOI2001]炮兵阵地 【状压DP】

    #\(\color{red}{\mathcal{Description}}\) \(Link\) 司令部的将军们打算在\(N \times M\)的网格地图上部署他们的炮兵部队.一个\(N \time ...

  2. Log4J日志配置与Juit测试

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器).Appenders(输出源)和Layouts(布局). 这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

  3. 目标反射回波检测算法及其FPGA实现(准备篇): 用Verilog-HDL状态机控制硬件接口

    基于FPGA的目标反射回波检测算法及其实现(准备篇) :用Verilog-HDL状态机控制硬件接口 前段时间,开发了一个简单的目标反射回波信号识别算法,我会分几篇文章分享这个基于FPGA的回波识别算法 ...

  4. how browser works

    https://developers.google.com/speed/articles/reflow http://blog.letitialew.com/post/30425074101/repa ...

  5. JavaEE笔记(二)

    查询load()和get()的区别 # 以下查询都是根据id查询 // Load和Get都会在第一次查询的是创建一个一级缓存查询语句 // 下一次查询的时候从缓存中查询是否有缓存的语句 // 如果有只 ...

  6. python基础学习1-网络爬虫程序中的代理IP设置

    #!/usr/bin/env python # -*- coding:utf-8 -*-网络爬虫代理 import urllib.request import random url="htt ...

  7. matplotlib绑定到PyQt5(无菜单)

    很简单的实现matplotlib绑定到PyQt5 [知识点] import matplotlib matplotlib.use("Qt5Agg") from matplotlib. ...

  8. Asp.net中使用缓存(cache)

    做了一个时间优化的项目,目的就是缩短程序过程中的时间花费,最后发现了asp.net和asp.net core 中都有缓存工具来进行缓存,以加快访问速度. 找了官方demo来进行分析: ObjectCa ...

  9. I NETWORK [thread1] waiting for connections on port 27017

    小技巧:mongodb安装完之后可以将安装目录的/bin添加到系统环境变量 一.问题 windows上安装完mongodb之后,设置完dbpath,一直卡在这里 二.解决办法 别关这个终端,再开个终端 ...

  10. 2018年美国大学生数学建模竞赛(MCM/ICM) C题解题思路

    整个赛题是一道大数据的深层挖掘与分析赛题,数据在这是很重要的组成因 素,因此大家首先应该把题目所给的数据搞清楚搞明白.赛题的关键是能源生产 和使用的合理安排,针对第一部分,主要解决能源的配置与评价问题 ...