OOPTA作业总结
0.前言
本次博客为整门课的PTA作业总结。
1.作业过程总结
①总结作业之间的知识迭代关系
三次的作业难度及深度都是层层递进的。首先课前自学了课件Java环境搭建和程序初体验,学会了JDK安装、Eclipse安装、配置和调试、HelloWorld程序编写和编译,能够初步配置Java环境,学会怎样写Java程序。然后自学了Java概述,包括Java明天、Java昨天和Java今天,了解了Java的前世今生,更有利于对今后Java的学习。Homework1的5道题都是很基础的题,是关于Java类基础知识的,包括Java类结构和main函数、基本类型和运算符、选择循环结构,这些知识大多都和C语言差不多,但还是有些微区别和新的知识,因此需要自己融会贯通并理解学会Java程序的基本语法,就能够很好的完成Homework1的作业;Homework2在Homework1的基础上新加了自定义函数和数组相关知识,在题目中需要自己构造相应的方法来进行程序的编写;Homework3则是在头两次作业的基础上增加了面向对象和类相关知识,需要学习面向对象思想、Java类和对象、构造函数、信息隐藏和this用法。此次作业更能体现出Java编程的特点,强调了面对对象和类,还运用到了关联关系(聚合、组合是特殊的关联关系)、继承关系。Homework5中的三道题难度是递减的,第三题图形继承的主要知识在于继承,需要学习继承的相关知识并融入之前所学的java知识。第二题蒙特卡罗方法求圆周率主要需要理解题意,弄清楚设计每个类及每个方法的目的是什么,再来进行程序的编写。第一题水文数据校验需要掌握的主要知识是正则表达式;Homework6的第一题图形继承与多态,相较于Homework5的第三题,知识加深了,除了要灵活运用继承,还要考虑多态。第二题一元多项式求导的知识又是与Homework5第一题相关的,涉及到正则表达式的运用;Homework7的两道题都是继承与多态的运用。
②(1)如何通过作业逐步从面相过程过渡到面相对象
作业是逐步深入,通过作业认为从面向过程编程到面向对象要进行思路转换,关键在于应该把问题抽象成对象去考虑,并充分利用和理解面向对象的基本特性:封装性、继承性、多态性等,减少对代码的重用。
(2)如何通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性
通过作业能够知道封装性是将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体是类,类通常对用户隐藏其实现的细节,这就是封装的思想,在Java中通常通过建立一个实体类,用来封装对象的属性和行为,通过setXxx()和getXxx()方法封装起来。因此封装性就是利用抽象数据类型将数据和基于数据的操作封装在一起,保护数据并隐蔽具体的细节,只保留有限的接口与外界联系;通过写图形继承等题目我认为继承性简单来说就是使子类的对象拥有父类的全部属性和行为,同时可以增添自己的所特有的属性和行为。这样可以节省写共同具有的属性和方法代码的时间,有利于代码的复用。Homework6和Homework7都运用到了多态性,多态性简单来说就是一个程序中同名的多个不同方法共存的情况,通常使用方法的重载和重写(也叫覆盖)来实现类的多态性,多态性允许以统一的风格编写程序,以处理种类繁多的已存在的类以及相关类,多态的实现并不依赖具体类,而是依赖抽象类和接口,在多态的机制中,父类通常会被定义为抽象类,在抽象类中给出一个方法的标准,而不给出实现的具体过程,通过继承父类来实现,而比抽象类更方便的是将抽象类定义为接口。
③作业过程中遇到的问题及解决方法
(1)第一次写程序的时候不知道用户输入代码该怎么写,通过在网上搜索资料知道了需要用到import java.util.Scanner。
(2)判断三角形类型这一题的有一个测试点始终过不了,经过反复检查并没有发现错误,就去问了同学,结果是因为没有考虑精度问题。
(3)在计算下n天时,一开始我的算法是一天天来算,可是运行超时,耗费时间长。那时候有想过减去年份,减去月份,再一天天算。但是这种方法好像很麻烦,在计算减去月份的时候,要用到很多语句,后面算一天天也有很多语句,就显得这个算法很长。所以我换了一种方法,先把年份减去,然后再一天天算。
(4)在写Homework3三四题的时候,对于类的设计图有点疑惑,通过问同学得到了解答,在写代码时也对于运用其他类的方法不是很会,通过上网搜索得到了解答。
(5)Homework5第一题对我来说难度很大,正则表达式不是很会,在自学并结合网上的知识试着写了以后,也没有通过测试点,难度太大就放弃了。
(6)Homework5第二题求圆周率,不知道随机数怎样产生,上网查了很多资料,最后写出来了。
(7)Homework6第一题在对对象进行排序时有不知道该怎么写,学习了ArrayList相关的很多知识才得以解决。
(8)Homework6第二题多项式求导对于具有多个项的式子求导不知道该怎样编写,最后也有几个测试点过不了;
(9)Homework7第二题写了多个ArrayList,但出现了超出范围错误,最后发现list.add直接存入,就不会错了。
④每次作业花费的时间比例
Homework1:Homework2:Homework3:Homework5:Homework6:Homework7:Homework9:Homework10:Homework11=1:2:3:6:4:3:7:9:10
⑤对编程过程的逻辑严谨性的认识及教训
编程时逻辑严谨性是十分重要的,在做一道题之前,首先应该仔细阅读题干和要求,在心里大致想好应该按照什么顺序逻辑来写,或者先在草稿纸上把思路画出来。如果编程时逻辑不严谨,会造成很多错误,也会使编程更加复杂,加重自己的作业量。
2.OO设计心得
(1)面面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
(2)面向对象的优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护;缺点:性能比面向过程低。
(3)面向对象是将现实问题构建关系,然后抽象成类,给类定义属性和方法后,再将类实例化成实例,通过访问实例的属性和调用方法来进行使用。
(4) 封装是优点,继承是基础,重载是特点,多态是特征。如何架构好一个程序做到高内聚,低耦合永远是软件设计的最高追求。
(5)设计类时,先根据题意,通过画类图对类进行设计,先理清楚各个小问题之间的关系,再设计的类与类之间的关系,是依赖、继承、实现、关联、聚合还是组合。
3.测试的理解与实践
测试可以检验所写代码的准确性,通过多个测试点的检验可以准确找出错误,以便修改。
4.课程收获
编程需要严谨的思维方式,不能只考虑片面,而要把所有的情况考虑进去,这样,编写出来的程序才是比较好的,如果编程的时候,没有经过仔细的研究以及分析,就容易出错,因为没有考虑到极端的情况,虽然是很少出现的,但是也是会出现的。而且写完代码之后,要学会在其他地方运行一下,观察一下,有没有其他的错误,不能急着提交作业,这样可以检查出自己没有发现的问题,而且通过一些极端的值进行测试,这样更能体现出自己所写的程序的完好性。面向过程和面向对象肯定是有区别的,面向过程和面向对象都可以解决当前要解决的问题,但是仔细想想和分析,就能发现面向过程缺少复用性,因为,面向过程只是能够解决当前问题,如果下次出现类似但又不完全一样的问题时,再想用之前用过的方法,就很难再复用过来,而面向对象就不一样,它的复用性很强,而且写出来的程序可读性也很强,让读者很容易读懂,找出错误也很容易,不像带着面向过程思维所写的代码很难找出错误。我觉得面向对象的基本原则首先是要能够解决当前所需要解决的问题,如果连问题都解决不了,这样面向对象写出来的程序就没太大价值。
然后就是所写的类里面的属性和方法要做到尽可能齐全,就是说这个类所有的功能和属性要包含进去,这样复用性就比较好。还有就是每个方法要遵循单一职责,就是这个方法不要有其他的本身没有的功能。对面向对象编程思维的理解,这种思维是突破以往面向过程的思维,我们要产生对象的概念,要把解决问题,看成是多个对象相互之间的作用,这样就可以产生出很多对象,通过对象之间相互关系,进行调用,从而逐渐解决问题。这样做可以提高程序代码的复用性。这样的思维要求我们有对象这个概念,这种思维将问题形象化,更好找到问题的解决思路。测试对于编码质量的检测很重要,通过测试可以检测出编码的正确性和效率性,很多编写出来的代码,不知道是正确还是错误或者时间和空间的效率性,很多时候需要通过测试来体现。
在解决问题时,要认真把题目看懂,要注意题目的要求,不能一看到题目,就用面向过程的思维去解决问题,这样自己很难真正学会面向对象的设计。要打破自己以前的思维方式,要逐渐地用面向对象的思维去看待问题,解决问题。
无论做什么,都需要有一个好的思维,对于OO编程来说,好的思维方式是基于面向对象的,以前的思维偏重于面向过程来说,但是对于OO编程来说,它是需要面向对象的思维方式,面向对象的思维注重于代码的复用性,就是说,解决很多问题,都可以用到同一部分代码,不需要自己另外再去写,这样就体现出OO编程的优越性,能够提高程序的效率。
5.对课程的建议
java这门课程基本结束了,通过一学期的学习,我希望老师上课时可以多举一些实例,结合代码进行讲解更容易理解。还希望老师能够多讲一下PTA做的练习,讲解一下应该从哪些方面着手。
浙公网安备 33010602011771号