对于OO这门课,学长学姐偶尔提起,大家都略有耳闻,但是并没有将其和计组相提并论。因此,在刚开始接触的时候,并不认为其会比计组难到哪里去,然而事实证明,还是不要想当然去判断,以及不提前学好JAVA对于OO这门课会降低很多的生存率。

代码度量分析程序结构:

       第一次作业

       Metric度量分析:

             在度量分析中,可以看到第一行是红色标注的,这反映的是一个模块的复杂程度,而第三行反应的是各类的嵌套深度。从中不难看出,我所撰写的某个方法过于复杂,这是由于我将正则表达式的匹配加之对其是否正确的判断以及最后的输出功能都放在了这个方法中,因此出现了这个方法过于复杂的情况。从根本上来说这是由于第一次接触java语言,对于面向对象的思想还是不够理解,本质上还是撰写了一个偏面向过程的程序。因此,应当将每个功能细化和分开,这是十分重要的。

       类图:

       发现的bug、设计思路:

      第一次作业我自认为是测试得比较详尽的,然而却忽略了指导书上提到的一个点,导致了三个测试点错误,那就是当系数为0时,不打印这对数。我当时并没有仔细去看指导书,对于这点要求是真的没有看清楚,这让我十分懊恼,也让我懂得了指导书是很重要的一个东西(还有readme)。惭愧的是,这次作业中还有一个bug没有被公测和互测测出,从而导致了第二次作业的失误。

在设计上,我将正确匹配到的数字存入一个大数组,然后用dividenum()方法将其分割为系数和指数,然后进行同指数合并并计算排序,思路简单,但是实现复杂。并且正则表达式的匹配功能并不完善,判断过于复杂和繁琐,以及对于数据的边界情况并没有进行很好的测试。

       第二次作业

        Metric度量分析:

       

在第二次作业中,同样出现了方法过于复杂的情况,也就是第一行所标注的get_list()方法,我将读取字符串,处理字符串,存储正确的字符串这三个功能,都放进了这一个方法中实现,因此过于复杂是理所应当的,同时还出现了第二行所标注的问题:参数过多。由于要实现这巨大的功能,因此大量的参数和变量是必不可少的,这就显得程序的这个方法模块很膨胀,可读性非常低,并且导致我在后来debug时十分困难,连自己都记不清楚这些参数变量代表的含义,还得花时间去回忆和重新理解,得不偿失。但是这次的作业更“OO”了一点,也就是更加的面向对象化了,对这种思想有了更进一步的理解。

        类图

       发现的bug、设计思路:

在我认为第二次作业已经测试得足够完善时,公测结果又一次活生生的打了我的脸,我的程序在公测中crash了,原因是数组越界。这次的作业要求实现一个傻瓜(FAFS)调度电梯,并且要求不符合要求的无效请求需立刻给出反应。因此我的程序设计成,当输入无效时,指针减一。但如果第一条指令就错误的话,数组的指针就变成了-1,也就是越界了。这也就导致了在公测样例中,只要涉及到第一条指令无效,那么我就错了。emmmmmm,越想越气,这就好比你吃鸡捡了个空投,你捡了一把AWM但是子弹忘带走了。

这次作业的难点在于判断同质,我的方法是从后往前判断,并且将指令分类为:UP,DOWN,NULL(ER),只有后一条指令和前一条指令类型相同,并且开始时间在前一条还未执行完成时,指令才会判断为同质。这个方法存在着一些小bug,当时我并没有de出来,但是在第三次作业中发现了,追悔莫及。

     

      第三次作业:

      Metric度量分析

        第三次作业同样出现了方法过于复杂并且参数变量过多的情况,一部分原因是因为第三次作业是在第二次作业基础上的继承和重写,并且要求实现捎带功能。而我在ele_start()这个方法中,一是传进了过多的参数,二是在函数中既要判断同质,又要判断捎带,同时还得打印正确输出。可以说这个函数几乎完成了我整个程序的主要功能。这样的好处是,嗯,方便管理整个程序的运行情况,坏处依然是可读性极差,导致了我一点都不想debug。实质上,这个几乎万能的方法是不符合OO的基本思想的,对此我也十分惭愧和懊悔。

       类图

       发现的bug、设计思想:

第三次作业是我测试得最为粗糙的一次,由于时间没有安排好,导致几乎没有时间去debug和发现问题,因此捎带存在的问题很大,尤其是同层实现两个请求,并且是捎带请求时,不能很好的做出判断并且实行,同时连续两个捎带时程序也会出错,这也是由于我考虑不够周到造成的。但是在此基础上对第二次作业的改正是十分有效的,并没有重复出现第二次作业的bug,对正则的使用也更加得心应手。

捎带是这次作业最主要的功能实现,我的方法是使用一个变量loca,记录主请求的位置,然后判断接下来的指令存不存在捎带的情况,如果存在,就选择一条最优,也就是离当前楼层最近的请求执行,当执行完所有捎带请求后,回到loca的位置,执行主请求。可惜的是,我花了许多时间也没有de完我的bug。

心得体会:

1. OO这门课必须花费大量的时间和精力去学习和体会,不仅是面向对象的思想,还有设计思路的逐步完善和成熟,在动键盘前,应该至少有一个完整的设计思路,这样才会节省更多的时间,并且必须认真去理解指导书想表达的含义,readme也必须认真的去完成和说明。

