OO第一次博客

写在前面:

这里我来做一下oo前三次作业的小结与心得。事先声明,本人的水平能力有限,无法像大神们一样在博客中交流方法,因为我用的就是那种最简单的,并不能给别人丝毫帮助。在这里主要总结一下自己这几次作业的得失,以及心路历程。如果你也是一个编程小白且也遭遇了oo的历练,或许我的文章能让你得到一些精神上的支持,至少有和你一样境况的人还在努力奋斗。心得体会和程序分析写到一起,感觉这样写起来比较舒服。

  第一次作业:多项式加法

不由的不说,这是我这次作业做的最惨的一次,作为一个没有接触过Java,且丝毫不知面向对象为何物的超级小白,做这次作业的时候真的遇到了极大的困难。但是这还没完,由于是高工的学生,大一并没有进行扎实的代码编写训练,唯一的C语言课程也没有引起足够的重视。这导致我的编码能力处于人群底层,更加剧我学习oo的难度。好吧,以上这些可以看做是我对第一次作业无效的借口(对,你没有看错我的第一次作业无效了)。可能这对于大家来说是不可想象的事情,第一次作业难道能无效,但这的的确确在我这里发生了。坦诚而言,我从作业发出的那一刻起就开始了积极的准备,并没有拖延(对,我可以问心无愧的说我自己没有拖延),但这更体现了我能力的欠缺。

尽管作为一个水平如此之差的人把生存下来作为自己这学期的目标才是明智,可是我却觉得只要坚持与努力我应该可以取得一个更好的成绩。

于是,我对第一次作业在完成过程中的问题进行了总结:

1、在自学Java的过程中急于一下子掌握所有的知识,导致学习时间很长,收获却很零散。真正开始编码的时候又想不起来自己学习了什么。

2、没有一个提前的构造过程,上手编码杂乱无章。

  其实大家可以发现我所遭遇的问题就是那些水平不高的人才会遭遇的问题,可以看出我实力的欠缺。

说了这么多,第一次作业的具体代码情况也就不要再说了,一个无效的作业也不会有什么参考价值。但第一次作业本身的价值却很大,它让我更加清楚的认识到了我自身的情况与我今后的道路,也算是为以后的几次作业打下了基础。

  第二次&第三次作业:电梯模拟

之所以把第二次与第三次放到一起写,是因为他们很相似,就打算一起说了。

这两次作业较第一次作业来说有了长足的进步,虽然没有通过全部的公测且做到没有bug,但都完成的相对完好,公测测试错的点数在3-4个左右。只是第二次作业出了一点小插曲,因为一直在本地进行测试,没有使用评测机,所以在Sanner的使用上,出了一点小问题,导致公测全挂了,幸好好心的助教小姐姐帮忙本地测验,才算是化解(不过我的第二次作业目前还是公测全挂,表示内心很方)。

下面来简单说一说,作业思路,从第二次开始。

程序共包含6class:楼层类(Floor)、电梯类(Elevator)、指令类(Request)、指令队列类(RequestList)、调度器类(Control)

   程序流程如下:

1)用户输入请求,程序对请求进行检测,并对不合法的请求*进行报错;将合法请求储存到ArrayList<String>中;输入循环,知道用户输入”RUN”后停止;

2)从请求队列中,取出相应的指令,并根据当前的指令类型决定是由电梯还是楼层发出指令;并判断同质指令;

3)将生成的指令输入到调度器中,由调度器根据当前指令以及当前电梯的状态,计算完成指令所需的时间以及电梯停止前的方向;

4)根据情况作出输出;

类图如下(类图为手画,且好像导出会丢失画质???)

但第二次作业,依然出现了较多的小bug。在用正则表达式,判断输入是否符合要求时,使用的PatternMatcher的方法莫名其妙会漏掉右侧多括号的情况,至今仍待解决(左边就没问题啊,写的一样到右边怎么不行了呢)。还有就是我傻傻地把判断同质指令写成了只能判断相邻两个是否是同质指令,结果造成测试点的错误。

