0. 前言
Java第四、第五、第六次大作业总结
1.首先是对近期做作业过程的总结
No:1 三次作业之间的知识迭代关系:
第四次大作业涉及到正则表达式的运用、蒙特卡洛仿真方法求圆周率和图形的继承。第五次大作业是图形的继承与多态、用类的继承、多态性编写程序对简单多项式的导函数,第六次大作业便是类的继承、多态性使用方法以及接口的应用。这三次大作业是循序渐进的过程,有很好的复用性。
No:2 如何通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性:
在前一阶段的学习中我们知道:在类中定义了自己的私有属性和方法,规范属性的范围,体现了面向对象的特征:封装性;而在这个阶段的练习中有较多的类继承关系的运用,像父子类的继承关系、抽象类的子类要全都实现父类定义的方法、子类重写父类的方法等等;而在第二阶段第三次作业中体现了三大特性之一的多态,多态体现了同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。
No:3 作业过程中遇到的问题及解决方法:
在第四次大作业中,第一题便是水文校验,涉及到正则表达式的运用,因为之前并没有学过和接触过,所以看到老师发的作业指导书,当时是懵的,要使用Java中的字符串处理类以及正则表达式对输入字符串数据进行合法性校验及计算。看到这些输出样例,我就先做后面两题,因为老师说过这次作业难度是依次递减的,等我搞定后面两题,发现已经没有多少时间了,等我提交答案后,发现还是答案错误,所以就放弃了这题。
第二题是蒙特卡罗方法求圆周率。因为老师是给了作业指导书的,这给我们降低了难度,给了我们UML图和Main 类源码,根据UML图我们可以知道这题的框架,有了框架,题目就容易了。
第三题是 图形继承,老师上课时也讲过各种类的继承,也给我们留了课堂作业,所以这题还是比较顺利的完成了。
第五次大作业中,第一题是图形的继承和多态,在第四次图形的继承的基础上运用了多态,要求我们面积求和,然后排序,这就要求我们的代码要做到可复用性,用三个普通数组存放各个图形的面积值,再用System.arraycopy将三个数组合并,最后用Arrays.sort方法进行排序就行了。
第二题是一元多项式求导,要求我们使用类的继承、多态性编写程序对简单多项式的导函数进行求解,由于我们学习过了正则表达式,所以面对多项式的合法性时,可以比较轻松的应对,通过此例,进一步深入理解面向对象设计原则中的“单一职责原则”。
第六次大作业中,第一题是 图形卡片排序游戏,目的是让我们掌握类的继承、多态性使用方法以及接口的应用,就是在类的继承、多态性的基础上,在对卡片排序时使用 Comparable 接口, 即 Card 类需要实现 Comparable 接口中的 CompareTo()方法。按数字字符串排序而不是按浮点数的大小排序,然后就行面积排序。
第二题是图形卡片分组游戏,目的也是掌握类的继承、多态性使用方法以及接口的应用。只是在第一题的基础上对不同图形分类进行排序,用到了arraylist和string的相互转换,和字符串的一系列操作。输出格式比较复杂,但是并不难。
第三题是加分题,当时一看,求素数,这不是以前C语言就练过的题目吗,然后很自信的提交了自己的代码,然后提示我运行超时,我发现有个
得分公式,计算方式为:所有得到满分的同学程序所用时长的平均值-你的程序运行所用时长)/所有答案所用时长最小值*30分,为负值者不得分。我才发现必须优化自己的算法,一开始提交的时间复杂度太高,然后在网上找了些优化算法,提交后,运行时间为107ms。
No.4每次作业花费的时间比例:
6:3:2
No.5对编程过程的严谨性的认识及教训:
在写作业的过程中经常会出现命名的操作,有时候变量为了方便就直接用了a、b、c等简单的符号,最后变量一多会有点分不清楚这个变量是表达的什么,这就导致了要经常翻看之前的代码导致效率下降,最后还是觉得不能偷懒,并且为了程序的可读性还是应该按照功能的名称或者变量本身所表达的意思来进行命名。还有就是要做到代码的可复用性。
2.OO设计心得
①对面向对象三大技术特性之间关系的理解:
我认为,封装和继承目的都是为了代码重用,而多态目的是为了接口重用。继承就是子类包含父类的属性和方法,不重复编码便可以使用他们,但是子类又不仅限于父类,他可以派生出自己特有的属性和方法,用高中数学解题思路可以解释继承的过程是一个“从一般到特殊的的过程”。
②面向对象设计的基本原则理解(单一职责原则及“开-闭”原则)
单一职责:一个类应该只有一个引起它变化的原因。即每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。
开闭原则(OCP)是面向对象设计中“可复用设计”的基石,开闭原则告诉我们应尽量通过扩展软件实体的行为来实现变化,而不是通过修改现有代码来完成变化,它是为软件实体的未来事件而制定的对现行开发设计进行约束的一个原则。
③OO编程思维的理解
老师上课有讲过面向对象的基本特征有抽象、封装、继承、多态,还有程序的可拓展性、可修改性和可替换性,但是在自己实际的操作中,大部分时间仍会注重在如何解决问题,即还是面向过程的思想,不过经过最近几次作业和课堂练习,逐步的对面向对象的思想有了一定的认识和了解,今后思考问题也会尽量的使用这种思想。
3.测试的理解与实践
①测试对于编码质量的重要性
一次性写完没有语法错误的代码并不难,但是一次写出完美无bug的代码是比较难的。所以测试对于编程可谓是非常重要的环节,在一篇博客中看到一句话“”没有测试过的代码就像是没有净化的水,谁也不知道水里面藏着什么污垢。”
②查阅资料,假设使用Junit进行程序的测试是否可行
JUnit 是一个 Java 语言的单元测试框架。对所要测试的类创建测试类,在该类中输入数据进行测试,所以是可行的。
4.课程收获
总结这四周来在OO方面的教训及收获
经过这么久的JAVA编程学习,有不足也有收获,其中,收获较大的是面向对象编程的思想以及不同功能的实现、eclipse的使用等等,不足则主要体现在代码的精简度还需要提高,面向对象的思想还需要巩固,在接下来的学习中还应当多多练习。
5.对课程的建议
①第三阶段作业难度、题量的建议
我觉得水文校验那次的题目是比较复杂的,大部分时间都用在了对数据格式的验证上,所以导致大部分时间花在了debug上,而每个类里面的方法确并不难。
②课程内容讲解方面的建议
老师讲课的激情真的很强大,可是每次Java可都是早上,我认为适当的课间休息真的很有必要(虽然都是同学查看博客,等老师看到,课程已经结束了···)