2. 对于这门课,良好的心态是必要的。在身边的就有不少例子,互测的双方因为对方比知道自己的姓名而肆无忌惮。也有人跟我吐槽,一门课把整个系的阴暗面都展现出来了。我并没有遇到对我而言十分过分的人存在,我们并不能以一概全,只能以一个良好积极的心态去面对每次挑战。在抱怨别人给你找出bug之前,或者在给你readme挑错之前,为何不想想自己的问题出在哪里?为何不考虑自己的程序为什么没有完善?所以保持一个良好的心态吧。

OO第一阶段作业总结的更多相关文章

  1. OO第一阶段总结

    OO第一阶段总结 一.各次作业程序结构 第一次作业 第一次作业由于初用JAVA,还没有深刻理解面向对象的编程方法,故在编程过程中只用了一个类,一个方法,即完成了相应的程序功能.这必然不是本课程的目的, ...

  2. 【作业1.0】OO第一单元作业总结

    OO第一单元作业已全部完成,为了使这一单元的作业能够收获更多一点,我回忆起我曾经在计算机组成课设中,经常我们会写一些实验报告,经常以此对实验内容反思总结.在我们开始下一单元的作业之前,我在此对OO第一 ...

  3. 面向对象(OO)第一阶段学习总结

    前言:对OO本阶段作业情况说明 本阶段一共完成三次作业,第一次主要是在主方法里面进行编程,也就是和之前C差不多,而随着学习的深入,慢慢了解到面向对象与面向过程的区别.作业的难度也在慢慢增大,后两次都用 ...

  4. 【OO学习】OO第一单元作业总结

    OO第一单元作业总结 在第一单元作业中,我们只做了一件事情:求导,对多项式求导,对带三角函数的表达式求导,对有括号嵌套的表达式求导.作业难度依次递增,让我们熟悉面向对象编程方法,开始从面向过程向面向对 ...

  5. OO第一单元作业总结——表达式求导

    OO第一单元作业总结 第一次作业 基于度量分析代码结构 基本算法 第一次作业是简单多项式导函数求解,不需要对输入数据的合法性进行判定, 基本思想是用 (coeff, expo)表示二元组 coeff* ...

  6. java 初学者 第一阶段作业编程总结及心得体会

    0.前言 第一阶段java作业分为3次. 第一次作业是简单得一些语法和一些简单得逻辑思维,主要内容有求三角形是什么三角形的,还有就是求坐标点所在范围的,也涉及到了数字和字母的转换,总之相相当于是给ja ...

  7. Java第一阶段作业总结

    目录 0.前言 1.作业过程总结 2.OO设计心得 3.测试的理解与实践 4.课程收获 5.对课程的建议 前言 本次博客针对第一阶段的三次作业发表总结,作业要求主要是初学者对于Java的基本语法.用法 ...

  8. 北航OO第一单元作业总结(1.1~1.3)

    经过了三次作业之后,OO第一单元告一段落,作为一个蒟蒻,我初步了解了面向对象的编程思想,并将所学内容用于实践. 一.第一次作业 1.架构分析 本次作业需要完成的任务为简单多项式导函数的求解.表达式仅支 ...

  9. OO第一单元作业总结

    oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...

随机推荐

  1. HDU 1715 (大数相加,斐波拉契数列)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1715 大菲波数 Time Limit: 1000/1000 MS (Java/Others)     ...

  2. 用kubeadm 搭建 高可用集群问题记录和复盘整个过程 - 通过journalctl -u kubelet.service命令来查看kubelet服务的日志

    1.根据  https://github.com/cookeem/kubeadm-ha/blob/master/README_CN.md  去搭建ha集群,遇到几个问题: runtime networ ...

  3. Twenproxy介绍

    1 Twenproxy介绍 Twemproxy是为memcached或者Redis集群提供一个高速.轻量级代理服务.它的主要用途是降低对缓存server打开的连接数.它的主要特性例如以下: l  保持 ...

  4. 泰坦尼克(Titanic)生存因素可视化

    数据来源: kaggle 分析工具:Python 3.6 & jupyter notebook 附上数据:链接: https://pan.baidu.com/s/1D7JNvHmqTIw0Oo ...

  5. JavaWeb基础—HttpServletResponse

    HttpServletResponse对象代表服务器的响应. 这个对象中封装了向客户端发送数据.发送响应头,发送响应状态码的方法. 几个方法: 向客户端发送数据: getOutputStream() ...

  6. RabbitMQ(一):Window安装RabbitMQ

    原文:RabbitMQ(一):Window安装RabbitMQ 1.安装ERLANG语言环境 由于RabbitMQ是采用Erlang编写的,因此我们需要先安装该语言库,以便运行代理服务器.从Erlan ...

  7. JavaWeb总结(九)

    过滤器 - 一个中间组件,用于拦截源数据和目的数据之间的消息 - 过滤二者之间传递的数据 Web应用上的过滤器 -驻留在Web服务器上的Web组件 -过滤从客户端传递到服务器端的请求和响应 单个过滤器 ...

  8. 远端访问MySQL

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页     回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackgao@gmail. ...

  9. 【TJOI2015】线性代数

    题面 题解 要求的是 \[ \sum_{i=1}^n\sum_{j=1}^na_ia_jb_{i,j} - \sum_{i=1}^na_ic_i \] 可以看出这是一个最大权闭合子图问题 代码 #in ...

  10. 【BZOJ1053】[HAOI2007]反素数

    [BZOJ1053][HAOI2007]反素数 题面 bzoj 洛谷 题解 可以从反素数的定义看出小于等于\(x\)的最大反素数一定是约数个数最多且最小的那个 可以枚举所有的质因数来求反素数,但还是跑 ...