第4次oo作业
作业概述
作业1:多项式加法
第一次作业理解上并不困难,简言之是一个多项式合并同类项,但对于我这个第一次使用java进行编程的小白,还是充满了血和泪。
在这次课程之前,我稍微对java有一些了解,但也仅仅只是一些了解,不仅许多基本语法还不清楚,而且对于面向对象更是毫无头绪。好在java的语法与C语言比较相似,所以在第一次作业的时候,简单学习了java的基本知识后(甚至包括如何在eclipse中新建java项目,怎么运行java程序),一边百度,一边写出了第一次作业,但写出来的东西就又引出了另外一个问题——什么是面向对象?在第一次作业中,我只有一个java文件,在寝室Android大佬的“点拨”之下,对面向对象有了一个“除了主类至少还得有个其他什么类”的印象,所以在最后写出了一个四不像程序——整个程序有两个类,一个是计算类,一个是主类,主类干的唯一一件事就是调用了计算了的calculate方法,而这个calculate方法不过就是之前main方法换了个名字而已。所以指导书中“注意体会过程式和面向对象式程序的区别”让我困惑了很久,直到拿到了互测的同学的代码时,我才明白,原来面向对象是这样的啊。
作业2:傻瓜电梯
在上一周学会了java和面向对象的基本操作以后,这一次写出来的程序至少有了一个面向对象程序的样子了,或者说在指导书的“逼迫”下,写出了6个类,从而第一次体验到了写面向对象程序的感觉。但是这一次程序写得也非常生疏,一个显著特征就是其中两个各自长达100多行的方法,不禁还是让我回忆起了一丝丝面向过程程序的风格,而且正是由于这两个长度略显不合理,逻辑复杂的方法使得我第三次作业吃了不小的亏。
作业3:a little smart电梯
这次作业要求是使用继承和接口,改写一个新的调度类,从而实现请求的捎带。因为第二次的时候采用了模拟的方式,所以这一次没有进行大规模的重写,但是正如上文所说,上周写的两个各自长达100+行的复杂方法,到了这周,我已经快看不懂了!!!由于整个程序的主要逻辑都在这两个方法中,而且由于风格的不统一(尤其是注释风格,有的注释是解释的前面的代码,有的是解释的后面的代码),导致我可以说到现在为止,都还没有完全理解这段代码的各种精细操作。这也直接导致了上周没有被找出bug的程序修改后,到了这周连公测都错了4个。
作业具体内容分析
作业1:多项式加法
作业总述
此次作业公测没有被找出bug,互测被找出了一个bug,这个bug属于输入判断时没有判断符号后面是否跟着有效的多项式,导致错误的输入格式却算出了一个结果。而我找的这个人则对于边界处理不伤心,无论是数据超过整形或是单项式数目过大,都会导致其程序崩溃。
| 统计量 | 统计值 |
|---|---|
| 类数量 | 2 |
| 方法数量 | 8 |
| 代码行数 | 246 |

什么是对象
因为之前几乎没有接触过java和面向对象编程,在输入时我就遇到了问题,为什么没有一个方法能够像C语言一样输入啊,最后百度了大量资料,终于明白了输入居然也是用的对象输入
Scanner getInScanner = new Scanner(System.in);
PloyTotal = getInScanner.nextLine().replace(" ", "");
getInScanner.close();
比如这一段代码里面就是采用Scanner对象实现从控制台输入,也是java编程中“万物皆对象”编程思想的一种体现
正则表达式
最开始进行输入时,我采用的是一个字符一个字符读入,然后采用状态机的方式判断输入是否合法并把数据储存至内存中,后来看了助教们给的视频后,我开始去学习正则表达式,结果就发现了一片“新天地”。可以说正则表达式的确是字符串处理的神器,既然已经有人造好了轮子,那么直接使用它不失为一种减小工作量的好方法。在后来的学习中,我也了解到正则表达式本质上也就是一个状态机,也就是说正则表达式的时间复杂度可以理解为O(n),基本上就是最理想的速度了,无论从编程效率还是执行效率上来说,正则表达式都是一个不错的选择。
溢出
这一块可以说是oo这门课最基本的一个注意点了,不仅有数据本身不能超过所申请的内存空间所能表示的范围,同时数据量也需要注意。比如第一次作业要求能够处理20个多项式,每个多项式含50个单项式,我的室友一开始将整个字符串进行正则表达式匹配,却发现当大约输入了300个左右的单项式后就会报内存溢出的错误,而我采取了先将字符串分割为各自几个多项式,然后又将多项式分解为单项式进行最后的匹配,这样逻辑清晰,也保证了数据量处于可控的范围内。
作业2:傻瓜电梯
作业总述
此次作业公测和互测都没有被找出bug,我测试的这个人因为没有按照助教要求必须处理前100条请求而给判了一个imcomplete以外,也没有找出其他错误。
| 统计量 | 统计值 |
|---|---|
| 类数量 | 6 |
| 方法数量 | 24 |
| 代码行数 | 533 |


