[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/ 三,学生 ...
随机推荐
- 虹软人脸识别iOS SDK2.0
最近公司要在APP上添加一个人脸识别功能,在网上搜了一圈,发现虹软的人脸识别SDK挺好用的,而且还免费,所以就下载了他们的SDK研究了一下.总的来看功能挺好用的,只是demo上面部分功能不是很完善,所 ...
- OC 知识:Foundation 框架及相关类详尽总结
本文用来介绍Foundation框架的相关知识,以及Foundation框架所提供类的相关知识总结. 1. 框架介绍 框架是由很多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使开发程序变得更加 ...
- pyhon 列表的增删改查
li = ['alex', 'wusir', 'egon', '女神', 'taibai'] l1 = li[2] print(l1) #增加 append() 增加到最后 insert(index, ...
- git 源码学习(init-db) 提交版本号 083c516331
写在前面的废话: 学完git之后,还是感觉云里雾里的,于是乎,就想到了通过学习git源码,来加深git的熟练度,同时学习一下c语言编程. git源码学习,逐步分析 这篇帖子是逐步分析git源码的,将g ...
- 如何看数据库是否处在force_logging模式下
SQL> select log_mode, force_logging from v$database; LOG_MODE FOR------------ ---ARCHIVELOG ...
- PostgreSQL的backuplabel file 初步学习
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页 看代码: /* File path names ...
- mfc 类成员函数
知识点 类成员变量初值 类的构造函数 类成员函数 类成员函数的位置 一.类成员变量初值 二.类的构造函数 构造函数 是一种特殊的方法,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值. 构造函 ...
- c++ goto语句
#include <stdio.h> #include <math.h> int main(void) //main是程序入口 { int num; printf(" ...
- django-groundwork
我的环境是windows7 + python34 + django1.8 下面两篇文章提到了django的scaffold,感觉是一个挺不错的功能: Django实战(3):Django也可以有sca ...
- 洛谷 P1762 偶数
洛谷 P1762 偶数 题目描述 给定一个正整数n,请输出杨辉三角形前n行的偶数个数对1000003取模后的结果. 输入输出格式 输入格式: 一个数 输出格式: 结果 输入输出样例 输入样例#1: ...