概述

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

基础知识点考核

针对前三次作业,我列出了这其中涉及到的主要的知识点:

  • java基础语法
  • java正则表达式(注意不要爆栈)
  • 对java封装、继承、多态、接口的理解
  • 程序的构思能力

当然,还有最重要的还是阅读和理解指导书的能力,能够在较短的时间内准确无误的理解指导书的意图也是必需的能力之一。

程序结构分析

作业一:多项式计算

程序类图如下:

这是我第一个认真写的java程序。由于第一次作业比较简单,所以用到的类也只有三个,类图也很简单。尽管并不是纯翻译的c代码,但自从看了很多大佬的代码就愈发开始嫌弃起来。尤其是输入的检测部分,可能是脑抽了吧写了个字符状态机,这样的后果是一个明明非常简洁的程序看上去非常的臃肿,好处是它可以遍历几乎所有的情况。然后是主体部分,类的设计是源自老师的PPT,而且主体方法和其他同学的几乎都差不多,由于第一次作业较为简单,具体细节就不再赘述。但这次作业也让我对java有了较为基础的认识,对比c代码和java代码就可以看出来,很多功能用c实现起来或许很难,但用java却可以在很短的代码内写出较为高效的程序(也可能是我对c的理解不够吧);至于对面向对象的理解,此时还停留在朦胧的阶段,认为面向对象编程就是构造一些对象,然后通过对象来调用它们内部的方法。比如我第一次作业的main函数的内容是这样的:

    public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
if (!scn.hasNextLine()) {System.out.println("ERROR"); System.out.print("#输入不能为空,请重新输入"); scn.close(); return;}
String str = scn.nextLine();
if (str.length() != 0) {
str = str.replace(" ", "");
new ComputePoly(str);
} else {
System.out.println("ERROR");
System.out.println("#输入不能为空,请重新输入");
}
scn.close();
}

而ComputePoly()类是这样构造的:

 ComputePoly(String str) {
u = v = L = state = 0;
poly = new Poly[51];
for (int i = 0; i < 51; i ++) poly[i] = new Poly();
err = 0; cnt = 0; err1 = 0;
parseString(str);
compute();
}

其实就是一层一层调用其他对象。这是我对面向对象编程的一开始的理解。

作业二:傻瓜调度电梯

程序类图:

第二次作业要难一些,因为我花在指导书上的时间就差不多有接近一天,而且还是在室友以及助教的帮助下才勉强看懂这次作业的需求。我的思路是在主类中新建一个Ctrol对象,然后在Ctrol的构造函数中调用其他对象的方法(如上类图所示)。这次作业和上次作业不一样,因为合法的输入很短,所以可以直接使用正则表达式匹配而不用考虑爆栈问题。在程序的设计中,比较难或者比较模糊的一点是同质指令的判断,我自己写版本是这样的(虽然是对的但很冗余):

              for (int i = 1; i < req.get_size(); i ++) {
r2 = req.get(i);
if (r1.issame(r2)) {
if (r1.get_kind() == 0) {
if (r2.get_tim() - r1.get_tim() <= 1 ||r2.get_tim() <= lift.get_all_tim() ) r2.set_ok(false);
}
else {
if (r1.get_tim() == r2.get_tim() || r2.get_tim() <= lift.get_all_tim()) r2.set_ok(false);//
} }
}

后来在室友的提点下(暴露智商了),第三次作业改成了这样:

 for (int i = 0; i < req.get_size(); i ++)
if (!solve[i] && re.issame(req.get(i)) && req.get(i).get_tim() <= lift.get_all_tim())
{System.out.println("#SAME[" + toReq(req.get(i)) + "]"); solve[i] = true;}

即只需要一个判断条件就足够;

程序的主体框架和第一次作业类似(大概我对面向对象的理解还停留在原地吧),main函数内容如下:

 public class Main {

     public static void main(String[] args) {
new Ctrol();
}
}

另外与第一次作业不同的是,此次作业的属性都为private类型(不考虑继承),此外我还对所有属性专门设置了set()方法和get()方法,但是后来又觉得此举不妥:为每个属性都设置了访问方法,这样和将这个属性设置为public有什么区别呢?所以在矛盾的驱使下,我在第三次作业进行了稍微的改动:只留部分属性与外界交换,其他的属性则保持其基本特征不变。

作业三:ALS调度电梯

程序类图:

关于此次作业的设计的话和第二次没什么区别,不再赘述。本次作业的难点应该在于指导书的理解,而好在评论区有很多同学提出的疑问以及助教的回答(在这里感谢一下各位提问题的同学和回答问题的助教筒子们先),所以看完指导书一头雾水的我在这些问题的帮助下顺利的理解的作业要求,于是高兴的认为这次作业应该是没问题了。可到了真正实现的时候却发现没那么简单,后来更换了数据结构(我一开始使用的是queue),改成了ArrayList,这才算勉强解决了这一问题。当然,此次作业也有很大的不足,就是单纯的为了实现功能和完成任务而牺牲了很多代码的可读性和可维护性——很多功能都写在了一个方法里面,不方便日后理清逻辑,此处我正在想办法改进。

程序bug分析

对于前三次作业,幸运的是我的公测都没有出错,互测在第三次作业时被扣了一个点。

作业一:多项式计算

第一次我拿到的是一份面向过程的代码,除了用的是java的语法罢了,代码只有一个类只有一个方法。这份代码公测错了一个点,原因是在匹配输入格式的时候采用了正则表达式但是没有考虑爆栈的问题。我测出了他的两个bug,一是因为该同学没有考虑第一个多项式前面符号为负的情况,而是直接默认为正;还有一个是因为他在处理“-00”这种情况的时候考虑不是很周全,只考虑了一个0。

