OO1~3次作业总结

第一次作业

1、类设计

       学期刚刚开始,我对于java,对于面向对象编程都是零基础。所以基本上面对第一次作业时首先需要解决的问题是学习java的语法以及eclipse的使用方法。对于程序的设计,还是停留在C语言式的面向过程的设计思路。在第一次作业中,我仅仅声明了一个poly类,其中包括一个记录系数的数组,一个计算多项式间加减的方法以及一个输出结果的方法。仔细想来,基本上就是将C语言中的函数用类和方法重写了一遍。在main方法中夹杂了输入处理等等其他功能,总体来说还是一个面向过程风格的程序。

2、收获与不足

       首先,为了完成第一次作业,在两天之内学会了写一个功能完整的java程序,了解了eclipse和git等实用的开发工具。其中最令我回味无穷的一段记忆就是,为了学习java程序如何从控制台读入3万个字符的字符串,尝试了各种各样的方法,而且不同于C语言的读入,java的输入方法在语法上有些“难以记忆”。以至于最开始的几天我写的程序中的输入部分都是一个字一个字地复制网络上的例程。现在想来还是当时没有理解对象与方法的内在联系,熟练之后,自然不成问题。

更为重要的是,我学会了使用正则表达式判断输入是否合法,了解了许多java中现有的方法,大大的简化了编程的难度。比如字符串分割,字符串判断,字符串与数字等其它类型的转化等等。

第一次作业的不足也是显而易见的。程序从本质上来说还是一个面向过程的程序,对于类的功能划分不清,还是从C语言函数的思路来设计各个方法。

       第一次作业由于对于指导书的理解有些偏差,忽视了数字“-0”的合法性问题,导致了一个BUG,需要修改判断输入的正则表达式。此外,在互测过程中,我有幸拿到了一位大佬的代码,他的设计中嵌套了许多if分支判断,导致程序可读性不是很好。但最为重要的是,这位同学的程序中使用了try-catch来处理程序运行过程中可能出现的各种异常,保证程序中不会出现crash,我通过这位同学的代码学习了try与catch的用法,让我的java编程水平更进一步。

第二次作业

1、类设计

 

 

2、收获与不足

       第二次作业中,我没能理解推荐设计中floor类的作用,因此只设计实现了四个类。程序的主要思路是request_sequence管理requests,将请求整理存储;经过处理的指令序列传递给controler,controler执行调度,判断同质,指导elevators执行指令。与第一次作业相比,终于有了一些面向对象的特点,将各个类的属性、职能分类,分别实现,共同实现程序的功能。

       在编写第二次作业的过程中,我对于java中对象,方法的互相调用已经掌握的十分熟练了,但是实现controler时,其中判断同质请求的部分与requests中的一个方法比较类似,应当可以通过一些小改动实现代码的复用。

       又是由于对指导书中数字前符号的问题理解不到位,导致出现了一个bug,不过问题并不涉及程序核心思路,仅需要修改判断合法输入的正则表达式就可以解决。不过这提醒了我应该细致阅读指导书,任何小的疑惑都要追问清楚。测试部分,我先是根据分类树构造了测试集,用于测试自己的程序,随后再用来测试同学的程序。我发现数字前符号的问题并不是我一个人的疏忽,甚至同学直接有一些争议。这或多或少也反映出指导书存在的一些问题,需要我们在完成过程中不断询问,不断修正。

第三次作业

1、类图

 

 

2、收获与不足

       第三次作业的主要思路与第二次作业相似,添加了一部分捎带处理。主要思路是扫描请求序列,如果在一次上升或者下降过程中可以捎带,那么就将可以捎带的部分挑出来,交给类似第二次作业中的调度器来执行,重复这个过程,直到所有请求都被处理。

       这种方法没有完全模拟指导书中的“主请求”概念,而是判断能否捎带。之所以想到这种方法,是因为我认为应当使用继承,调用第二次作业中的控制器,实现第三次作业要求的功能。这个方法看似不错,但是在实现过程中,会出现同质请求由于输入顺序,请求时间等问题分配到不同的捎带序列中,导致同质请求判断出错。为此我花费了大量时间修改这个bug。除此之外,捎带序列中的请求执行的开始时间与第二次作业中不同,对于父类控制器,电梯;类也需要进行一定的修改。左修右补,编写过程中没有条理,造成了思路的混乱以及debug的困难。

拿到第三次作业时,我认为第三次作业相比于第二次作业应当是简单的修改就可以完成的,低估了工作量,到周一才开始着手完成第三次作业。在仔细研读指导书之后,寻找思路,确定实现方法耗费了大量的时间,以至于在周二晚上不得不熬夜编程。而且程序最初完成之后,对于同质请求以及捎带序列的判断有许多BUG,甚至修改一个BUG之后会出现多个新的BUG,在熬夜的情况下屡屡遇到这种情况,心态几近崩溃。最后提交之后,发现在请求开关门完毕时刻产生的请求不捎带的情况没有考虑到,导致公测出现一个BUG。此外,互测过程中还发现了我千修万改的同质请求判断过程同样存在BUG。

造成这样情况的原因有许多。首先,各个类的职能分配不清,在第二次基础上进行改动时没有明确的目标,导致原本比较清晰的逻辑关系变得混乱。这是由于阅读完指导书之后急于动手,没有明确细节问题就开始修改,导致问题越来越多。还有就是心存侥幸心理,认为此次作业工作量不大,拖延几天也可以按期完成。导致失去了宝贵的休息时间,熬夜过程中思维混乱,连if判断条件错误这样很简单的问题都发现不了,浪费了编程时间。

总结

       经过前三次OO作业的洗礼,我对于面向对象编程已经有了初步的认识,能够写出比较完整的java程序。在此过程中,总结以下几条教训,时刻铭记。

       1)切勿拖延。作业要求发布之后,第一时间仔细阅读指导书,尽早开始思考程序如何实现,越早越好,为可能出现的各种问题预留时间;

       2)三思而后行。仔细思考各个类的职能,思路必须清晰。千万不能急于动笔,思路上的模糊会导致灾难性的后果,所谓磨刀不误砍柴工,大概就是这个道理;

       3)正确对待互测。本次OO课程采用的评分制度——发现bug加分,被发现bug扣分,在开始时曾导致我的心态错误,吹毛求疵也要努力发现别人的bug。这种心态是错误的,我认为互测的用意不在分数,而是在与互相交流与学习,我们应当保持正确的态度对待他人的程序和自己的BUG,在交流中共同进步;

       4)学会构造测试集。课程组向我们提供了每次作业的分类树,对我们的测试提供了重要的参考。如何构造尽可能完备的测试集,还要在今后的学习中继续摸索。

       OO课程已过四分之一,总结经验,继续前行,我相信我会和同学们一同进步。

posted @ 2018-04-04 00:22  sincesummer  阅读(91)  评论(0编辑  收藏  举报