[BUAA OO]第二次博客作业
第五次作业
这次作业是电梯系列作业的终极版,要求是使用多线程实现三部电梯的运行。这次作业的难点在于第一次运用多线程技术,对于线程中的行为并不了解,以及电梯功能的实现(如果之前作业采取的是扫描指令队列预先判断电梯行为,而电梯类仅用于实现状态跳转,那么就意味着这次作业要重新设计)。多线程这部分,我在完成作业的时候了解的并不多,仅仅使用了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]第二次博客作业的更多相关文章
- OO第二次博客作业——电梯调度
OO第二次博客作业——电梯调度 前言 最近三周,OO课程进入多线程学习阶段,主要通过三次电梯调度作业来学习.从单部电梯的傻瓜式调度到有性能要求的调度到多部电梯的调度,难度逐渐提升,对同学们的要求逐渐变 ...
- OO第二次博客作业—17373247
OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...
- OO第二次博客作业(第二单元总结)
在我开始写这次博客作业的时候,窗外响起了希望之花,由此联想到乘坐自己写的电梯FROM-3-TO--1下楼洗澡,然后······ 开个玩笑,这么辣鸡的电梯肯定不会投入实际使用的,何况只是一次作业.还是从 ...
- oo第二次博客作业
多线程协同与同步控制总结 第五次作业-多线程电梯 本次作业是我第一次接触多线程,建立了请求模拟器.调度器和电梯运行三种线程.请求模拟器负责在输入后识别有效请求:调度器在扫描有效请求后将新的请求加入请求 ...
- OO第二次博客作业--第二单元总结
第一次作业 1. 设计策略 第一次作业,一共三个线程,主线程.输入线程和电梯线程,有一个共享对象--调度器(队列). 调度的策略大多集中到了电梯里,调度器反而只剩下一个队列. 2. 基于度量的分析 类 ...
- BUAA 2020 软件工程 个人博客作业
BUAA 2020 软件工程 个人博客作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 ...
- [BUAA软工]第一次博客作业---阅读《构建之法》
[BUAA软工]第一次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第1次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...
- Java第二次博客作业
Java第二次博客作业 时间过的很快啊,在不知不觉中这门课程的学习也就快要过去一半了,现在就来总结一下在这个第二个月的学习当中存在的问题以及得到的心得. 1.前言 第四次题目集和第五次题目集给我的感觉 ...
- 第二周博客作业 <西北师范大学| 周安伟>
一,本周助教小结 逐步开始适应助教工作,对学生发布的博客进行点评,查看学生对软件工程前期的准备情况. 二,助教本人博客 https://home.cnblogs.com/u/zaw-315/ 三,学生 ...
随机推荐
- 【LeetCode43】 Multiply Strings
题目描述: 解题思路: java代码: public class LeetCode43 { public static void main(String[] args) { String num1=& ...
- 在Mac检查安装的.net core 版本
在 Termianl which dotnet #查看dotnetcore的runtime路径 dotnet #dotnet 命令行工具 -h 查看帮助 #常用命令 # --info Display ...
- MvcPager.js在特定业务场景下的问题解决
用到了MvcPager.js,在一个常见的场景中出现了不能POST表单数据的问题,场景描述如下: 日期:2012-12-12 编号:***** ...
- 2017-2018-1 20155310 《信息安全系统设计基础》 实现mypwd
2017-2018-1 20155310 <信息安全系统设计基础> 实现mypwd 作业要求: 1.学习pwd命令 2.研究pwd实现需要的系统调用(man -k; grep),写出伪代码 ...
- WPF之ComboBox的VisualTreeHelper
原文:WPF之ComboBox的VisualTreeHelper 用WPF的ComboBox控件的时候,需要用到TextChanged属性,但是这个属性属于TextBox控件,不用担心,ComboBo ...
- Noip前的大抱佛脚----数论
目录 数论 知识点 Exgcd 逆元 gcd 欧拉函数\(\varphi(x)\) CRT&EXCRT BSGS&EXBSGS FFT/NTT/MTT/FWT 组合公式 斯特林数 卡塔 ...
- Noip前的大抱佛脚----奇技淫巧
STL函数 set set查找前驱后继 multiset<int>::iterator iter; S.insert(x); iter=S.find(x);//返回迭代器 iter--;/ ...
- c++ 文件位置相关操作
教学内容: l 文件定位操作 l fgetpos定位 l fsetpos设定位置 l 文件结束判断函数feof 一.文件定位操作 在C语言标准库里 获取文件位置的函数有ftell和fge ...
- 【转载】COM 组件设计与应用(七)——编译、注册、调用
原文:http://vckbase.com/index.php/wv/1218.html 一.前言 上两回中,咱们用 ATL 写了第一个 COM 组件程序,这回中,主要介绍编译.册和调用方法.示例程序 ...
- Kubernetes学习之路(十)之资源清单定义
一.Kubernetes常用资源 以下列举的内容都是 kubernetes 中的 Object,这些对象都可以在 yaml 文件中作为一种 API 类型来配置. 类别 名称 工作负载型资源对象 Pod ...