OO第二阶段作业总结
一、前言
针对我们第二阶段的作业(共三次:pta中的作业)发表总结性博客。
二、作业过程总结
1.第一次作业(水文数据校验处理、蒙特卡罗方法求圆周率、圆形继承)
本次作业最主要就是对正则表达式以及继承关系的练习,其中第一题中的水文数据校验是在本阶段作业中最为复杂的题目,在写作业的过程中对于输入数据的分割以及数据合法校验遇到了很多问题,测试点中有一个数据中存在空格应该在对数据分割前进行去空格的操作,以及对不同类型数据校验的不同正则表达式的写法(比如对时间String s1 = "(([1-9][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]{1}|[1-9])\\/((([13578]|1[02])\\/([1-9]|[12][0-9]|3[01]))|(([469]|11)\\/([1-9]|[12][0-9]|30))|(2\\/([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))\\/2\\/29)";String s2 = "([02468]|1[02468]|2[02]):00$"; )整个表达式比较长,很容漏掉或者打错,而且检查起来也比较困难。总体来说这道题目主要的问题基本集中在CheckData类中,根据测试点的报错多次对CheckData进行修改。

(水文数据校验处理)
第二题求圆周率以及第三题圆形继承只要理解每个方法的功能以及继承关系基本没有什么难点。本次作业花了两天时间完成,而其中80%的时间都用于攻坚第1题的问题。
2.第二次作业(圆形继承与多态、一元多项式求导)
本次作业主要是熟悉抽象类的使用及其继承,所有定义的抽象方法都必须在子类当中进行重写,在圆形继承与多态中学会了ArrayList(一个可以存储对象的列表)的使用,大大方便了诸多对象的存储调用问题。本次作业做主要的在于对继承多态的理解,都是Shape类型的对象但是Circle、Rectangle、Triangle的类型不同我们可以使用一段代码处理不同类型的对象,只要他们继承/实现了相同的类型,极大的提高了代码的重用。
(圆形继承与多态)
第二题也是抽象类的运用,第二题在整个编写过程中没有什么大的问题,主要的问题出现在不同的测试点数据上,根据测试点的提示对程序的进一步完善。本次作业用时一天,并不算难。
3.第三次作业(图型卡片排序游戏、图型卡片分组游戏)
本次作业的两道题目基本相似,再进一步对ArrayList的使用以及新添的Comparable接口的使用,方便了数据的排序。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。对compareTo方法重写,让数据按自己的需求进行排序。类图对于功能的描述较为详细,整个过程中没有什么问题半天就完成了。主要问题就是对Comparable接口的理解以及学会其使用方法。
4.总结
本阶段作业让我对面向对象的封装性、继承性与多态性三大特性有了初步的了解。
(1)封装性:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
好处:提高了代码的可用性和可维护性,通过封装对对象内部状态的保护。
(2)继承性:把多种有着共同特性的多的类事物抽象成一个类,这个类就是多个类的父类。父类的意义在于可以抽取多个类的共性,代码复用,减少代码量。
好处:降低了代码的复杂度,对于共同继承父类同一方法维护时只需修改父类中的方法即可,便于维护。
(3)多态性: 属性或方法在子类中表现为多种形态,子类对父类中的属性有所区别时,可以对父类方法进行重写。
好处:便于子类对父类方法或属性的替换与扩充,便于接口的使用(向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的),它在应用中体现了灵活多样的操作,提高了使用效率,多态简化对应用软件的代码编写和修改过程。
三、OO设计心得
1.面对程序设计的基本原则理解
(1)单一原则:一个类,最好只做一件事,只有一个引起它的变化。就好比人的品格专注,人只有专注于一件事情上时才能做好,类也是一样,最好做到每一个类只有一种单一功能,以保证实体只有一个引起它变化的原因。
(2)“开-闭”原则:一个软件实体应当对扩展开放,则修改关闭。也就是说,应当可以在不必修改源代码的情况下修改这个模块的行为。设计的目的便在于面对需求的改变而保持系统的相对稳定,从而使得系统可以很容易的从一个版本升级到另一个版本。
2.自身对OO编程思维的理解
OO程序设计思想围绕着5个基本原则和3个基本要素,而我如今所接触到的主要就是单一原则和“开-闭”原则,且这两者的目的都是为了保证程序的稳定,外界对其的影响降到最低。设计的类职责尽可能的少,而设计完以后不再对其进行修改。
四、测试的理解与实践
每次作业在完成程序后,自己运行无误后提交之后,总会有一两个测试点提示错误,这就是自己在编写过程中所忽略的点,而测试能很好的反映出代码中的不足,便于编写者去修改完善,因而测试时必不可少的环节,而使用junit进行程序测试是一个非常好的习惯。
五、课程收获
不知不觉学习面向程序设计已经有了两个月的时间,在几次作业中根据老师的思路去完成程序的编写,去感受面对对象的思维方式,渐渐的改变。但要完全适应还需要时间,对于单一原则从一开始的不解,到现在努力里的去达成单一原则的要求。此外对封装、继承、多态这三个要素的理解,对代码不管是复杂度还是重用性都有了较为明显的优化,以前的排序要写一段冒泡或者别的排序方法的程序,而现在学会运用comparable接口,直接调用即可;以前是把各种图形的面积存储为数组,对于其排序操作只是对面积的操作,而现在运用ArrayList直接将对象存储为数组,对其的操作是直接对图形对象的操作,不仅能对面积排序,还能对整个对象进行排序。在课程学习中收获颇丰。
六、对课程的建议
总体来说课程内容丰富饱满,但是希望以后能在作业发布前对作业中需要新知识点进行讲解。
浙公网安备 33010602011771号