前言
本文章针对Java课程第二阶段PTA作业进行总结
一.作业过程总结
1.总结三次作业之间的知识迭代关系:第四次的作业主要是训练继承关系的练习,后两题不难,主要是水文数据校验比较有难度,正则匹配的表达式,如何处理校验数据;本阶段第二次作业,相比于第一次作业训练的基础上增加了多态性的训练,就是将每个类型相同的属性归结到一起,写成一个父类,所有此类型的具体类写为该父类的子类,比如第二次作业的参考类图:
将Circle类,Rectangle类,Triangle类归结为Shape类,Shape类为抽象父类,有求面积,判断正误,输出等抽象方法,这些方法均在子类方法中实现,即每个实例中实现。本阶段第三次作业的图形卡片游戏题目也是体现出了继承和多态,可以说这三次作业从多个题型多种实际情况体现出继承和多态。其次是第四次和第五次的作业都有正则表达式的练习。
2.如何通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性:从这三次作业的题目来看,主要是通过简单的图形类来加深对继承多态的理解,就比如Shape类是个抽象父类,其圆类,矩行类,三角形类,梯形类都是其子类,这些子类必须实现父类当中定义的抽象方法,即对父类方法的重写或者重载,即多态性;封装型,比如将每个图形类分开,圆类矩形类三角形类,每个类中的方法对外提供,但是其属性是私有的,每个图形类都继承了父类中的方法或者属性,即继承性。
3.作业过程中遇到的问题及解决方法:在本阶段的第一次作业当中,后两题没有啥问题,就是倒数第二题的bug改了我有点时间,就是计算圆心坐标的式子,有个减号我写成了加号,这个bug调了半天才被我发现,严重影响了编程信心做题心态,然后就是第一题水文数据校验的重头戏,题目刚出来第一天没多久我做完了后两题,后面开始做一题感觉无从下手,不知道该如何分成一行一行的数据并且如何去校验每一部分数据,后面询问了两个同学的思路,即先将每一行的数据放到CheckData中的方法分割,分割成五部分,再根据每一部分数据来处理校验,中间许多的知识点还是很不熟悉,或者是根本没有讲到过,需要我们自己百度自学的,就比如LocalDatetime这个用法花了我几个小时了解,还有第一次做正则表达式的题目,便是花了我一下午的时间来写好这个正则表达式,但是总体上思路还是比较清晰,大概用了两天时间写好了CheckData类,最后的主函数的输入字符串的处理以及各种逻辑判断又困扰了我一天,后面一小步一小步实现功能到原定截至时间的当天下午被我做出来了。这次作业的重头戏除了水文数据校验,还有就是一元多项式求导,这个没有之前的水文数据校验看上去那样难,但是我考虑的情况实在太多了,没有一个整体性,导致自己思路不清晰,其实将题目所给出的要求把各种情况分类讨论就挺好的,还有就是拆分数据校验的这一部分我花了大量时间测试,自己写了个简单的测试主函数用于测试自己的正则或者方法逻辑判断是否有问题,本次作业就是关于这两题,都是花了差不多百分之九十以上的时间在上面,花时间去了解正则拆分校验判断等操作,其次的问题就是Attaylist的,关于这个根据面积大小来对图形进行排序,起初没有了解意思,以位单纯的排序面积,但是后面仔细思考了一番,就理解了,ArrayList就好比是个公交车,一开始车上的人随便入座,后面就是按身高排序,矮的人坐前面,高的人左后面,每个图形就好比每个人,人的身高就好比每个图形的面积,这在最后一次的作业得到了体现。
4.每次作业花费的时间比例:第一次作业花费时间六天,也就是给定的整段时间,作业刚出来,花了半天解决了后两题,后面除了上课时间就是一有时间就写水文数据校验的题目,主要就是这题。第二次作业花费了五天时间,差不多也是都花在了一元多项式求导正则表达式那题上面,最后一次作业花费了三个小时,很短,因为相对于前面的两题正则,这次作业显得十分简单。
5.对编程过程的严谨性的认识及教训:这几次作业还是有个小题目让我改了半天的bug,就是蒙特卡罗方法求圆周率这一题,根据左上角的坐标求出其他坐标,中间求坐标的有个加减号我给搞反了,错误十分隐蔽,调试了半天才发现,其它的话就是正则表达式的一些匹配,特殊情况以及输出格式之类问题了,修改时间不多,不是什么大问题。小bug大部分是很难发现的,就比如我的正负号,实在难以发现,一开始会下意识的先检查自己的思路算法有没问题,再然后去慢慢地找小bug,在每个想测试的小范围可以选择输出想要查看的内容,这种改bug的方法还是比较好的。
二.OO设计心得
1.对面向对象三大技术特性之间关系的理解:对于面向对象三大技术,即继承封装多态性,通过这几次作业,我自己的理解是:首先是封装,封装将每个实例封装在一个类中,对外提供方法,属性为私有的;其次继承性,即子类可以继承父类的方法,可以对父类的方法进行重写或者重载,多态性即多种类拥有共同的特征,这种特征可以写成一个父类或者抽象父类,子类拥有父类的属性方法。
2.面向对象设计的基本原则理解(单一职责原则及“开-闭”原则):设计的基本原则的理解,这几次作业,尤其是正则表达式的那两题给我的启发比较大,就是每个类应当严格执行只属于自己的方法,应该拥有什么方法,方法应该有怎么样的功能,各种类之间的关系是怎么样的都应该严格划分,即单一职责;而每个类中的方法对外开放使用或者扩展,但是属性私有,并且对外禁止修改,就是开闭原则。
3.OO编程思维的理解:这次几次作业总体来说就是将复杂问题简单化,通俗讲就是大事化小,就像水文数据校验,需要校验时间,水位,流量的格式校验,合法性,以及比较大小,输出结果等等,看似功能繁多复杂,其实根据OO编程思维以及原则,就可以将一个大功能功能分解成许多个小功能,即可以为每个类,每个类的职责分明,每个类的方法功能明确,这样下来编程思路也就更清晰了。
4.类设计心得:对于每个题目类图的设计,每个人应该多多少少都有相同点或者不同点,就算根据题目所给的类图去设计,再根据自己对于类中的方法分工理解设计,也会和题目有较大的差别,类的设计总体就是将每个实例分开,可以归类,分清每个类应该包含哪些属性方法,哪些方法对外开放,并且理清类与类之间的关系,遵循开闭原则。
三.测试的理解与实践
1.测试对于编码质量的重要性:测试对于编码那是必不可少的一部分,通过普通情况,还需要考虑特殊情况,大多数人第一次写完直接全对的还是非常少的,根据题目所给的测试点再去修改调试,改小bug也离不开对某一部分代码测试,总之测试是编程必不可少的一个环节。
2.查阅资料,假设使用Junit进行程序的测试是否可行:使用Junit测试可行,但是只要不是特别棘手的问题一般还是直接在想要测试的参数将其输出查看判断还是更为方便的。
四.课程收获
1.总结这四周来在OO方面的教训及收获:对于类的设计开闭原则,封装性(接口),继承性以及多态性都有了更深层次的了解;这几次作业有两题棘手究其根本还是当时对于其类的设计原则比较模糊,类图设计模糊,思路就不清晰,框架就难以构成。
五.对课程的建议
1.第三阶段作业难度、题量的建议:根据前几次的题目,就拿这次水文数据校验和一元多项式求导来说,我是课后一有时间就在做这两题,到截止时间前才做出来,几乎是占了所有课后时间,导致其他科目学习作业时间不够,并且作业量大,还望之后作业难度能够适中,题量也是中,高质量完成高质量作业。
2.课程内容讲解方面的建议:就还是上课时候老师可以亲自敲一下代码演示一下,再做变化让我们实践,可以加深同学们的印象。