作业二:傻瓜调度电梯

有了第一次给别人debug(找bug)的经验,这次我拿到代码的时候首先就看了他的readme。但是看了半天却没有什么收获,大概是因为这才第二次所以作业坑点不多吧,然后我就看了他的代码,感觉这是一位代码风格很好但是设计可能不是很周全的同学的作品。虽然我找了他四个错误(报的两个ERROR,两个incomplete),但他的代码格式却给我很清爽的感觉——各个类层次分明,变量名简单易懂,所以很轻松的,我就找到了他的bug(^_^)。尽管找了他的bug,但是我还是感觉那位同学应该是由于设计上的问题才导致了这些bug,他的bug依次为:

  • 没有过滤空格(对指导书内容没有完全理解)
  • 数组越界(对指导书的理解有误),
  • 同质指令的处理(对指导书的理解有误)
  • 最多处理99条指令(对助教通知理解有误,助教通知的是不包含RUN指令最多100条)

所以,我测试的这位同学如果当初花在指导书上的时间再多一点的话那这些bug应该是可以避免的。

作业三:ALS电梯

和第二次作业一样,拿到代码我首先看的是他的readme,看完readme我就知道这次应该是找不出代码的——这份代码设计很严密,很多输入输出的限制我连想都没想过(在这里先感谢一下测我代码的那位同学吧),接下来我用了自己的、舍友的、同学的测试数据“轮番轰炸”,但都没有找出bug,索性放弃了。这一次我自己的代码却犯了一个错误——第一条指令匹配的时候忘记加‘+’,所以如果第一条指令的时间前有正号的话就会报错。互测结束后我也反思了一下为什么会犯这种错误,结论还是设计上的问题,因为很多问题如果在设计的时候都没想到的话,写出的代码错误的概率是很大的。

如何测试别人的程序

写到这里,我来总结一下如何测试别人的程序。

首先肯定是看一下对方的readme,看一下对方的实现方式以及看对方在重要的一些点上有没有考虑周全并作记录;

其次呢是将对方的程序在自己用自己的测试数据跑一下看有没有错误的地方;

最后再看一遍对方的readme,看他所提到的功能是不是都实现了以及实现方式是不是有错误,构造专门的测试数据进行测试。

总结

首先感慨一下各位助教姐姐真的都好好吖,感觉我们写oo花了多长时间她们就陪了我们多长时间。

然后是设计真的很重要!!!有了好的设计,真正来完成代码的时候可能只需要一两个小时就搞定了。

最后,好的代码风格也是优质程序的关键,所以,千万不能以节约时间为理由而牺牲代码的可读性,因为你永远不会知道为节约这点时间你会

付出怎样的代价。

oo作业总结(一)的更多相关文章

  1. oo作业总结(四)

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

  2. oo作业总结(二)

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

  3. oo作业总结报告

    oo第一次博客 以前从未真正的写过Java代码,接触Java也只是寒假的时候简单的看了看语法,不懂该如何面向对象,但没事,心里不惧,想着什么都是可以学的(直到真正开始写工程的时候,才发现自己还是太天真 ...

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

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

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

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

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

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

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

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

  8. 前三次OO作业小结

    I used to be enamored of object-oriented programming. I'm now finding myself leaning toward believin ...

  9. 第十五次oo作业

    作业十五 测试与正确性论证的效果差异 程序的测试需要通过输入特定数据等方式,检查程序是否和预期相同,因为测试不可能穷举,导致了不穷举的测试不可能验证程序是完全正确的,只能验证程序在测试时没有发生错误, ...

随机推荐

  1. 原生ajax的请求封装get和post

    一个完整的AJAX请求包括五个步骤: 1.创建XMLHTTPRequest对象 2.使用open方法创建http请求,并设置请求地址 3.设置发送的数据,开始和服务器端交互 4.注册事件 5.获取响应 ...

  2. 使用@JsonFormat引起的时间比正常时间慢8小时解决方法

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")

  3. JAVA基础知识总结:二十二

    一.反射机制 1.概念 反射机制指的是程序在运行的过程中,对于任意一个类,都能够知道这个类对应的所有的属性和方法:对于任意一个对象,都能够调用其中的任意的方法和属性,在Java中,把这种动态获取信息以 ...

  4. h5 audio进度条

    h5 audio 播放进度条 效果图: html部分: <div class="audiojindu"> <div class="playcontrol ...

  5. 用R的igraph包来画蛋白质互作网络图 | PPI | protein protein interaction network | Cytoscape

    igraph语法简单,画图快速. Cytoscape专业,个性定制. 最终效果图: 当然也可以用Cytoscape来画. 参考:Network visualization with R Cytosca ...

  6. IntelliJ IDEA的这些配置,你值得拥有

    一.自动编译开关 二.忽略大小写开关 IDEA默认是匹配大小写,此开关如果未关.你输入字符一定要符合大小写.比如你敲string是不会出现代码提示或智能补充.但是,如果你开了这个开关,你无论输入Str ...

  7. 基于windows使用fabric将gitlab的文件远程同步到服务器(本地)

    # -*- coding: utf-8 -*- from fabric.api import env, run, local, put from fabric.operations import su ...

  8. 安装Jade

    1.安装node.js 直接有安装程序:http://nodejs.cn/ 2.安装git 直接的安装程序:http://jingyan.baidu.com/article/90895e0fb3495 ...

  9. adb 获取包名

    1.aapt dump badging   指定的路径 +包名      ======= adb logcat|findstr START 2.顶部和尾部有包名和activity

  10. js对象合并

    实现js对象大合并,ES6之前就只有循环遍历咯.可以用ES6的话可以用Object.assign(). 以下是Object.assign()示例: var o1 = { a: 1 }; var o2 ...