设计策略及其变化

第五次作业-多线程电梯

在这次作业一开始的大部分时间,我一直想着怎样设计最为完美,完全使用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作业分析与小结的更多相关文章

  1. 2018-北航-面向对象-前三次OO作业分析与小结

    基于度量的程序结构分析 由于平时使用了NetBrains出品的IDEA作为IDE,在分析程序的时候我使用了IDEA的插件Metrics Reloaded.然而在使用时发现不懂得很多分析项目的含义,因此 ...

  2. 2018-北航-面向对象第三次OO作业分析与小结

    1. 规格设计的发展历史 规格设计用于对程序设提供分解,抽象等的手段.在撰写代码规格的时候,需要对组成部件进行抽象. 在1960s,软件设计出现危机,例如Dijkstra提出了goto语句的种种危害, ...

  3. 【作业】HansBug的前三次OO作业分析与小结

    OO课程目前已经进行了三次的作业,容我在本文中做一点微小的工作. 第一次作业 第一次作业由于难度不大,所以笔者程序实际上写的也比较随意一些.(点击就送指导书~) 类图 程序的大致结构如下: 代码分析 ...

  4. 【作业2.0】HansBug的5-7次OO作业分析与小结,以及一些个人体会

    不知不觉又做了三次作业,容我在本文胡言乱语几句2333. 第五次作业 第五次作业是前面的电梯作业的多线程版本,难度也有了一些提升.(点击就送指导书) 类图 程序的类图结构如下: UML时序图 程序的逻 ...

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

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

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

    类的设计: 首先,我对我的思路进行整体的说明,由于我的三次作业,思路是继承的,所以做总体的说明 第一,   Main类,Main类自身并没有功能,他的功能只是构造需要的电梯线程和输入线程. 其中,第三 ...

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

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

  8. OO前三次作业分析

    一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...

  9. OO面向对象第三次作业总结

    面向对象第三次作业总结 一.JML基础梳理及工具链 注释结构 行注释://@annotation 块注释:/*@ annotation @*/ 两种注释都是放在被注释部分上面. 常见表达式 原子表达式 ...

随机推荐

  1. 51NOD 1027 大数乘法

    1027 大数乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题   给出2个大整数A,B,计算A*B的结果.   Input 第1行:大数A 第2行:大数B (A,B ...

  2. BZOJ2724 [Violet]蒲公英 分块

    题目描述 经典区间众数题目 然而是权限题,所以题目链接放Luogu的 题解 因为太菜所以只会$O(n*\sqrt{n}+n*\sqrt{n}*log(n))$的做法 就是那种要用二分的,并不会clj那 ...

  3. Linux 操作 mysql

    linux mysql 操作命令 [转 来源] 1.linux下启动mysql的命令:mysqladmin start/ect/init.d/mysql start (前面为mysql的安装路径) 2 ...

  4. OSError: [WinError 193] %1 不是有效的 Win32 应用程序。

    经过搜索查找,发现错误原因是我在win7 x64的机器上装了64位的python IDLE,不能有效load32位的dll,换成32位的python就好了.

  5. python 压缩tar 包

    import tarfile import os def make_targz(output_filename, source_dir): print("doing!") with ...

  6. Java DecimalFormat的主要功能及使用方法

    DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字.该类设计有各种功能,使其能够分析和格式化任意语言环境中的数,包括对西方语言.阿拉伯语和印度语数字的支持. ...

  7. spring与shiro的集成

    web.xml中的配置: <!-- The filter-name matches name of a 'shiroFilter' bean inside applicationContext. ...

  8. MongoDB(课时19 数据删除)

    3.4.4 删除数据 在MongoDB里面删除数据使用“remove()”.但是这个函数有两个可选项: 删除条件:满足条件的数据被删除. 只删除一个数据:设置为true或者是1表示只删除一个. 范例: ...

  9. 生成全球唯一标识GUID

    有时候我们操作数据的时候需要给这些数据一些编码,而这些编码又希望永远不会重复!这个时候微软的C#给了我们一个函数,这个函数产生的编码全球唯一,永远不会重复! 方法如下: 1.C#生成方式 string ...

  10. C++编程模板2

    C++编程模板2 #include <iostream> using namespace std; /* */ int main(){ int ans; printf("%d\n ...