OO第二阶段(5-8周)PTA作业总结
oo第二阶段(5-8周)pta作业总结
0.前言
本次博客针对的是pta第二阶段的作业,这次作业相比于第一阶段来讲难度、思维高度都提高了很多,耗费的精力和时间也很多但是收获很大;这次作业很大一部分难点及侧重点是在正则表达式上,这一部分确实难学,你要对程序的需求分析精准,不断修改正则才能达到预期结果;面向对象的封装、继承、多态三大特性在这一次作业中也有明显的体现与应用,这本次作业总结中也会重点理解这些特性。
作业题目概览:
1.作业过程总结
①三次作业之间的知识迭代关系
首先,三次作业的难度是依次递减的;第一次作业重点在于理解面向对象中的“单一职责原则”和掌握正则表达式的运用,其中的“图形继承”题简单地介绍和运用了继承特性来编写代码;第二次作业是在第一次作业的基础上更加深刻地理解面向对象中的“单一职责原则”,对每个类的功能职责更为清晰,在继承的基础上再次运用多态特性,求导题中也再次要求使用了正则表达式来解题,这次作业的重点是检测是否对正则表达式熟练掌握、熟练使用继承特性来编写代码,初步运用多态特性;第三次作业是在前面作业的基础上深刻理解继承、抽象类、多态等知识,并且引入了接口的概念并进行简单应用,“开、闭”原则(即对扩展开放,对修改封闭)也有体现;总之,这三次作业的知识点是逐步深化,通过作业来巩固自己对知识的理解。
②如何通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性;
对于封装性,在本阶段的作业中几乎每一题中都有体现,在抽取特点形成一个个不同职责的类时,每一个类的内部都是封装的,隐藏一些属性及方法,使你的编码条理更加清晰。
对于继承性,第一次作业的7-3图形继承是对于继承学习的入门:
可以看出,shape类是在这一题中的最基本的类,circle类、rectangle类都继承自shape类,对于任意一个图形来说,我们并不知道它的具体形状、具体参数情况等,但是封闭图形都会有一个面积值,因此我们将其抽取出来,形成具有计算面积大小方法的shape父类;circle类、rectangle类作为子类有其特有的属性,重写计算面积的方法可以计算各自的面积;ball类、box类分别继承自ciecle类和rectangle类,重写计算面积方法可求其表面积,除此之外还可加上属于本身所独有的计算体积的方法;形成继承关系就是形成了is-a关系,比如本题中的ball类,ball是circle是shape,即球是圆是图形关系。
对于多态性,我们可以通过第二次作业的7-1来简单了解:
本题是通过抽象类定义实体类构建的方式来实现多态的,circle类、rectangle类、triangle类都继承自shape抽象类;如果我们要求一个圆对象的面积,我们只能new一个ciecle类的实体对象吗?多态的运用为我们提供了另外一个方式(shape circle = new shape),通过调用ciecle.getarea便可求的该圆的面积;这也就是通过多态引用调用的具体方法(实际要执行的代码)在每次调用时可以不同,让程序来选择运行的状态的一个实际例子。
③作业过程中遇到的问题及解决方法
第一次作业:7-1水文数据校验及处理
遇到的问题:在电脑的eclise上测试题目所给的示例,输出结果与所给的结果相同,但是pta评测系统全部报格式错误,查找了单词拼写、空格个数等常见错误也无果。
解决办法:经过几次寻找后才在主函数输入部分发现了问题,我在每一次输入一行数据后都加上了"\r\n",这就导致了报格式错误,那为什么我在自己电脑上测试的时候能够得到正确结果呢,原来是系统不一样导致的,mac系统与windows系统在\r与\n上有一点的区别,我将"\r\n"改为"\n"即可通过测试。
第二次作业:7-2一元多项式求导
遇到的问题:程序运行后一直得不到正确的结果,观察结果后发现我的程序所给的答案是正确答案的多次求导后的结果,这让我比较懵逼,不知道错在了哪里。
解决办法:我刚开始认为我的大致思路没有问题,后面才发现求导的主要代码及思路那里出了比较大的问题,没有理解清楚我刚开始设计的求导思路,导致我的求导方法在一个循环中多次调用,这样当然会导致对多项式进行多次求导,我只能捋清思路,将那部分代码重写,最后通过了测试点。
④每次作业花费的时间比例
这一阶段的第一次作业花费的时间是最久的,构思加修改大概花了5天,在作业截止时间最后一天才将全部的点通过,主要是7-1水文数据校验及处理所用的时间最多,这一题对数据格式的检验要求较高,运用的知识点也很多,也需要去自学很多东西,难度是最大的。
第二次作业花费的时间较第一次更少一些,大概花了3天,7-2的多项式求导在起初设计的思路有些问题,没有及时跳出原本的思路,导致此题花费时间较长。
第三次作业是这一阶段最容易的一次了,大概花了一个上午的时间,如果加上附加题后续不断改进算法的时间的话,最多是一天的时间。
综合这三次作业花费时间的比例为:5:3:1
⑤对编程过程的严谨性的认识及教训
通过这一阶段作业的“洗礼”,让我对编程严谨性又有了更深的领悟。比如在上方写到的多项式多次求导的问题,就是我在设计思路编写代码时不严谨造成的,这一不严谨花费了我太多的时间代价,得不偿失啊;还有一个题目我在if语句后不小心多打了一个;符号(加上了分号表示无论if语句是否为真都将执行后续的语句),结果导致我的程序一直得不到正确的结果,我苦苦找寻,一直在找思路问题,过了许久才发现那个;的存在。。。这又花费了我不少时间;所以,编程的严谨性真的太重要了,以后在开始编写代码前一定要将自己的设计思路搞清楚啊,你刚开始的不严谨在后期将以大量的时间付出作为报应......
2.oo设计心得
①对面向对象三大技术特性之间关系的理解
三大技术特性:封装、继承、多态
封装:对于封装来说,其是这三大特性之间更易理解的一个,我们在编写代码的时候运用的情况也是最多的 ;封装的主要思想就是隐藏类成员属性、保护数据安全,通过提供固定的类成员方法来获取或者修改属性值从而达到其他方法不能轻易获取值,保护数据安全的目的;在这其中我们当然可以将一些只在只在类内部使用的“敏感方法”设置为private,使其不能被除本类外的其他类成员方法调用。可以说,封装思想已经成为了java代码的编写的规范。
既然讲到了修饰符、访问权限,下面是一个小总结:
继承:继承就是从一个已有的类派生出一个新类的过程,通过继承,新类自动包含原类中的变量和方法,之后便可在新类中添加新的变量和方法或者是修改继承下来的变量和方法;一旦形成了继承关系,在父类和子类中就建立了is-a关系,即子类是父类的一种特殊的形式;继承的实现为软件及代码的复用提供了一种方法,并且我们可以通过继承来实现多态。
多态:多态可以通过继承和接口来实现(现在课堂中只介绍了通过继承实现),多态便是“有多种状态”,多态引用是一个在不同时刻可以指向不同类型对象的引用变量,通过多态引用调用的具体方法(实际要执行的代码)在每次调用时可以不同,让程序来选择运行的状态,这便是多态。
②面向对象设计的基本原则理解(单一职责原则及“开-闭”原则)
单一职责原则:具体来说就是一个类只负责一个功能,不能将多个功能糅合在一个类中,这么做可以使得每个类的功能单一起来,对后期类的复用、修改都有很大帮助,并且能够使得每个类之间的关系更为清晰,类之间如何“发消息”也更加明了。
“开-闭”原则:一个类应当对扩展开放,对修改关闭。即一个类应尽量在不修改原有代码的情况下进行扩展。这在现实的软件开发过程中也是一个很重要的问题,随着软件产品的更新迭代,将会有更多新需求需要实现,这时候就需要对功能进行扩展,“开-闭”原则就派上用场了;为了实现“开-闭”原则,抽象化是关键,通过抽象类的具体化来实现扩展,而对抽象类不需修改。
③oo编程思维的理解
再次经过这一阶段的作业,对oo编程思维有了更深一些的了解,面向对象编程关键在于“对象”,我们需要彻底地从以前面向过程编程思维中解放出来,在编写代码时需要慎重考虑类的设计,要思考这个类设计的合理性、复用性、职责性,思考各个类之间的关系应该是什么,如何设计才能符合面向对象编程的思维,千万不能直接蒙头开始写代码,这样极其容易再次陷入到面向过程编程之中。
④类设计心得
类设计心得除了上方提到的外,其实在设计类的时候需要考虑很多,比如某个类的设计是必会影响到后续类的相关设计,由于还没有自己独立设计类,对设计类也暂时没什么太多的体会。
3.测试的理解与实践
①测试对于编码质量的重要性
测试对于编码质量的重要性不言而喻,毕竟软件岗位已有测试职员,其实很多时候我们花在测试上的时间或许会比编写代码所花时间更长,那么,作为一名程序员,能够熟练地运用工具完成测试是很重要的技能,比如通过debug等快速进行判断测试。
②查阅资料,假设使用junit进行程序的测试是否可行
通过查阅资料,junit进行程序的测试是可行的,在课堂上老师也演示过一遍如何用junit进行模块测试,但是我在后续的测试中多采用的是debug所以对junit测试还是不太熟悉,希望在以后能够试着去使用junit
4.课程收获
通过这段时间的学习,确实感受到了面向对象编程的强大、思维难度之大,在这一阶段的作业中,最主要的是对正则表达式有了一定基础的了解,为以后编写程序时数据的校验打下了一定的基础;也慢慢接触并运用到了面向对象的三大特性,几大原则,这些都是以后自己独立编写程序,解决问题的基础。总之,确实收获满满。
5.对课程的建议
①第三阶段作业难度、题量的建议
第三阶段作业的难度肯定比第二阶段的更难,难度上去了收获也会更大,只是题目难度不要太过于变态就行,题量的话保持第二阶段的样子就行。
②课程内容讲解方面的建议
希望老师能在pat作业上多进行一些讲解,特别是那些难题,讲解一些同学们普遍遇到的问题;在讲完一些知识后,可以推荐同学们去看一些质量高的博客以便加深对知识的理解。
上一篇: JavaSE的反射机制