前言:本次总结为java的第二阶段学习总结,共有三次作业,主要是强化了之前正则表达式的知识,进一步学习了封装性、继承性与多态性三大技术特性,并且对问题化简、设计UML类图等综合运用有了更高的要求。总的来说就是,加深了对面向对象这么一门编程语言的理解,对于问题的分解转化的技能进一步强化。
一、作业过程总结:
1.总结第二阶段三次作业(第4到第6次)之间的知识迭代关系
第四次作业的第一题是水文数据校验及处理,虽然难度不大,但是对于正则表达式的使用、问题的化简要求高些,对比第一阶段都是要求有更高。这其中涉及到较多的算法思路,继承、复用的体现并不是很明显。思路其实不难,总的来讲就是读取、判断、输出三个步骤,若从做题来讲,其实读取和判断、输出可以放在一起进行,但是考虑到程序的复用性,这些基本方法分开来写是必须的。第二题是蒙特卡罗方法求圆周率,该题涉及到矩形、圆,以及各个点的坐标,因此,就拿矩形和圆来说,就可以设计一个抽象类,并建立继承关系,同继承于一个形状类(抽象)Shape,但是对于此题来讲体现的并不深,相差并不大。第三题指明了是继承(题目为:图形继承),涉及的形状有圆、矩形、球及立方体,很明显,使用继承是再合适不过了,因为其中的周长、面积、名称等等共同属性是非常适合的继承的,可以化简程序的设计。
第五次作业第一题是图形继承与多态,一来是强化之前的继承,而来是添加新内容---抽象,在图形设计的基础上加上Shape这样的抽象类,让程序进一步封装。实体类的设计比较简单,主要是方法重载和方法重写,思路清晰,结构简单。第二题是一元多项式求导,该题主要也是设计抽象类Term,但难度更大些,需要更深层次理解,同时也要考虑复用性。
第六次作业第一题是图形卡片排序游戏,第六次作业更注重于继承与多态的实际运用,并且新增了接口方法,让排序更加灵活。同样,也是设计一个Shape的一个抽象类,让卡牌(分别代表了圆形、矩形、三角形、梯形)对号入座,建立对应的对象,并放入list中,然后根据需求来排序,思路清晰,方法简单。第二题是图形卡片分组游戏,可以说是和第一题一样,不同的是多加了一个分组,需要将不同的卡片进行分组,计算、输出。难度也没增加多少,而是对接口的要求需要更加熟练。
三次作业就是这样一步一步将继承、多态、抽象、接口的知识逐步体现。
2. 如何通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性?
回顾本三次作业,封装性似乎并没有体现,但仔细思考便会发现,老师所讲的privat不正是封装的最好提现吗,没错,在我们设计一个类的时候,我们往往都会在class的属性面前加上private,而当需要访问该变量的时候,正是通过setter和getter方法来实现的,例如以下代码:
1 class Shape{ 2 public double getArea() {//求图形面积 3 return 0.0; 4 } 5 public void setter(double r) { 6 } 7 public double getter() { 8 return 0.0; 9 } 10 }
对于继承与多态,其实本三次作业是循序渐进,加强实际运用。第四次作业对继承要求并不是很高,只是简单理解并运用即可,其中,涉及最多的是第三题,直接是需要使用继承与多态来解决问题,后面两次是综合的具体运用,在继承的同时,加入接口知识。第五次作业第一题是强化继承与多态,第二题是进一步具体运用。第六次前两道题是具体的综合运用,并加入了接口的知识。
1 class Card implements Comparable<Card>{ 2 private Shape shape; 3 public Card(){ 4 } 5 public Card(Shape shape) { 6 this.shape=shape; 7 } 8 public Shape getShape() { 9 return shape; 10 } 11 public void setShape(Shape shape) { 12 this.shape = shape; 13 } 14 @Override 15 public int compareTo (Card other) { 16 if(this.shape.getArea()<other.shape.getArea()) { 17 return 1; 18 } 19 else 20 if(this.shape.getArea()>other.shape.getArea()) 21 return -1; 22 else return 0; 23 } 24 }
3.作业过程中遇到的问题及解决方法
(1)水文数据校验及处理当中遇到的格式判断比较棘手。
解决:这里不仅要求思路清晰,还要求对正则表达式有足够熟练。在经过一两个小时的正则表达式研究之后,最终找到了格式判断的表达式,分别是:
检测时间:[1-9]+[0-9]{0,3}/[1-9]+[1-9]{0,1}/[1-9]+[0-9]{0,1} [0-9]+[0-9]{0,1}:00
检测水位:[1-9][0-9]{0,3}\.[0-9]{1,3}||[1-9][0-9]{0,3}
检测开度:[1-9]{1,2}\.[0-9]{2}
检测流量:[1-9][0-9]{0,3}\.[0-9]{1,3}||[1-9][0-9]{0,3}
思路简单,即先切分判断是否是五个部分,再每个部分依次判断即可。
(2)一元多项式的求导中,再判断输入时遇到问题
解决:最纠结的地方:是直接判断整个表达式好还是先把表达式先切分,再判断好。仔细思考下还是先切分比较好,一来这样可以通过通用的正则表达式来逐个判断,二来也方便求导,但是需要考虑怎么切分问题。经过几个小时的探索之后,终于找到了切分方法,先将“-”替换成“+-”,再将”^+”替换成”^”,这样即可保证把每一项都成功切。接下来就是依次判断,逐个计算了,思路清晰,算法简单。
4.每次作业花费的时间比例大概是2:2:1,前两次作业难度较高,有些地方测试时间很久,第六次的较为简单,比较顺手。
5.对编程过程的严谨性的认识及教训
在第四次作业当中并不理解继承与多态,只是知道他们之间能这么用,导致对复用性的思考并不多,在做题的时候没有严谨把握,这是今后需要谨记的。
二、OO设计心得:
①对面向对象三大技术特性之间关系的理解
封装性,说白了讲就是包装,把控权限,该访问的访问,不该访问的限制访问。通常,在考虑对类内部定义的属性(对象的成员变量)的直接操作导致数据的错误、混乱或安全性时,就能很好的体现封装。继承,是指子类继承父类的属性和方法,但是要注意private定义的属性和方法。多态,是指继承之后出现的各个子类,这种子类之间是有相同部分也有不同部分。
②面向对象设计的基本原则理解(单一职责原则及“开-闭”原则)
所谓单一职责,就是指对于一个类而言,应该只能有一个引起他变化的原因。所谓开闭原则,就是指在所设计的实体类当中,应当是可扩展的,但不可修改的。
③OO编程思维的理解
对于OO编程思维的思考并不是很多,我得理解就是,操作对象(类),在对象上下功夫,因此可以涉及到封装、继承、多态、接口等的理解。
④类设计心得
在类的涉及当中,应当多考虑其基本原则,让程序的复用性提高,扩展性增强,这样设计的类才能更加健壮。
三、测试的理解与实践:
①测试对于编码质量的重要性
测试是对代码质量评判的一个最重要指标,测试能够通过的代码,才可能是好的代码。但是测试也分好坏,考虑的情况简单,设计的测试即使能通过,但也不是最好的,毕竟,还可能在运行时间、某些特殊情况被忽略没有被测试到,也都是致命的关键。
②查阅资料,假设使用Junit进行程序的测试是否可行
可行,事先考虑好情况,再针对性地实现。
四、课程收获:
第一阶段在学习了java这么面向对象的一门语言之后,便初步学会了面向对象思维的一些编程方法及技巧。
第二阶段学习过程中,不仅加强了之前对正则表达式的正确运用,也进一步学习了java的三大特性:封装性、继承性与多态性。并且将其综合运用,加深了对Java这么一门面向对象语言的理解。
五、对课程的建议:
希望老师在下一阶段的作业难度保持这样,太难了,花费的时间好多,太简单了,学的知识不够稳当;对于课程,老师按照目前这种讲法真的很赞,将一个简单问题不断扩展,循序渐进,由浅及深。