oo第一次博客 

  以前从未真正的写过Java代码,接触Java也只是寒假的时候简单的看了看语法,不懂该如何面向对象,但没事,心里不惧,想着什么都是可以学的(直到真正开始写工程的时候,才发现自己还是太天真了),就这样开始了OO学习这条不归路。

一、三次作业的实现过程分析  

第一次作业

  第一次作业是多项式加减运算,首先我用c语言写了一遍,基本熟悉题目的具体要求,当用Java去写时,我遇到了下面一系列的问题(具有难度等级):

 1. 该如何划分类,如何面向对象编程;

 2.正则表达式是什么;

 3.该如何用Java来实现(语法知识);

什么都不懂,那就只好去找资源了,花了一整天的时间去看教学视频、Java教程、上网搜索博客,快速了解Java的基本语法,还有正则表达式的基本用法,但面向对象是个什么还是感觉很迷糊。这个时候最有效的办法当然是和大佬进行交流交流了,在我舍友的帮助下,我脑袋里逐渐有了清晰的设计模式,但是不是面向对象就是另外一回事了,最后事实证明,就是面向过程。

  类图

  

  度量

  

第二次作业

  第二次作业相对第一次较好一些了,但对于使用面向对象编程还是不太灵活,感觉自己的类划分不太合理,很不均衡,但又迫于时间的压力,最后不得不动手写代码;

  面临的问题:

  1.类的划分与交互问题(花费时间最长的工作了);

  2.指导书的真正含义,感觉很难懂了;

  3.调度算法问题(选择什么算法);

  根据要求主要分了电梯类,楼层类,请求类,请求队列类,调度类。

  类图

  

  度量

  

第三次作业

  第三次作业也是一个挑战(其实每一次OO作业对于我来说都是很大的挑战了,笑哭),从傻瓜电梯到A Little Smart 电梯,增加了可稍带功能,可我却不是仅仅就添加了可稍带功能,我将第二次的代码全部重构了,心血历程了。

  当我重新看我傻瓜电梯的代码时,我意识到其实自己还是在面向过程编程,对于类的职责的划分非常不均匀,导致某些类规模较大,而有些类却寥寥几行,并且发现自己当初对于每个类的功能和属性的认识还不够到位,为了后续代码的可扩展性,于是毅然决然的重构了所有的代码,将各个类的属性和功能都做了较大的调整。

  类图

  

  度量

  

 

相对于第二次作业第三次作业做的改变:

  1.电梯类继承于接口,有了up和down方法,并且有对于电梯内请求的处理,使得各个方法间者职责划分更加清晰;

  2.楼层类添加了对于楼层请求的处理;

  3..根据实际情况,请求都是从电梯类和楼层类中发出的,于是我就模拟了这种行为,将从控制面板中读到的请求交给楼层和电梯,然后再由楼层和电梯交给请求类,进行处理分析,最后再交由请求队列类,进行处理;

  4.将程序入口从调度器中分离出来;

  5.调度器中写了两个主要的方法,判断同质和判断捎带,避免了第二次作业中全部都在主函数中处理的情况,尽量将功能进行封装;

现在看来第三次作业的缺点:

  1. 主函数还是显得冗长,并且调度器承担了较大的职责;

  2.觉得判断同质不应该放在调度器中,可以放在请求类中,这样凡是进入请求队列中的请求都是可执行的请求,请求队列也就不会因为同质而再进行改变,提高其独立性;

  3.代码风格不太严谨,会显得比较丑,有阅读障碍;

对三次作业度量结果的分析

  三次度量结果是具有共性的,所以这里放在一起说明了。可以看出main和调度类圈复杂度比较高,主要原因在于其中的if,while逻辑较为复杂,但是对于输入的判断条件确实很多呀,也不知道怎样再减少了。其实这里有个问题搞不明白,对于多个&&条件,是写在一个if中好,还是写多个if_else if 好,在效率方面有区别吗,还是说只是代码风格观看上的区别?

二、  BUG分析

第一次作业  

  由于输出错误信息的内容与标准输出不一致,挂了十几个点,怕是没有像我这么菜的人了吧;

  数据过大而导致的crash,当时并不知道还有try_catch这种操作,强烈建议写try_catch;

  在设计的时候没有考虑到数据过大的问题,底下测试的数据也都较小,故出现了此种错误;

第二次作业

第二次作业互测和公测都没有bug,也许是吃一堑,长一智吧,主要原因还是课下的测试样例比较充分,但也许还存在什么未知的错误,不过是现在还没找出来罢了。

第三次作业

  公测挂了十一个点,其中十个点是因为输出的错误信息和标准输出不匹配导致的,我也是万般心痛了,自己辛辛苦苦熬夜的成果,却被这样的低级错误全部毁掉,也许痛了才会长记性,只能安慰自己幸好这样的错误在这个时候及时的出现,而不是在以后工作时出现的。互测没有被测出bug,但其实当天我就发现了自己代码的另外两个bug,公测也没有测出来(其实感觉第三次公测挺弱的),最后又花了一天时间来找自己程序的bug。

自测

自己程序的bug大多数是因为课下测试不充分,没有按照分支树去构造样例,而是通过自己对自己程序的了解,在脑中构造可能会出错的样例,进行测试,并且在构造样例时,一些逻辑性不强的部分是通过逻辑来进行检查处理的,并没有构造简单的样例去进行测试,这样也许一些较为低级的错误就不易被发现,而逻辑复杂的错误又没有想到,然后就gg了。

