面向对象程序设计第二阶段作业总结

Posted on 2020-05-02 15:49  whuuuu  阅读(198)  评论(0)    收藏  举报

0.前言

本次总结针对面向对象程序设计第二阶段作业的三次作业,三次作业皆为PTA上的题目,这次作业难度对于我来说挺大的,可能是最近疫情影响,上课效率没有线下那么高。

1.作业过程总结

(1)三次作业知识迭代关系

这三次作业已经是进入完全面向对象了,第一次作业引入正则表达式帮助实现水文数据校验和使用类的继承来实现图形的处理;第二次作业掌握类的继承、多态性及其使用方法实现图形的处理和一元多项式求解;第三次作业掌握类的继承、多态性使用方法以及接口的应用。

(2)通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性

第一次作业中,图形继承,Circle类和Rectangle类继承Shape类,重写Shape类中的getArea()方法;

第二次作业中,第一题图形继承,Circle类、Rectangle类和Triangle类继承Shape抽象类重写getArea()方法,第二题一元多项式求导也是对类的继承利用;

第三次作业卡片排序与分组来引入类的继承、多态性使用方法以及接口的应用,Circle、Rectangle、Trapezoid和Triangle四种图形卡片类继承抽象类Shape,实现Comparable接口重写compareTo()方法极大地方便了卡片的排序,使得题目稍微简单。

(3)作业过程中遇到的问题及解决方法

①第一次作业中的水文数据校验及处理,首次使用正则表达式校验数据合法性,感觉正则表达式使用起来难度很大,不够熟练,用于校验日期的正则表达是十分复杂,要判断闰年、平年的日期是否合法,还有包括对空格的取舍;另外这道题又一个测试点就是过不去,当时试了一个下午,始终找不到问题出在哪。

②第二次作业中,图形继承与多态问题,刚开始不知道实现接口来快速给图形排序,花了挺多时间,后来实现Comparable接口题目变得简单。

③第二次作业中,一元多现实求导问题,这里也使用正则表达式校验输入字符串的合法性,然而这个正则表达式用起来也是十分的难受,这算是第二次使用正则表达式,要实现一元多项式的校验还是十分的困难,而且起初并不知道Matcher类下的find()方法,这使得题目写起来十分困难,后来知道用find()方法将多项式一项一项分开,之后再将每一项按照不同情况细分,再对系数、指数进行处理,而在对系数和指数进行处理的时候还得考虑系数正负、系数为一,指数正负、指数为一的不同情况,再然后各个类的配合将计算后的系数指数重新组合成一个一元多项式有点困难,这之中包括了一般的一元多项式还有求导后为常数的式子,如果在写这道题之前不好好构思写起来会十分困难,很多种不同情况考虑起来脑子都乱了;另外这道题用到了BigInteger类,这样不能像简单的变量那样运算方便,得用它的方法进行运算。

④第三次作业中,卡片游戏第一题只是简单地计算图形的面积,然后再根据面积对卡片进行排序,其中对Card类的构造还是有些难度,在重写CompareTo()方法的时候注意排序是按照面积升序还是降序。

⑤第三次作业中,卡片游戏第二题不光要计算面积还得根据种类对卡片进行分类,然后再排序,到这里要熟练地使用类的继承与多态,分类前输出,分类后输出,分类再排序后输出,输出最大面积,这个过程有点繁琐,而且输出格式也有点麻烦,其他的和第一题没有什么太大的区别。

⑥总的来说,这几次作业遇到的问题挺多,而且PTA测试点,不能够覆盖所有情况,会导致程序其实是有逻辑错误但还是能全部通过测试点的情况。

(4)这三次作业花时间的比例

花时间最多的是第一次作业和第二次作业,最少的是第三次作业。

第一次作业的第一题初次使用正则表达式,而用正则表达式校验输入数据合法性写之前觉得不可思议,查阅资料写后了很久,一点一点修改错误,写得这一大串字符串一眼都看不下去,不作记录都不记得自己写到哪了,写完后调试了一个下午多行正确的测试点还是过不去,实在找不出问题,可以说这道题是花了最多的时间,然而结果还没完全正确。

第二次作业和第一次一样用正则表达式校验一元多项式的合法性,起初不知道Matcher类下的find()方法,一直苦思冥想到底怎么将多项式分开成单项式,浪费了大把时间,在解决了分开多项式问题,处理数据问题之后,重新组成多项式也花了一些时间,但是还是没有写正则表达式花的时间多。

第三次作业感觉纯粹就是要让我们再更加熟悉继承与多态,本身问题没有太大难度,所以花的时间没有前两道题目多。

(5)对编程过程中的逻辑严谨性的认识及教训

编程过程中有些小的逻辑错误很难发现,需要仔细考虑,而后修改起来也很麻烦,所以要在动手之前尽量把问题搞明白。另外,在写代码的同时要多写注释,防止自己因写的太多都不知道自己在写些什么。写完第二次作业的一元多项式求导后深刻地认识到逻辑的严谨性,在写程序之前要理清思路,不能走到哪写到哪,这样根本不可能能好好地写完整一道题目,就算是写完了也会觉得很混乱。

2.面向对象设计心得

(1)对面向对象三大技术特性之间关系的理解

①封装

封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

②继承

继承,指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。子类可以继承于抽象类,通过重写抽象类中的抽象方法来实现方法的功能,使得一个类的功能实现变得不那么繁琐。

③多态

多态,是面向对象的程序设计语言最核心的特征,是指一个类实例的相同方法在不同情形有不同表现形式,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。这一特性极大地降低了代码的复杂程度,使得方法调用不会因为情况不同而去另外多写一些重复的代码。

这三大特性让程序变得更加好理解,更加好设计,代码更加简洁。封装提升了类成员属性的独立性、安全性;继承使得类之间的关系更加明了,逻辑更严密;多态不同情况下的方法调用变得简单。

(2)面向对象设计的基本原则理解

①一个类应该有且仅有一个去改变它的理由,这意味着一个类应该只有一项工作。对象或实体应该对扩展开放,对修改封闭。

②父类的调用同样试用于子类。

③高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。

④具体实现应该依赖于抽象,而不是抽象依赖于实现。

⑤不应强迫客户端实现一个它用不上的接口。

(3)面向对象编程思维的理解

在现实世界中是先有对象后有类,而在面向对象中,先有类后有对象,类是对象的抽象,是对对象的一种概括,对象是类的实例。面向对象世界中处处都是对象,对象所具有的就相当于现实世界中的每一个事物都具有的的“数据”和“能力”,面向对象编程就是对不同的对象发依次出各种命令就行了。

3.测试的理解及实践

(1)测试对于编码质量的重要性

测试可以找出程序的大部分逻辑错误,但是就如水文数据校验那道题,我在不知道测试点到底是什么情况的时候始终是找不到问题出在哪里。

(2)假设使用Junit进行程序的测试是否可行

JUnit是一个Java语言的单元测试框架,进行这几次程序的测试是肯定可行的。

4.课程收获

经过这几次作业,我对面向对象编程的理解更加深入了,同时让我对程序的逻辑严谨性更加重视。题目变得更加有挑战性,通过全部测试点后可以说是非常开心,那份喜悦能持续到第二天,整个人信心倍增,非常有成就感。

5.对课程的建议

希望增加对难点的讲解,对作业的难点稍微讲解一下。在作业结束后能够有测试点的具体数据就更好,至少能知道自己错在哪。