设计策略及其变化

第五次作业-多线程电梯

在这次作业一开始的大部分时间,我一直想着怎样设计最为完美,完全使用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. [BZOJ1370][Baltic2003]Gang团伙 并查集+拆点

    Description 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: 所有是朋友的人组成一个团伙.告诉你关于这n个 ...

  2. C# WinCE项目 VS2008 单例窗体实现

    项目现有主界面FormMain,模板界面FormModel,其余5个子界面皆继承自模板. 现在想要实现在主界面下可以打开任意子界面,并且可以随时关闭.当打开的子窗体未执行Close事件时,要保证每次显 ...

  3. 第五次程序设计作业 C++计算器雏形 调用文件输入输出

    一.C++计算器作业系列链接 第三次作业:C++计算器雏形 第三次作业附加:代码规范 第四次作业:命令行的调用及计算 MyGithub 二.本次作业相关 要求:第五次程序设计作业 根据这一次的作业要求 ...

  4. booststrap select2的应用总结

    本身对前端js了解不是特别多,在项目中,遇到很多前端的问题,有时间整理一下,有不对的地方,不吝赐教,多多批评指正. 在项目中,遇到最多的select下拉框情景,莫过于多选和单选了 单选是很容易理解的, ...

  5. 测试报告 之 testNG + Velocity 编写自定义html测试报告

    之前用testNG自带的test-outputemailable-report.html,做出的UI自动化测试报告,页面不太好看. 在网上找到一个新的报告编写,自己尝试了一下,埋了一些坑,修改了输出时 ...

  6. Oracle学习笔记(一)——并发与锁

    1 并发 多用户数据库管理系统的一个主要任务是对 并发(concurrency)进行控制,即对多个用户同时访问同一数据进行控制.当缺乏有效的并发控制时,修改数据的操作就不能保证正常,从而危害数据完整性 ...

  7. 远程SqlServer服务器

    ①,安装net framework3.5. ②,安装sqlserver2014(例). ③,基本配置. 安装sqlserver2014时,开启混合认证模式.当然,也可以在安装后,通过sqlserver ...

  8. xinwenti

    angularjs  angular2脏检查机制和数据双向绑定远离 angular2 aot编译

  9. hdoj2476 String painter

    题意:有一刷子,能将区间内涂成同一字母.给出src,dst串,问最少涂几次? 用dp[i][j]表示区间[i,j]内最少涂的次数.len=1,2时很明显.len=3时,dp[i][j]要么就在dp[i ...

  10. Confluence 6 使用 LDAP 授权连接到 Confluence 内部目录

    希望连接一个内部目录但是使用 LDAP 检查登录授权: 在屏幕的右上角单击 控制台按钮 ,然后选择 General Configuration 链接. 单击左侧面板上面的 用户目录(User Dire ...