互测

进行格式测试, 如果对方用的是正则表达式,我会先检查其正则表达式,否则的话再根据分支树进行测试。

进行功能测试,先是简单的进行基本功能测试,再进行边界测试,压力测试,在这几次测试中都找到了对方的Bug。在测别人程序时,我曾尝试去看懂对方的代码,从而在逻辑上找到错误,但并不是每个人写的程序都那么好懂,看了三份也就只找到了一个bug,但可以大致上知道对方的思路,从而学习借鉴思想和方法。

三、第一阶段总结

  记不得是谁说过的一句话了“人生就是不断的否定昨天的过程”,每当回看的时候总是会发现问题,而这些问题却是当时很难发现的,这也就说明了总结的重要性了。

  . 类图还是提前画画比较好,会使结构更加清晰;

. 设计是要占用大量时间的,每次最难的地方也就是设计了;

. 多和大佬交流交流,但并不是说不动脑思考,而是学习好的方法和思路;

. 课下测试根据分支树进行测试,但并不是说分支树就一定是全面的,测试是个无限逼近的过程吧,多测测总没坏处,尤其是边界问题;

. 设计代码结构的时候应该想到可扩展性,要不然后面可能会走的很难;

. 不断的总结错误,改善代码,其实发现每当要添加新的需求的时候才发现原来代码的一些问题,设计问题或是风格问题等等;

 附上自己每次做OO 的过程:第一件事就是先学习该部分的理论知识;第二件事就是研读指导书,看客服群和issue上的讨论,尽力达到对指导书要求的深刻全面的理解,但却也是很容易心累的事情了QAQ;第三件事是构思自己程序,画出类图,属性方法,以及类之间是如何交互的。

  感谢OO,打不死你的都让你变得更加强大!

oo作业总结报告的更多相关文章

  1. oo作业总结报告2

    第五次作业 多线程电梯 多线程同步和控制的设计策略 明确类和对象,以及是否区分对象实例.具体类可以从类图中看出: 明确线程的类型和数量.输入作为一个线程,调度作为一个线程,三个电梯独立工作,互不影响, ...

  2. OO作业总结报告3

    规格化设计的发展史 下面部分来源:https://www.cnblogs.com/eggert/p/9098446.html: 随着计算机硬件的飞速发展,以及应用复杂度越来越高,软件规模越来越大,原有 ...

  3. oo作业总结(二)

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

  4. oo作业总结(四)

    测试与正确性论证 测试是通过构造一系列测试数据,通过对比程序的实际运行结果和预期输出结果来判断程序是否有bug的一种手段.同时,在测试的时候是默认看不到程序的具体实现的,即进行黑盒测试,例如每次OO作 ...

  5. oo作业总结(一)

    概述 经历了三次oo作业的洗礼,让我对java语言的强大以及面向对象编程有了初步的理解(当然,我是小白).本文接下来就将对自己这三次作业的代码进行分析以及分享自己的心路历程. 基础知识点考核 针对前三 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 06-python-生成器、循环器

    生成器 生成器(generator)的主要目的是构成一个用户自定义的循环对象. 生成器的编写方法和函数定义类似,只是在return的地方改为yield.生成器中可以有多个yield.当生成器遇到一个y ...

  2. feature map 大小以及反卷积的理解

    (1)边长的计算公式是:  output_h =(originalSize_h+padding*2-kernelSize_h)/stride +1 输入图片大小为200×200,依次经过一层卷积(ke ...

  3. HRBUST - 2358 Magic network

    HRBUST - 2358 思路:dfs序 + 树状数组 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimiz ...

  4. gulp自动化打包工具

    /** * Created by hasee on 2016/7/5. */var gulp = require('gulp');var sass = require('gulp-sass');//容 ...

  5. 完全二叉树的节点个数 Count Complete Tree Nodes

    2018-09-25 16:36:25 问题描述: 问题求解: 单纯遍历了一遍,emmm,果然TLE. 解题思路就是比较左边树高度和右边树高度,如果相等,那么就是一个满二叉树,返回1 << ...

  6. R语言函数总结(转)

    R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头,并且如果以 . 开头,第二个字符不允许是数字. 基本命令要么是表达 ...

  7. C语言流控制命令的总结

    C语言流控制命令的总结 基本概念: C语言中,自顶向下的的代码的流程叫做程序流. 能够改变程序流顺序的语句叫做流控制命令. 我为什么要写这篇文章 在学习C语言的过程中,经常会用到条件语句和循环语句这些 ...

  8. bedtools神器 | gtf转bed | bed文件运算

    我们生信技能书有一篇介绍bedtools的文章,可以在微信里搜着看下,非常有用. http://bedtools.readthedocs.io/en/latest/ gtf转bed用Linux命令完全 ...

  9. 单分子荧光原位杂交(smFISH)

    single-molecule RNA fluorescence in situ hybridization (RNA smFISH) 单分子荧光原位杂交(smFISH)是一种新的基因表达分析方法,能 ...

  10. springboot---->java.lang.IllegalArgumentException

    springboot aop编程时,在方法上加入通知的注解,添加织入路径测试,发生报错: java.lang.IllegalArgumentException: Pointcut is not wel ...