Java第二阶段学习总结
0. 前言
这段时间完成了第二阶段的java作业练习,第一阶段是入手,那么这个阶段则是这之后的学习打基础;这几次作业主要是加强我们对面向对象的封装性、继承性、多态性特征的理解,下面是我对此次作业的总结分析。
1.作业过程总结
(1) 三次作业之间的知识迭代关系
第4次作业涉及数据检验及处理,类的继承。要求我们依题设计正确的正则匹配,实现多种数据格式的检验及处理,还有就是理解继承特性。
第5次作业是在作业4的铺垫下,让我们加强理解类的继承、多态性;第6次作业相对于前两次来说,更加简单,也是在前者的练习过后,更加理解了类的多态使用方法,而且这次作业还加入了接口的应用,让程序处理更加多样了。
(2) 通过作业逐步理解面向对象的封装性、继承性、多态性特征
作业不会刻意的说用到这几个特征,但代码实现上就会反映出这些特征,这也是面向对象编程的重要体现。理解见下文中的对这三个特性的理解。
(3) 作业过程中遇到的问题及解决方法
①作业4中题一对输入的数据进行有效性校验要求较高,因此在应对数据的格式测试上挺让人头疼的。具体如下:
既然有这么多种不同的格式,这就需要不断地细分,对一条信息进行数据校验、对各种不同数据进行校验、对不同数据的不同格式进行校验……具体的实现就不一一罗列了,总之就是不断地切分功能,最后整合到一起。
②作业5题二、使用类的继承、多态性编写程序对简单多项式的导函数进行求解中。同样是在输入输出的格式上花费了不少功夫。
在处理格式时,我的处理方法是这样的:先将输入的多项式以“+”分割成一个个单项,在每个单项进行格式匹配,若匹配成功则进行求导处理,当然得到的还是一个个单项,当所有单项都处理好了之后,将单项串成一个完整的表达式。这只是概要的思路,具体实现还是挺困难的。
③作业6相对比较简单,无非就是设计对象的实现,以及输出的格式问题,这些问题解决起来还是比较轻松的。
(4) 三次作业花费的时间比例
(花费时间为实际写代码所用时间)对于这三次作业,也许是难度有所加大,所花时间远比阶段一作业多:作业4所用时间大概是10小时、作业5所用时间大概是7小时、作业6所用时间大概是5小时,前后比例为10:7:5 。
(5) 对编程过程的严谨性的认识及教训。
数据的格式是十分严谨的,对于不同的需求,我们应该能灵活地做出应对,这也就要求我们在编程时多多思考,考虑到尽可能多的情况。在写一个程序时,多多加上一些注释,也是为之后的检查及修改提供方便。
2.oo设计心得
(1) 面向对象三大技术特性之间关系的理解
三大特性:封装性、继承性、多态性。
①所谓封装,就是把客观事物封装成抽象的类,类中的私有属性和方法是无法被访问的,表现了封装的隐藏性,增加数据的安全性。简单来说,一个类就是一个封装了特定属性及方法的逻辑实体。依据某个类创建的对象对其内部属性及方法实行不同程度的保护,根据需要来使用对象中的各属性及方法。
②所谓继承,就是让某个类获得另一个类或多个类的属性。子类继承父类。实现了继承之后,子类就可以使用继承来的所用方法,同时可以依据需要重写从父类继承来的方法。实现继承大多通过组合来实现,其中有实现继承以及接口继承,在这几次作业中,我们就用到了这两种继承方式。
③所谓多态,是指不同的对象,接收到不同的消息会有不同的行为,就像不同的人听到一件相同的事所做的反应都是不同的。同一个类表现出不同的状态,也就是说一个类具备了多种形态。
继承与封装,一个让类有了通用、灵活、独立的效果,一个让类与类之间有了直接的联系,这也就为多态打下了基础。把不同的子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适用需求不断变化。
(2) 面向对象设计的基本原则理解(单一职责原则、“开闭”原则)
之前不太了解这些基本原则,但经过这几次的作业练习以后,有了更多的理解: ①单一功能原则,即一个对象只有一个功能,专注一个功能。这样的话,如果需求有了改变,只需对该对象所对应的类进行修改,而且这样不会影响到其他的功能,就是实现功能单一 ②开放封闭原则,即一个类写好了,在更改性方面是封闭的,不改变原本的功能;在扩展性方面是开放的,能够实现新功能的添加。③此外还有以下基本原则:依赖倒置原则,接口分离原则,里氏替换原则。其中,接口分离原则要求各个模块之间通过抽象的接口分隔开;简单来说,就是实现你需要用到哪些方法就调用哪些方法,屏蔽掉不需要的方法,同时也防止实施调用的对象访问了不该访问的方法。
(3) oo编程思维的理解
在面向对象编程过程中都以对象为主,即把问题的某些内容抽象为某个对象,然后创建出具有属性和方法的类,依据类中的属性和方法之间的各类关系来实现各种功能,在不同情况下实现各种调用。这种将抽象出对象对应实际问题的某些内容的思维,对于以后的软件开发的可维护性、可扩展性以及可复用性等都是有极大的好处的。
3.测试的理解与实践
(1) 测试对编码质量的重要性
测试对于编码质量很重要,因为在投入使用前,我们对它的细节要求并不是很清楚,就像作业中所给出的测试点经常要多次调试才能过。而测试则可以让我们对代码进行全面检查,一步一步完善每个功能,实现编码的高质量。
(2) 使用junit进行程序的测试分析
junit是一个java语言的单元测试框架,junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(how)完成功能和完成什么样(what)的功能。我们在编程时使用junit写一些适当的测试是有必要的,junit有断言功能,如果测试结果不通过会告诉我们哪里测试不通过,如果junit报告了测试没有成功,它会区分失败(failures)和错误(errors),在此基础上进行修改,这大大提高了效率。
在实践中,编写测试代码会使我们的压力逐渐减轻,因为通过编写测试代码,我们也能对类的行为有更确切的认识。以下是我认为比较有必要掌握的技巧:①确保测试与时间无关,不要依赖使用过期的数据进行测试。②尽可能地使用junit提供的assert/fail方法以及异常处理的方法,利用junit 的自动异常处理书写简洁的测试代码可以使代码更为简洁。③测试类和测试方法应该有一致的命名方案。如在工作类名前加上test从而形成测试类名。④测试要尽可能地小,执行速度快。
4. 课程收获
通过这四周的学习,在oo方面,以及渐渐养成了面向对象的编程思维,解决一个问题时,慢慢习惯去实现一个个模块化的功能,估计这就是封装吧,同时做了这么多的练习,对于三大特性已经慢慢地体现在了代码中。
此外,这几次的作业做下来还是觉得挺吃力的,还是得多多练习,把基础打牢靠。
5.之后一段时间的学习计划
结束了第二阶段的学习,在之后的学习中,多多练习写代码,同时由于下一阶段更考验每个人对于类的设计,这就需要在类的设计上多花心思,需要更加针对性地学习。希望能和同学多多交流与探讨。