高内聚低耦合
这句话是在上学期学计组的时候高小鹏老师说的,个人认为,面向对象的目的其实就是为了实现高内聚低耦合的目标。在第二次作业中,我第一次编写了严格意义上的面向对象程序(虽然其中还包含有一些面向过程编程的风格)。我个人理解,面向对象的目的就是为了将目标抽象成为一个一个的对象,将其本身的性质和行为抽象成相应的属性和方法,通过将具有相关性的元素集合在一起,将其内部的操作封装起来,从而使得程序更加模块化,便于大规模开发。我认为在后面的作业中,我们也应该秉承着“高内聚,低耦合”的思想,同理,测试时也可以采用模块化的测试方法来提高测试效率和覆盖率。这次作业中的两个超长方法算是面向对象的败类,也直接导致第三次作业的大量返工,希望以后能够注意。
作业3:a little smart电梯
作业总述
此次作业公测出现了4个错误,互测没有出现错误。我测试的同学对于输入字符串格式判断不够严谨,被我挑出了两个bug。
| 统计量 | 统计值 |
|---|---|
| 类数量 | 7 |
| 方法数量 | 37 |
| 代码行数 | 911 |



代码规范
之前写程序的时候一直比较“随心所欲”,变量方法命名也很随意,注释也不规范。所以在第三次作业时,需要在第二次作业的基础上进行修改,却发现已经难以看懂上一周自己的代码了,很多变量和方法用的也是乱七八糟的,但是根据自己的理解进行修改后,却发现程序又出现了各种稀奇古怪的bug,可能这就是程序员口中的“祖传代码”吧。所以在第三次作业后,我在网上翻阅了Google的java代码规范,然后将自己的程序完全按照其规范进行了重写,重写后,不仅代码整洁了很多,而且之前一直解决不了的bug居然在重写过程中就被发现然后顺便就消灭了。在这里也给大家一个Google 开源项目风格指南作为参考。
心得
总的来说,oo这门课对于我而言是一个全新的挑战。作为一个大学前没有接触过编程,oo之前没有有计划地接触过上百行编程的菜鸡而言,oo是一门需要花大量时间投入其中的一门课程。互测阶段的找bug机制也让我感觉耳目一新,但是我也经常听周围的同学说有人恶意地找bug,恶意申报无效作业,却也让我觉得有时这门课进入了歧途,毕竟这门课的主要目的是为了让大家学习面向对象编程技术,交流学习经验的,而不是到处寻找其他人个人信息的。个人认为也有一些办法能够尽量避免这种情况发生,,比如如果在申诉阶段同一个人有大量bug被申诉,那么应该相应地倒扣测试者的分数;分发测试代码的时候后台自动删掉同学们不小心上传的.classpath .project文件等。总的来说,希望oo能够越来越好,也希望大家能够不忘初心。
第4次oo作业的更多相关文章
- oo作业总结(四)
测试与正确性论证 测试是通过构造一系列测试数据,通过对比程序的实际运行结果和预期输出结果来判断程序是否有bug的一种手段.同时,在测试的时候是默认看不到程序的具体实现的,即进行黑盒测试,例如每次OO作 ...
- oo作业总结(二)
概述 和前三次作业相比,这几次作业最大的不同是难度的飞跃.遗憾的是在这难度的变化面前,我自己却没有做好充分的准备,错误的低估了作业难度导致给自己带来了很多不必要麻烦和损失.接下来我将对它们进行说明(度 ...
- oo作业总结(一)
概述 经历了三次oo作业的洗礼,让我对java语言的强大以及面向对象编程有了初步的理解(当然,我是小白).本文接下来就将对自己这三次作业的代码进行分析以及分享自己的心路历程. 基础知识点考核 针对前三 ...
- oo作业总结报告
oo第一次博客 以前从未真正的写过Java代码,接触Java也只是寒假的时候简单的看了看语法,不懂该如何面向对象,但没事,心里不惧,想着什么都是可以学的(直到真正开始写工程的时候,才发现自己还是太天真 ...
- 北航oo作业第一单元小结
前言 在经过了三次艰辛的oo作业后,oo课程的第一单元告一段落,这一单元,我作为一个oo小白,开始了解oo的编程思想,也有了自己的一点心得体会.把笔粗成字,不当之处,还请各位大佬多多指教. 一.分析程 ...
- 北航oo作业第四单元小结
1.总结本单元两次作业的架构设计 在我动手开始总结我的设计之前,我看了其他同学已经提交在班级群里的博客,不禁汗颜,我是真的偷懒.其他同学大多使用了新建一个类,用以储存每一个UMLelemet元素的具体 ...
- 【作业】HansBug的前三次OO作业分析与小结
OO课程目前已经进行了三次的作业,容我在本文中做一点微小的工作. 第一次作业 第一次作业由于难度不大,所以笔者程序实际上写的也比较随意一些.(点击就送指导书~) 类图 程序的大致结构如下: 代码分析 ...
- 【作业2.0】HansBug的5-7次OO作业分析与小结,以及一些个人体会
不知不觉又做了三次作业,容我在本文胡言乱语几句2333. 第五次作业 第五次作业是前面的电梯作业的多线程版本,难度也有了一些提升.(点击就送指导书) 类图 程序的类图结构如下: UML时序图 程序的逻 ...
- 前三次OO作业小结
I used to be enamored of object-oriented programming. I'm now finding myself leaning toward believin ...
- 第十五次oo作业
作业十五 测试与正确性论证的效果差异 程序的测试需要通过输入特定数据等方式,检查程序是否和预期相同,因为测试不可能穷举,导致了不穷举的测试不可能验证程序是完全正确的,只能验证程序在测试时没有发生错误, ...
随机推荐
- Bean named '...' is expected to be of type [...] but was actually of type [com.sun.proxy.$Proxy7解决方法
报错 三月 07, 2017 8:09:52 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepare ...
- JavaScript中解决计算精度丢失的问题
在做项目之前老师就给我们封装好了一个js文件,解决计算中丢失精度的一些函数,直接引用js文件就可以使用. eg: var numA = 0.1; var numB = 0.2; alert( numA ...
- 前后端分离djangorestframework——路由组件
在文章前后端分离djangorestframework——视图组件 中,见识了DRF的视图组件强大,其实里面那个url也是可以自动生成的,就是这么屌 DefaultRouter urls文件作如下调整 ...
- 网络互联技术(2)——前篇—【转载】电脑结构和CPU、内存、硬盘三者之间的关系
原文链接:传送门 详细内容: 电脑结构和CPU.内存.硬盘三者之间的关系 前面提到了,电脑之父——冯·诺伊曼提出了计算机的五大部件:输入设备.输出设备.存储器.运算器和控制器. 我们看一下现在我们电脑 ...
- 洗礼灵魂,修炼python(67)--爬虫篇—cookielib之爬取需要账户登录验证的网站
学完前面的教程,相信你已经能爬取大部分的网站信息了,但是当你爬的网站多了,你应该会发现一个新问题,有的网站需要登录账户才能看到更多的信息对吧?那么这种网站怎么爬取呢?这些登录数据就是今天要说的——co ...
- PHP中判断变量是否存在的方式
isset()函数判断变量是否设置. thinkPHP中判断select查询时返回值是否为空 $object->isEmpty() empty():当变量存在,并且是一个非空非零的值时,返回 ...
- nginx 学习笔记
Nginx是一个自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作 ...
- Spring Boot 中文乱码问题解决方案汇总
使用 Spring Boot 开发,对外开发接口供调用,传入参数中有中文,出现中文乱码,查了好多资料,总结解决方法如下: 第一步,约定传参编码格式 不管是使用httpclient,还是okhttp,都 ...
- Linux之初识磁盘
磁盘知识体系概括 机械硬盘和固态硬盘 机械磁盘剖开图 磁盘工作的视频动画,主轴转动,机械手读写 模拟磁盘工作视频,点击中间三角播放 磁盘结构详解 磁盘外部结构 组成 主要由三部分组成:盘片.主轴(机械 ...
- Python之Requests库的异常
异常 说明 requests.ConnectionError 网络链接错误一场,如 ...