久仰OO大名,总是想着提前做点准备,其实到头来还是什么准备都没有做,所以这学期就是从零开始的面向对象生活,也因此遇到了很多的问题。

  • 第一次作业——多项式加减

  第一次作业历来是较为简单的,但是对于面向对象零基础的人来说也是有所困惑,到底什么样子的代码才算是面向对象?初次见识java,完全体会不到面向对象的思想,因而在代码编写中透露出了一股浓浓的面向过程思想,基本就是照着C程序改过来的,勉勉强强写了个Class上去,然而还是main方法干的活多,只在Mult_to_operate类中写了几个简单的操作多项式的方法,而在main方法里输入数据,判断格式。这样子的代码根本就是一个C程序的翻版,毕竟自己当时真的就是java零基础。

  第一次作业的度量和UML图:

  由于是第一次使用正则,理解的不是很透彻,因此发生了正则爆栈的问题,但是为时已晚,也没有想到解决办法,只有使用try-catch大法来如实报告自己的错误,导致最后一个压力测试的测试点没过。对于格式的处理,本想使用状态机来判断,于是将C程序的状态机复制过来,但是立马发现了很明显的错误,没有对最后一位符号进行判断。这也是我在互测时寻找别人BUG的方法,因为我遇到的那个人就是使用状态机来判断格式的正确与否,因此着重考虑了式子的最后一位,最终发现了两个BUG+一个数组越界的Crash。在互测阶段,被报告了一个bug,即多个前导0,而我在正则表达式中只匹配了一个0,这的确是疏忽大意了。

  • 第二次作业——傻瓜式电梯

  在做这次作业时,已经初步了解了面向对象的思想,在作业中也使用了五个类,多个方法去实现,其实对于傻瓜式电梯,如果能够明白电梯运行的原理,就会变的非常简单,无论是楼层请求还是电梯内请求,都是为了到达那一层,因此在运行时只需要考虑电梯要上行至要求的楼层还是下行至要求的楼层就可以了。但是在这次作业中出现了致命的错误,也是极为简单的错误——输入的指令不正确时忘记输出ERROR,其实如果这里没出问题的话公测肯定是全过了,互测阶段被报的BUG也是这个原因。这次作业其实非常简单,由于不需要考虑捎带,完全没有自己一开始所以为的那么困难,而自己在互测阶段也没有能够发现别人的BUG,毕竟这次作业的逻辑很简单。

  本次作业的UML图和度量:

 

  在这次作业中,elevator的内容过少,只有设置楼层和读取楼层,而requestline几乎就是将request重复了一遍,而Floor类是几乎没有什么用,就把他当做主类来运行了,而绝大部分的工作都是由Scheduler类实现,它干的活最多,每个类的方法分布非常不均匀。

  • 第三次作业——可调度电梯

  可调度电梯相比于傻瓜式电梯,也只是多了一个条件,就是能够捎带,而其余的运行还是和傻瓜式电梯一样。

  我个人的做法就是首先将当前指令加入到一个小“队列”中,然后对当前指令进行判断是否存在能捎带的指令,如果能够捎带,就把能够捎带的指令往小“队列”中添加,判断了一遍之后再从当前指令开始再次判断一次,因为在第一遍扫描过程中,最终完成的指令可能已经发生了改变,因而可能有新的指令能被最终指令捎带上,通过这种判断方式,就能够生成一条小“队列”,然后开始运行这条小“队列”,小队列运行完毕后再从指令中寻找到下一条没有运行过的指令,开始创建新的小“队列”。

  本次作业的UML图和度量图如下:

  

 

  这次的代码由于基本是照搬上次的代码,导致在修改时,承接了上次的思想,因而导致Scheduler类更加臃肿了,由于判断失误,而最后时间不充足,没有充足的时间去改正方法,导致出现了两三个代码相似度极高的方法,很是臃肿,其实可以简化很多的代码。

  但是自己在最初失踪没有正确理解到捎带的概念,到底什么时候能够捎带,什么时候不能捎带,上行捎带和下行捎带的区别,这些问题自己的都没有弄清楚,最终在代码中出现了大量的BUG,经过不断的调试,勉强通过了所有的公测点,但是自己也意识到在某个地方仍然存在着错误,倒是对于稍长一点的测试数据就会出现问题,但已经没有时间去调整了,只有在后来才能进行调整,互测阶段被找到的BUG也是由于稍长的指令而出现的问题,初步定位在下行捎带的位置,因为自己在最开始误认为上行捎带和下行捎带是一样的。

  互测阶段所得到的代码又是一个大佬级别,上行下行,基本都测试了,但是还是挑不出任何错误。

  心得体会:

  在OO课程的学习中,逐渐领会到了面向对象的思想,并能够将其运用到代码撰写中,虽然还是比较初步的思想,并没有深入,但是通过课程的逐步学习,已经逐渐掌握。其实对于java这门语言,语法基本不用学习,重要的就是面向对象的思想,否则完全就可以把java当做另类的C程序,那么这样子的java就失去了意义。

  在撰写代码时,有一个清晰的思路极为重要,如果能够首先就将思路理清楚,知道首先干什么,然后再去干什么,同时要弄清楚原理,不能看的迷迷糊糊就急急忙忙的开始写,这样只会在后来的测试中发现更多的BUG,就比如第三次作业,如果能够好好的看清楚要求,在开关门时刻不进行捎带请求,那么后面我所遇到的很多问题都不会出现。在调整程序的过程中也要注意对于代码的改动所产生的其他影响,不能出现把这个BUG修复了,上一个修复了的BUG又冒出来的情况,这样子做完全是就是得不偿失。

  测试程序时,首先要了解程序的运行机制,在每个关键区域都考虑一下是否会存在错误,如数组的边界等。读懂自己的代码容易,读懂别人的代码难,但是只要用心去看,总是能够大致了解到别人的思路,顺着别人的思路去思考,去测试,这样才有可能发现BUG,而一味的靠猜,靠试,是很难发现自己或者对方的错误的。

