OO第二单元作业总结
前言
该文主要是记录本人开始学习java面向对象设计课程第二阶段作业总结。
1.作业过程总结
①三次作业之间的知识迭代关系
这一阶段的三次作业同样是层次分明,知识逐渐深入,第一次的三道题目难度递减,第三题是继承的简单运用,只需要了解继承的概念和基本用法,第二题则是要求除了继承的基本知识外还要有能够读懂类图和题目,了解蒙特卡罗方法求圆周率的具体实现方式,而第一题又在第二题的基础上增加了对正则表达式的考查。第二次第一题在继承的基础上增加了对多态性的考查,第二题则是深化对正则表达式的理解。第三次作业的前两题都是在继承和多态的基础上增加了接口.知识层次逐渐上升.加分题则是考查算法优化。
②如何通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性
封装,是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装是面向对象编程的核心思想,将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体是类,类通常对用户隐藏其实现的细节,这就是封装的思想,在Java中通常通过建立一个实体类,用来封装对象的属性和行为,通过getter和setter方法封装起来,这一特性从学习了类的知识之后的题目中就开始体现,但在第一阶段体现得不够明显,而在这一阶段中就有了充分体现,例如第一次作业的图形类,将每个图形独立为类封装起来,在主方法中调用每个类中的属性和方法达到程序的目标。
继承,是子类共享其父类数据和方法的机制。它由类的派生功能体现。一个类直接继承其他类的全部描述,同时可修改和扩充。面向对象的继承性,简单来说就是使子类的对象拥有父类的全部属性和行为,同时可以增添自己的所特有的属性和行为。这样可以节省写共同具有的属性和方法代码的时间,有利于代码的复用,这就是继承的基本思想。在本阶段第一次作业第三题图形继承就开始应用继承机制,每个图形都是Shape的子类,且都重写了Shape的getArea方法,我的理解是:继承就是父类有子类的共性且子类有自己的特性。
在面向对象设计中,多态性主要体现在向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为,也就是说,每个对象可以用自己的方式去响应共同的消息。而通过第二次作业可以发现,多态的实现并不依赖具体类,而是依赖抽象类和下一次作业中用到的接口,在多态的机制中,父类通常会被定义为抽象类,在抽象类中给出一个或者几个抽象方法,而不给出实现的具体过程,通过子类继承父类并重写抽象方法来实现,
③作业过程中遇到的问题及解决方法
第一次作业中,关于继承的知识相对简单,单纯考查继承的第三题没有遇到太大困难,第二题的困难在于没有完全理解题目中的意思以及类图,查阅相关资料后思路清晰了问题也就迎刃而解了,但是第一题由于自身的知识水平有限以及没有及时去学习相关知识导致最终放弃了这题。
第二次作业的第一个困难时ArrayList的用法,同样是在网上查阅了相关资料解决的,第二题没有通过全部的测试点主要是因为正则表达式还不够熟练导致的。
第三次作业里,两道题目相似,我对照样例输入,结果也和样例一模一样,但在提交PTA测试时除了非法输入其余的全部点都没过,我反复检验自己的算法各个方面,逻辑上都行得通,但一直都没有解决问题,同时拿代码去询问同学找问题,之后才发现了我重复运用了Scanner,而这还是作业指导书里提示了不要踩坑的,这个教训应该谨记。
④每次作业花费的时间比例
第一次作业用了近20小时(在放弃了第一题的情况下),其中大部分时间是花在第二题上,第二次作业花了也差不多20小时,但也是主要耗在第二题上,第三次花了近30小时,尽管两道题目差不多,但由于我上面提到的错误,导致代码来来回回改了蛮多次但就是没改到点上,耗时主要是耗在了修改上面。
⑤对编程过程的严谨性的认识及教训
本阶段作业由于忽略编程严谨性导致的最大错误还是那个Scanner,有错误也就有收获,我会在接下来的作业中着重注意这一点。
2.OO设计心得
①对面向对象三大技术特性之间关系的理解
在我看来,这三大关系是由浅入深,层层深入的,首先通过封装类达到面向对象设计的目的,之后的继承是基于封装好的类来实现的,而多态是多个类继承了同一个抽象类来实现。
②面向对象设计的基本原则理解(单一职责原则及“开-闭”原则)
单一职责原则,按照字面意思理解,就是一个对象有且仅有一种功能,同时也仅有一种功能需求的变更能够引发该对象实现的修改。每个对象都有其自己的职责,这在大型应用的设计和维护至关重要,假设一个应用的代码量为10W行,当我们需要更新它的某个功能时,只需要在它的对象中作修改而不需要对代码全局做出修改,这样更适合应用开发团队对应用的维护和更新。
“开-闭”原则,理解它,首先要理解“开”什么,“闭”什么。“开”是指面向扩展开放,“闭”是指面向修改关闭,开闭原则其实就是让我们遵循一种编码习惯,尽量通过扩展软件实体的行为来实现对软件的改进变化,而不是通过修改现有的代码来完成这种功能。同样以上段情景为例,假设我们需要对该应用的某个功能扩展一个新功能,若该应用的代码遵循开闭原则,我们只需要在将新功能的类接入隶属功能的接口中,而不需要对原功能做出太多的修改,使应用更有灵活性,可复用性。
③OO编程思维的理解
我的理解是,面向过程设计最重要的就是模块化设计,在面向对象设计中,程序的重点集中在主体对象上,即程序=对象+对象+......+对象,而每个对象都封装了其数据结构和算法,每个对象彼此互不干扰,其数据结构和算法也就不会因为程序的规模变大而更加复杂,同时由于继承性和多态性,使得对象的功能可以扩展,便于维护和更新。
④类设计心得
设计类首先要分析类所具有的属性,适用什么方法,哪些东西可以划为一类,在程序设计之初就应该有个大致规划,设计好类图,然后按照类图去编码。
3.测试的理解与实践
①测试对于编码质量的重要性
测试对于编码质量的重要性毋庸置疑,无论是程序是否达到了预期要求,程序是否满足用户需求,还是代码的简化,优化,提高编码质量,都离不开测试。程序员在编码的过程中可以通过测试来验证代码是否正确,正确之后则考虑是否有更优方案使代码更简洁质量更高,这些都是在不断测试的基础上完成的。
②查阅资料,假设使用Junit进行程序的测试是否可行
经网上查阅资料,Junit进行程序测试可行。其基本流程是新建项目->导入Junit包->生成测试框架->运行测试代码。
4.课程收获
最大的收获是自己的面向对象意识更加明确了,熟悉了面向对象设计中一些基本的思维方式和相关概念。
5.对课程的建议
①第三阶段作业难度、题量的建议
作业难度可以紧跟课程进度,同时适当添加一些自学内容,同时算法上可以略微提高一下难度,题量的话每次2-3题适宜。
②课程内容讲解方面的建议
无。

浙公网安备 33010602011771号