zoukankan      html  css  js  c++  java
  • 第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能够越来越好,也希望大家能够不忘初心。

  • 相关阅读:
    判断广播是否已注册
    Android 之使用LocalBroadcastManager解决BroadcastReceiver安全问题
    Android BroadcastReceiver 注册和反注册
    关于Android TaskAffinity的那些事儿
    文件读取方法(FileHelpers) z
    FileHelpers 用法 z
    tdf sample
    打开文件
    async/await 异步编程
    使用Topshelf创建Windows服务
  • 原文地址:https://www.cnblogs.com/AlbertShen99/p/8714474.html
Copyright © 2011-2022 走看看