OO的第一次死亡的更多相关文章

  1. 始入OO课程的殿堂,初识面向对象的奥妙——OO第一次博客总结

    当我满怀期待叩开OO的大门,却发现宝藏藏在层层阻难之后 第一次作业 1.度量分析 >关于第一次作业的metrics图分析没有出现标红的McCabe Cyclomatic Complexity或者 ...

  2. OO第一单元自白

    Homework 1  简单多项式导函数 对于初次接触的OO,第一次作业已经可以体会到其与面向过程的C语言之间的差别. 我的想法是,建立了Multinomial和Monomial 两个类,分别能够实现 ...

  3. oo作业总结(二)

    概述 和前三次作业相比,这几次作业最大的不同是难度的飞跃.遗憾的是在这难度的变化面前,我自己却没有做好充分的准备,错误的低估了作业难度导致给自己带来了很多不必要麻烦和损失.接下来我将对它们进行说明(度 ...

  4. OO第一阶段总(休)结(养)分(生)析(息)

    第一次作业: 这是一次让我认识到ddl面前潜力真的可以无限大的作业. 一直以为OO是一门和数据结构一样先用几周的时间讲讲Java然后写写”Hello World”小程序再开始讲正课的我(我也不知道为什 ...

  5. oo——第三单元总结

    前言 第三单元是我们学习oo以来第一次接触JML.这一单元的三次作业和以前一样,采用了难度递进的方式,而且前一次作业的设计思路在下一次作业都多多少少有些体现(或者说是在其基础上做出的改进).而且本单元 ...

  6. OO第三单元——JML规格化设计

    OO第三单元--JML规格化设计 JML语言的理论基础以及应用工具链情况 理论基础 JML是对JAVA程序进行规格化设计的一种表示语言,是一种行为接口规格语言.JML整合了Java和JAVAdoc,并 ...

  7. heartbeat单独提供高可用服务

    本文目录:1.简介2.安装heartbeat 2.1 编译安装Heartbeat3.heartbeat相关配置文件 3.1 配置文件ha.cf 3.2 配置文件authkeys 3.3 配置文件har ...

  8. 【黑金原创教程】【Modelsim】【第三章】理想就是美丽

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

  9. Unity/C#基础复习(5) 之 浅析观察者、中介者模式在游戏中的应用与delegate原理

    参考资料 [1] <Unity 3D脚本编程 使用C#语言开发跨平台游戏>陈嘉栋著 [2] @张子阳[C#中的委托和事件 - Part.1] http://www.tracefact.ne ...

随机推荐

  1. P1004 方格取数

    题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...

  2. iOS蓝牙开发(4.0)详解

    最近由于项目需要, 一直在研究蓝牙4.0,在这儿分享给大家, 望共同进步. 一.关于蓝牙开发的一些重要的理论概念: 1.当前ios中开发蓝牙所运用的系统库是<CoreBluetooth/Core ...

  3. jQuery Nestable2 使用总结

    最近,因为公司的一个新项目,用了一个基于bootstrap二次改造的国外友人的框架.感觉很一般吧,要求更换框架,客户拒绝.只能搞这个,发现里面一个jQuery插件-[Nestable]但是源作者长时间 ...

  4. SFTP Using Chilkat Active component

    https://www.example-code.com/vb6/sftp_uploadBandwidthThrottle.asp Private Sub Command1_Click() ' Imp ...

  5. 20155229 《信息安全系统设计基础》 Mypwd实现

    Mypwd 内容 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 学习pwd命令 通过man pwd查看 pwd命 ...

  6. # 课下测试ch02

    课下测试ch02 1.假设下面位串是基于IEEE格式的5位浮点表示,一个符号位,2个阶码位,两个小数位.下面正确的是(AD) A . 3.5的表示是[01011] B . -1.0的表示[01111] ...

  7. springboot之assembly的文件配置

    一.在使用springboot框架的时候,存在一个问题.就是我们配置yaml文件,需要单独提出来做参数修改.当然这个是可以通过spring.profiles.active的方式来配置dev,prod等 ...

  8. Model详解

    一.数据库操作 Model操作: 创建数据库表结构(建表) 操作数据库表(增删改查) 做一部分的验证(验证) a.建表 1.表字段 AutoField(Field) - int自增列,必须填入参数 p ...

  9. 【总结】详细说说Html.ActionLink的用法

    Html.ActionLink概述 在MVC的Rasor视图引擎中,微软采用一种全新的方式来表示从前的超链接方式,它代替了从前的繁杂的超链接标签,让代码看起来更加简洁,通过浏览器依然会解析成传统的a标 ...

  10. python基础开发环境Pycharm的详细使用方法

    PyCharm是由JetBrains打造的一款Python IDE(集成开发环境) 1. 创建Python文件 2. pycharm的操作界面 3. PyCharm修改字体大小的方式 4. pycha ...