0.前言
针对第5-8周(共三次)的作业发表的总结性博客
1.作业过程总结
第一阶段主要是让我们从面向过程过渡到面向对象,第二阶段则是按照老师设计的UML类图来进一步理解什么是面向对象,以便于我们更加熟练得去运用。
第4次作业个人感觉是最难的,有一个水文数据校验,并且运用到了刚学的但还不熟悉的知识——正则表达式。一开始写这个题目,没有任何思路,甚至连某个类某个函数是干什么的都不知道。这次的作业比较依赖于同学,很多思路和方法都是询问同学了之后才了解。因为写过了第4次作业最难的题目,第5次作业相比于第四次,显得简单了一些,主要是考察类继承和多态,虽然子类很多,但先拆解开一个个写,最后再拼接起来,整个题目显得也是非常容易的,这次作业中让我感到棘手的仍然是正则表达式。第6次作业在第5次的图形的继承和多态的基础上,加了一个梯形类,并且要用到Comparable接口,由于老师在课上已经讲过这些知识。所以也不是很难。但是通过第6次作业,发现封装性非常重要,如果第5次写的好,那么第6次只需要加一个继承与shape的子类即可,不用将整个程序进行更改,十分方便。而继承性中,子类也是父类的对象这一个特点使得很多函数不需要重新定义参数,让整个程序简单了很多。
在第4次作业中遇到的问题主要是正则表达式以及不知道类之间的关系(对UML类图还不太熟悉),询问同学才得以解决。第5次作业问题主要是不知道怎么将图形面积进行排序,对Arrylist不太熟悉,最后是将面积存入list里面,采用list.sort解决的。而第6次问题主要是一开始不太理解ArrayList<Card> cardList,不懂数组里的数据都是Card类是什么意思,自己思考之后慢慢理解了,接着就是在计算面积的时候我的代码由于和第五次的不同(第五次是将面积的数据存入,是double类),因此不知道如何在cardlist里调用GetArea()方法。最后是知道子类是父类的对象,因此可用cardList.get(i).shape.getArea();来得到面积的大小。、
花费的时间比例:6:3:2
除了第4次和第5次外,写代码的时间都不是很多,第六次由于我输出的list是小写,而题目要求是大写,而我本人不知道,以为是代码有错误,因此花费了很多时间。以后在这些细节方面要注意,更严谨一些,让每一项按照规定的输出规范输出,把所有的情况都考虑在内。
2.OO设计心得
面向对象三大技术特性之间关系的理解:
封装就是类可以把自己的属性和方法藏起来,不容易让外界改变自己的值;
继承是子类不但可以包含父类的属性和方法,他还可以派生出自己特有的属性和方法,并且还能重写父类的方法。
多态是同一个行为具有多个不同表现形式或形态的能力,个人的理解是一个函数在不同类中最后的结果是不同的。
面向对象设计的基本原则理解(单一职责原则及“开-闭”原则):
单一职责原则:每个类都应该有自己的单一的功能,并且该功能应该由这个类封装起来,同时这个类变化的原因只有一个:他自己本身代码的修改。同时,修改这个类不会对其他的类造成影响。
“开-闭”原则:每个类应当对扩展进行开放,对修改进行关闭。
OO编程思维的理解:我认为,首先应该确定解决这个问题需要有几个类,这些类之间是什么关系,类的功能是什么。之后分别把这些类的内容写出来。最后再通过Main函数将这些类的功能表现出来。
类设计心得:每一个类要独立,不受其他类的影响,类要单一职责,并且尽量能做到重复使用。
3.测试的理解和实践
测试是完成一个整体设计之后的过程,测试要去想测试的方法,测试的用例,首先需要题目要求的验证基本功能是否都被实现,然后针对时间复杂度和空间复杂度去进行去优化。只有当各种测试都能通过,且程序不会崩掉时,代码的质量才是好的,代码才是健全的。
Junit,可以书写一系列的测试方法,对项目所有的接口或者方法进行单元测试。且在启动后,自动化测试,并判断执行结果, 不需要人为的干预。只需要查看最后结果,就知道整个项目的方法接口是否通畅。并且每个单元测试用例相对独立,由Junit 启动,自动调用。不需要添加额外的调用语句。添加,删除,屏蔽测试方法,不影响其他的测试方法。 开源框架都对JUnit 有相应的支持。
4.课程收获
通过这四周的学习,让我学习到了如何去设计一个类,也学会了类的继承,多态以及什么是抽象类,什么是接口。对类之间相互调用也变得更熟悉,同时也认识到了类的单一职责和封装多么重要。进一步理解了面向对象,以及面向对象相较于面向过程的优势。
5.对课程的建议