面向对象的编程第一阶段心得(Java)

  0.写在前面

 本次博客针对的是Java课程中第一阶段的学习心得与体会。侧重于四周来作业部分的心得体会。

 

第一次作业

 

 

 

 

 第二次作业

 

 

 

  第三次作业

 

 

  这三次作业都是基础题,不存在特别复杂的算法和数据结构,也没有苛刻的运行时间要求与空间要求。仅仅是检验个人编程能力的基础与新学习知识的巩固程度,经过这一系列作业的洗礼,我觉得我从面向过程到面向对象又进了一步。这几次作业都做到了在oj上的100分,我觉得这是一个好事,第一可以说明我之前面向过程学习(C语言)还是比较扎实,第二说明从语法上能把大部分C语言程序改写成Java语言程序(当然这不是完全好的,Java学习不仅仅是语法),第三逻辑能力确实能表明还是比较清晰的。

  下面我将对这一阶段学习做完整明细的讲述。

1.过程总结

     老师说这三次作业是存在迭代关系的,我个人是这样认为,第一次作业与之前c语言产生迭代,让我从语法上过渡过来,第二次作业与第一次作业从难度和工程量上迭代,可以明显感觉出第二次作业逻辑上与代码量上都比第一次作业难了许多,第三次作业与第二次作业的迭代是在面向对象上与算法难度上得到体现,这两次作业题目相似,甚至一些代码能直接搬过去用,但第三次作业要求自己去设计类,第二次作业没有,并且测试数据上来看第二次作业数据很小不超过1e3,而第三次作业测试数据最大高达整形最大值,这对算法质量要求大了许多。总之这三次作业是缺一不可的,假如其中一次没写或取巧完成,下一次作业必然要花上平常人几倍的时间去完成,甚至是无法完成,这是难度的迭代,也是结构的迭代。

     逐步从面向过程过渡到面向对象我认为是第二次作业与第三次作业表现最甚,第三次作业有了面向对象里鲜明的东西,类、耦合、聚合,也正因引入了这些东西,才足以体现逐步面向对象。但问题来了为什么是逐步面向对象呢,我拿我本人的话来说,就是我的代码中还有许多面向过程的东西,例如++ -- 以及各种各样的if else 这些可复用的东西。所以我个人认为我离入门面向对象编程还非常远。

  说完了作业之间的,我们来谈谈每一次作业中各题的迭代,第一次作业里面说真的我没感觉到什么迭代,第一题反而我觉得最难,因为很麻烦,我用了记事本这个工具中的替换才让他没那么麻烦。

  第二次作业中就比较明显了,先看看题目。

  

 

   第一题是解方程,很简单的一道题,我觉得是用来练手和进入状态的。这里我知道了错误输入这个概念,这是第一次作业没有的,然后第二题到第四题都是关于日期的,第二题让我稍微熟悉了日期的操作,我也在第二题栽了很多跟头,但是这也使得我第三四题都是一遍过的。这就是很明显的一个迭代过程,有了前面的才有后面的。

 

 

  接下来是第三次作业。

 

   和第二次作业非常像,我认为这次作业的迭代在于结构,第一第二题的结构都没有第三第四复杂,但第二题的算法和第三第四类似,没有第二题的算法,第三第四结构再鲜明也很难完成。并且也有第二次作业的特点,三四题是一遍过的。

  

 

 

 

     作业难度的提升必然会遇到许多问题,例如初学者常见的编译器花式报错,这确实让我非常苦恼,我用的是Eclipse这个Java编译器,除去语法上的错误,有事其他的小毛病让我全身发抖,不知所措。例如有时,我在开头输入import java.util.Scanner;他就报错了,我核对了每一个字母,都没有问题,但就是死活不能运行,我最后直接在cmd里手动敲Java的一系列命令才让他运行起来。但我有无法进行程序的调试了,这也让我那一题写了很久很久,比平时效率最少低了三倍。后来我网上学习了Eclipse的教程,缓解了这些问题。作业的算法设计方面以为我以前学过Java也学过一点c++再加上又打了一个学期的ACM,在算法方面遇到的问题实际上很小,而且debug能力也是有一些,也就没什么其他的大问题了。

  这三次作业的难度是递增的,打个比方,第一次作业是要我们学会走路,第二次就是要走路过程不摔跤,第三次就是要学会跑了。花费的时间也是递增的。

  第一次作业开始以及结束时间

 

  第二次作业开始以及结束时间

 

 

   第三次作业开始以及结束时间

 

 

 

 

 

   可以看出第一次作业只用了四个小时,其中还包括吃饭休息的时间,而第二次作业则从早上的10点到晚上9点,差不多用了12个小时,第三次作业则足足写了接近3天。作业难度是提升的,时间也是呈几何倍数增加。其中我必须承认一点,第二次作业的时候我懒了,我以为别人会写得很慢,所以我十点写完第一题就去玩了,当我下午6点打开pta时,看到的是居然有10个同学写完了。我当时非常生气,吃饭也不舒服了,嚷嚷着要跳起来打他们的那个,然后我经过几个小时奋战终于写完,我也是从第二次作业中知道了你不努力别人就会比你更努力这一道理,这也算是一大收获。

  逻辑严谨性是编程的特点,我记得写第二次作业时,没有在纸上把逻辑顺序画出来,全凭脑子中的念想编程,结果就出现了各种因为逻辑问题出现的bug,而且花上了巨量的时间去解决,后来我在纸上画出来了详细严谨的算法图,然后很快就敲完代码写完了这题,算起来我在纸上画的时间加上编码时间也比先前光想快不少。总之程序非常讲究逻辑性,严谨性和易理解性我都体会到了。

 

  2.面向对象编程的心得

  从C语言到Java,也就是从面向过程到面向对象,给我最大的感觉是程序的结构变得越来越超出我的想象,我虽然以前学过一点Java但可以说没有面向对象的东西,也就是只会点语法。最后一次作业程序的结构大概是老师设计好的,我按着敲完代码后,回过头一看,我挺震惊的,要我来设计我想破脑袋也想不出来,因为我的思想还很大部分停留在面向过程上。第二是代码的复用性,在C语言中,虽然有了函数这种减少代码重复性的东西,但和面向对象来比仍然是九牛一毛。举个例子,我用面向对象的写法去写一个方法只用30行不到,而C语言的写法却接近100行。第三是debug方面,由于单一职责原则以及解耦,一个方法出现问题很少影响到其他方法的执行,这让我debug变得轻松多了,并且当我改写这一方法时,我不用再去改写其他的方法,这着实是很方便。但在运行效率上,面向对象的写法效率明显比面向过程写法低,同一个测试点面向对象要用上300ms而面向过程只需要100ms,我怀疑是进栈出栈过程使得程序运行效率变得低了。

  综合上面的我谈谈我个人对oo思维的理解,我拿猪八戒吃西瓜为例子,以面向过程来猪八戒是一个函数,吃西瓜也是一个函数,猪八戒吃西瓜就是一个函数调用另一个函数,而在面向对象中,猪八戒可以成为一个类,他有各种自身的属性,如体重身高食量,而吃西瓜是他当中的一个方法,猪八戒吃西瓜则相当于调用这个类里面的吃西瓜这个方法,如果要修改吃西瓜这个方法,在oo中可能就只需要修改这个方法中的一些内容,而在面向过程中可能就不止要改这么多了,并且万一出现问题,例如出现西瓜没吃完,就只需要检查吃西瓜这个方法,在面向过程中就可能还要检查猪八戒这个函数的问题。

  我认为这就是面向对象的一大优点,这也是我的体会。

 3.程序测试的理解与实践

  我在面向过程的学习中由于参加了ACM的集训,对测试还是比较了解的,我写程序有的时候第一遍不能正常运行,我就会去调试,并且调试也不是瞎调试,我通常是哪个部分出现问题我就在那个部分加断点,如果还没出现问题,就把断点置前。直到发现错误。程序的测试自然是少不了样例,有点时候我比较懒但又检验程序的时候(例如日期,Java中有日期方法,百度上有日期计算器,都可以用用来检验),我就使用随机数,让他自动运行100次,一旦出现问题就立即暂停,然后把样例输出,我在一一查找问题。但不是总有检验程序的,那个时候就只能用画逻辑图谱,想出各种非常刁钻的测试数据进行测试(像ACM竞赛中,各种极限数据),但这也都不是能完全测试到的,因为测试的数据终究是有限个,当测试数据比较全面时,就可以认定这个程序大概就是对的了。

  测试过程同样得到了许多教训,例如第三次作业7-2的测试点5

 

 他要求的是整形最大值,我起初以为是算法问题,但我使用了10000组随机数进行测试,都没有一次报错,我就有点纳闷了,然后就一直盯着求下n天的方法看。后来我念想要不然试试扩大数据类型,把int改为long,因为输入的是整形最大,我的算法是先把d加上这个整形最大的数,这就很有可能爆数据。然后一试还真的过了。

 

 

 

 后来想到了优化方法,就是在加上之前,把n拆出个50出来,就完美解决了越界问题,这是让我翻了数个跟头的一个点,我认为他最有代表性,让我认识到数据是有界的。int的最大值大概是20亿左右。

 

  4.收获总结

  综合前面的学习,第一我收获和刚刚了Java语法,以后的网络课程的学习语法上也很多是Java的,打好这一基础对未来的学习必定是有很大的作用,第二我稍微明白面向对象的思维了,面向对象对程序结构的设计的帮助必定非同小可。教训也很多,就是要讨论,不能自己一个人蒙着头写,有不会的就要问 。

  

 5 .对课程的建议

     因为疫情不能返校的影响,老师说我们的课程相比上一届是降低了难度的,我也就有点担心会不会效果不如他们,但这也能理解,他们是正在系统的学习数据结构的,虽然我也在自学,但写出来的代码质量肯定是比我们要高的,难度也就自然高了。但从身边同学来看他们是都有点觉得太难了(当然可能是我身边的人编程能力不行),就是难度与效果的平衡点能不能再找一下。我个人是无所谓,在难点也行,但我室友就有跟不上的,我有点怕我的室友同学读着读着就走了,我很看重友谊,我不想失去他们。

  心得体会到这里也就结束了,我希望自己能学好Java这一门专业课,因为这是以后吃饭的东西。

PS:新人第一次写博客,很多规范可能都不知道,如果这次哪里不符合要求,请积极提出,我愿意修改,并争取下次写出一篇优质博客。

posted @ 2020-04-02 18:24  logan996  阅读(282)  评论(0)    收藏  举报