2018-北航-面向对象567次OO作业分析与小结
设计策略及其变化
第五次作业-多线程电梯
在这次作业一开始的大部分时间,我一直想着怎样设计最为完美,完全使用BlockingQueue,导致交作业前发现设计并不能满足指导书的要求。最后仓皇之中加了一个新的类,既臃肿,又是轮询实现,导致出现了bug。
第六次作业-IFTTT
这次作业采用了不同照snapshot
的方式实现,由于对指导书理解有些问题,导致出现了一个未考虑的情况。这次作业中线程安全的文件类的设计加深了我对线程安全以及Java文件操作的理解。
第七次作业-出租车调度
这次主要使用了锁来实现线程安全,我的地图类有放置等待的请求和找最短路两个功能,寻找最短路是没有安全问题的,而放置请求需要线程安全。其他的部分都和以前类似。
基于度量的分析
第五次作业-多线程电梯
这次作业在OO度量的表现上其实还不错,也是因为前期花了不少时间去设计,但是最后却发现设计中有一个没考虑到的地方会导致不符合题意,因此最后只能匆忙改变了设计,增加了一个不断轮询然后向电梯发送请求的Work Thread,这样的做法其实还是不怎么好的。
第六次作业-IFTTT
类的设计还是不错的,采用了不断拍摄“快照”,再对比快照的方式。这里比较有意思的是文件安全类,使用了一个HashMap,以绝对路径为key,以File对象为value,获取文件只能通过静态方法getFile,从而不会出现有两个File对象指向同一个文件的情况。
在线程安全方面,还是采用了BlockingQueue解决一切问题的方法,比如监控器向负责输出文件的类传递信息都是使用BlockingQueue。这种方法简单,而且也保证了线程安全,不错!
第七次作业-出租车调度
这次作业就比较烂了,其实一开始还是花了不少时间来分析的。例如为了不开上百个线程,我让两个线程CarsController和RequestDispatcher分别负责调度所有的出租车和请求。另外一个RoadMap类负责放置请求和寻找最短路。总体设计比较合理,但是细节上出现了很多问题,例如从上图中可以看到,各个类的耦合程度相当高,而且主线程似乎没什么用但又不能去掉,有一种食之无味弃之可惜的感觉。
bug分析
第五次作业-多线程电梯
我方:
被找了一个bug,是由于之前所说,最后时刻发现设计问题然后匆忙改正,导致出现了bug。
我采用了一个特殊请求作为程序结束的标志,所有线程拿到该请求后之星完手中的活后结束。而我写的用于分配请求的轮询线程由于没有考虑清楚,可能把所有的结束请求发给一个电梯。
对方:
对方的时间模拟似乎是以1s为单位,不知道为什么会这样,但确实避免了一些bug。其他方面,他在捎带请求方面出现了一些问题,均已被发现。其实我是当做黑盒测试的。
第六次作业-IFTTT
我方:
这次作业虽然互测没有bug,但是公测出了3个错误,这是由于这次作业会出现很多边界情况,而我又懒得去管,认为没有人会闲到去测这些,没想到却被测试了。bug就是有多个文件时我不能他们变更时的一一映射关系,实际上要实现并不难,也是懒惰造成的。
对方:
对方的程序写的不错,我也没找bug,实际上对方的代码也会出现我的那个错误,但我并没有报上,其实也是因为一开始并不任务这是一个错误。
第七次作业-出租车调度
我方:
这次被找出来5个bug,虽然确实有很多失误,但是也有一些bug我认为是不合理的,因此现在也正在和对方交涉。其中一个bug是我在为出租车安排任务时的距离信息是直接计算了曼哈顿距离而非BFS得到的最短距离。还有一些bug可以说是压力测试了,我的程序确实写的很烂,被测出来也情有可原。
对方:
对方有一个比较明显的bug,就是在增加信用时在乘客刚上车时就进行了。
另外我还报了一个设计错误——对方的出租车的状态分别用int型变量表示,这显然可以由枚举变量代替。
心得体会
实际上到了第六次作业之后,我便渐渐没有耐心认真完成作业了。一方面是因为好好写作业真的需要很多时间,一不小心就把一周大部分的空闲时间搭进去了,而最后的结果可能不错,但你甚至不知道是对方懒得测你的还是你的程序真的写的好。第二点就是每次作业感觉还是有一些同质化,第一次使用正则表达式,第一次互测,第一次写多线程都还是很有乐趣的,但现在兴奋点越来越少了。
怠惰的结果就是后两次作业的结果很差,对于之后的3次作业,我还是希望自己能好好对待。在策略上,首先是要早点开始,就算花的时间一样,早点开始也能给自己一些回旋的余地。另外issue虽然重要,但还是要抓住作业的重点,而不要陷入无尽的对细节的纠结中,好好写好代码才是最重要的。
2018-北航-面向对象567次OO作业分析与小结的更多相关文章
- 2018-北航-面向对象-前三次OO作业分析与小结
基于度量的程序结构分析 由于平时使用了NetBrains出品的IDEA作为IDE,在分析程序的时候我使用了IDEA的插件Metrics Reloaded.然而在使用时发现不懂得很多分析项目的含义,因此 ...
- 2018-北航-面向对象第三次OO作业分析与小结
1. 规格设计的发展历史 规格设计用于对程序设提供分解,抽象等的手段.在撰写代码规格的时候,需要对组成部件进行抽象. 在1960s,软件设计出现危机,例如Dijkstra提出了goto语句的种种危害, ...
- 【作业】HansBug的前三次OO作业分析与小结
OO课程目前已经进行了三次的作业,容我在本文中做一点微小的工作. 第一次作业 第一次作业由于难度不大,所以笔者程序实际上写的也比较随意一些.(点击就送指导书~) 类图 程序的大致结构如下: 代码分析 ...
- 【作业2.0】HansBug的5-7次OO作业分析与小结,以及一些个人体会
不知不觉又做了三次作业,容我在本文胡言乱语几句2333. 第五次作业 第五次作业是前面的电梯作业的多线程版本,难度也有了一些提升.(点击就送指导书) 类图 程序的类图结构如下: UML时序图 程序的逻 ...
- 北航oo作业第一单元小结
前言 在经过了三次艰辛的oo作业后,oo课程的第一单元告一段落,这一单元,我作为一个oo小白,开始了解oo的编程思想,也有了自己的一点心得体会.把笔粗成字,不当之处,还请各位大佬多多指教. 一.分析程 ...
- 北航oo作业第二单元小结
类的设计: 首先,我对我的思路进行整体的说明,由于我的三次作业,思路是继承的,所以做总体的说明 第一, Main类,Main类自身并没有功能,他的功能只是构造需要的电梯线程和输入线程. 其中,第三 ...
- 北航oo作业第四单元小结
1.总结本单元两次作业的架构设计 在我动手开始总结我的设计之前,我看了其他同学已经提交在班级群里的博客,不禁汗颜,我是真的偷懒.其他同学大多使用了新建一个类,用以储存每一个UMLelemet元素的具体 ...
- OO前三次作业分析
一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...
- OO面向对象第三次作业总结
面向对象第三次作业总结 一.JML基础梳理及工具链 注释结构 行注释://@annotation 块注释:/*@ annotation @*/ 两种注释都是放在被注释部分上面. 常见表达式 原子表达式 ...
随机推荐
- ActiveMQ、RabbitMQ、RocketMQ、Kafka 对比(图示)
RabbitMQ 和 Kafka 对比,一篇好的介绍文章:https://my.oschina.net/u/236698/blog/501834 ActiveMQ.RabbitMQ.RocketMQ. ...
- hdu 6444 Neko's loop 单调队列优化DP
Neko's loop Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- Python Sip [RuntimeError: the sip module implements API v11.0 to v11.2 but the PyQt5.QtCore module requires API v11.3]
不知道原因,尝试卸载.编译安装均失败.只有这样曲线救国 import matplotlib matplotlib.use("WXAgg",warn=True) import mat ...
- 如何插入sql数据
原:http://blog.csdn.net/Weicleer/article/details/47608289
- spoj MINSUB 单调栈+二分
题目链接:点击传送 MINSUB - Largest Submatrix no tags You are given an matrix M (consisting of nonnegative i ...
- testNG 学习笔记 Day 1 使用功能详解
TestSuite处理测试用例有6个规约(否则会被拒绝执行测试) A 测试用例必须是公有类(Public) B 测试用例必须继承与TestCase类 C 测试用例的测试方法必须是公有的( Public ...
- 电脑上装两个JDK的方法
在window操作系统上配置两个JDK方便开发以及新JDK的学习 我的机子上的JDk环境为1.8 在cmd中执行:java -version 查看JDK版本 安装方法 在系统变量中配置中设置JAVA_ ...
- MongoDB(课时30 $group)
3.7.5.聚合框架(核心) MapReduce功能强大,但是它的复杂度和功能一样强大,那么我们需要MapReduce的功能,使用聚合框架中的聚合函数:aggregate(). 3.7.5.1.gro ...
- Qt5_Oracle
1.编译驱动: 1.1.源码路径:F:\ZC_software_installDir\Qt5.3.2_vs2010\5.3\Src\qtbase\src\plugins\sqldrivers\ 里面有 ...
- C++数组引用
C++数组引用 一.数组引用 C++数组的引用:引用即别名这样比指针传地址方便多了 形参中的(&a)[10]可以就看做a数组的别名,肯定要指定数组大小,如果没有后面的数组大小,天知道是变量还是 ...