再来说一说我测试的程序出现的bug与问题,首先这个可怜虫和我因为一样的问题公测全挂了,我抱着极大的同情给他/她手动改了所有的公测点,结果发现他/她犯了和我一样的判断同质指令的问题,what an coincident。但后来我发现这道被测试的程序好像不能运行两条以上的指令,并且因为他/她没有认真写测试文档。所以我在前导0和“+”的数量上进行操作,使其出现了错误。之后发现也没什么可以添加的bug了,因为公测已经截断了我的bug寻找之路,不能在错误的分支上继续添加bug啊。

总结,第二次作业出现的问题,没有提前使用评测机系统,大忌大忌;还有就是,没有最后用错误分支树排错,出现了细小的且不该丢分的错误。在第三次作业中做出了弥补。

再来说一说第三次作业的情况。

在写第三次作业开始时,就听说了有两种处理电梯模拟的方法:时间模拟和指令模拟。第二次作业我采用的是时间模拟的方法,而听说使用时间模拟的方法会使之后的作业更加好写一些,就决定改为时间模拟,经过了一下午与一晚上的思索之后有了大致的思路,决定开始动手。但是写着写着又想到了一个当时没有想出解决办法的问题,迫于时间压力就又转回了指令模拟(在第四次作业的时候再改为时间模拟)。

具体程序思路如下:

程序包含类如下:楼层类(Floor)、电梯类(Elevator)、指令类(Request)、指令队列类(RequestList)、调度器类(Control)、重写调度器类(Schedule)clock类和一些用来排序的类。

程序具体执行步骤如下:

(1)、从指令队列取出输入时间最早的指令作为主指令,扫描整个队列寻找满足捎带条件的指令将他们包含主指令一起放入Schedule类的待处理指令序列中;

(2)、对待处理指令序列按楼层排序,并执行;当处理完主指令后,如果还有未处理的指令,则将它们按时间排序,把最先输入的视为主指令;

(3)、再扫描整个队列,如此循环直到指令队列为空;

是不是超级地愚笨......而且这还没完,因为之前的改写改不动了,所以临时换方法这件事浪费了大量的时间,所以慌乱的我就有些急于编码了。导致写的代码,临时添加了大量的内容,看起来及其混乱。

类图如下(这里应该有类图的,我插入了类图的图片,但是一到博客页面就不显示了......):

 

出现的bug也是因为混乱的编码,导致一个捎带条件判断没有写好,使得电梯会漏掉某种情况的捎带指令。测试我程序的同学,也发现了我第一条指令无法处理同质的问题,原因是我第一条指令是在上一次作业的基础上单独添加的,所以漏掉了同质判断的问题。

之后我分到的测试代码是那种,只写了两个类,一个有300多行的那种程序,所以观察程序并进行分析变得极为困难。又因为本人并不会编写脚本,所以只能采取从readme中挑取一些细微的错误。

第三次作业总结来说就是,事先设计没有做好,导致编码时出现了很大的麻烦。

最后说一下这几次作业的一个整体感受,就是还是比较有挑战性的。首次接触面向对象的语言,这结构设计上还是存在较大的问题,这也是我今后要注意与提升的。对细节的忽视也是造成我失分的一大原因,在完成作业时,没有仔细的分析错误分支树,来排除诸如各种类型的输入处理等细小的bug点,造成不必要的bug失分。

还有有些显得急于编码,使得漏掉小的分支情况的处理,最后在收尾阶段还需要打一些小补丁使得程序结构显得有些凌乱,不利于之后的分析。

综上,总结问题及思考今后的解决方案如下:继续增强编写代码的能力,多打多练;提前研究错误分支树并分析清楚所有情况后再进行编程,减少后期的修改。

总之,需要提升的空间依旧很大,需要继续努力。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-04-03 23:27  A_47  阅读(141)  评论(0)    收藏  举报