OO第一次作业周期(前四周)总结
前言
自从面向对象程序设计开课以来,PTA目前已发布了第一阶段(共三次)作业。
本篇博客主要从 作业过程总结、 OO设计心得、 对测试的理解与实践、 课程收获、 对课程的建议 五个方面来阐述自己对学习面向对象编程的思考与理解。
一、作业过程总结
1.1三次作业之间的知识迭代关系
第一次作业 主要考察的是我们对OS编程基础语法的掌握,如:
主方法入口:所有的 Java 程序由 public static void main(String []args) 方法开始执行。
类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。
方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
源文件名:源文件名必须和类名相同。当保存文件的时候,应该使用类名作为文件名保存,文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错误)。
因为我们本身具备C语言的基础,第一次作业考察的只是我们对Java基础语法的掌握,可以说是从C语言到Java的过渡;
再运用C语言编程思维来构写代码,第一次作业并不难完成,大家基本都是以花费时间短,代码报错率低,程序运行成功而完结。这也在一定程度上增加了我对OS编程学习的信心。
第二次作业

不难看出,每道题都对输入和输出格式有了严格要求,并且Main类里都有实现特定功能的各种方法(与C语言中的函数类似)。
从题目本身来,主要是对我们面向过程的考察, 2,3,4题的测试点繁多,基本上所有特殊的时间节点都要考虑进来,需要细心和耐心。
对比:第二次作业的难度和代码量比第一次作业要大,并且需要较强的逻辑思维和判断能力。
第三次作业 是建立在第二次作业的基础上的,体现了极强的面向对象思想。
第一二题考察的是类设计;三四题考察的是聚合(根据UML类图来写类和方法),并且所有题目的主方法都已给出。
对比:第二次作业实现了从面向过程到面向对象的过渡。
总的来说,第一阶段的三次作业难度是逐步上升的,相应的代码量也越来越大,越来越能体现面向对象的精髓。
1.2 如何实现从面向过程到面向对象的过渡
面向过程:是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后在使用的时候一一调用则可。
面向对象:是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为。
可以说,面向过程是如何使用函数去实现既定的功能,而面向对象是如何把相关的功能,包括函数和数据有组织地捆绑到一个对象身上。
1.3 作业过程中遇到的问题及解决办法
第一次作无太大问题。
第二次作业羞愧的是忘记了如何判断平年和闰年了,不过这随便百度一下就很快知道了。主要问题在于平年和闰年的特殊时间点的考虑,比如2月的最后一天,3月的前n天,12月的后n天等等这些。
第三次作业中遇到的最大问题是如何根据UML类图来写类方法,每个类之间又通过get和set方法聚合有关联。刚开始我没有思路,于是在CSDN上搜寻了一些含有UML图的代码,然后就依葫芦画瓢自己根据UML图写代码,过程虽有些曲折但还是成功了。
1.4 作业花费时间比例
第一次作业较为简单,花费了两个小时而且基本不用调试;
第二次作业难度有所上升,花费了两个晚上;
第三次作业综合性强,我花了足足有四个晚上且不断的调试才完成。
1.5 对编程严谨性的认识与教训
我在日常敲代码中,发现 有一处令人混淆的地方, 就是求String和Array的方式是不同的,即length后是否要加一对小括号()。这是因为在数组中有属性length可以记录数组对象的长度,而length()方法是String类中的一个实例方法。
(1)对于Array, length是一个数据成员
a = new int [100]; a.length; (2)对于String, length是方法 String a = "abcde"; a.length();
而且,字符串和字符串数组都是不需要结束符‘\0’的。
如:
char[] value={'j','a','v','a'};
String s1=new String(value);
String s2="java";
int a=value.length;
int b=s1.length();
int c=s2.length();
运行得到的结果a,b,c都是4,说明字符串和字符串数组都不需要结束符。
所以我们不能用C语言的代码规范来写Java,两者要注意区别和积累。
二、OO设计心得
面向过程vs面向对象
面向过程编程是一种非常具体,要面面俱到的的编程方式。而面向对象是以对象为单位来进行编程,比较像正常人的思维。
下面我们举个例子,比如开车、加速、减速、刹车。
用面向过程来说就是你要先有一个车,然后这四个分别是4件事,也就是说你要写4个函数,分别是开车、加速、减速、刹车,这分别是四个事件,如果使用的话要调用4个函数。
但是对于面向对象的编程来说,我们关心的是车这个类,而不是开车、加速、减速和刹车这四个过程。这4个过程是车这个类的一部分,只是其中的一种行为,而且对于行为的顺序没有强制要求。
---------------------
两种思想的对比:
面向过程是具体的东西,而且面向过程是面向对象的基础。面向对象可以说是面向过程的抽象,比如汽车有开车,加减速和刹车,关于汽车的操作有好多,每一个都需要一个具体的过程来实现,把这些过程抽象的总结起来就可以形成一个类,这个类包括的汽车所有的东西,所有的操作。
总结来说就是,面向过程是一种基础的方法,它考虑的是实际的实现,一般情况下,面向过程是自顶向下逐步求精,其最重要的是模块化的思想方法。因此在模块化编程的时候才会有“低耦合,高内聚”的思想来提高效率。面向对象的方法主要是把事物给对象化,包括其属性和行为。当程序较小的时候,面向过程就会体现出一种优势,其程序流程十分清楚。但是,面向对象编程更贴近实际生活的思想。
面向过程是具体化的,流程化的。解决一个问题,需要一步一步分析需要怎样,然后需要怎样,一步一步实现的。面向对象是模型化的,抽象出一个类,这是一个封闭的环境,在这个环境中有数据有解决问题的方法,你如果需要什么功能直接使用就可以了,至于是怎么实现的,你不用知道。
从代码层面来看,面向对象和面向过程的主要区别就是数据是单独存储还是与操作存储在一起。在类的里边,实现具体的功能还是需要流程化、具体化的代码去实现的,在类里还是需要具体的算法来实现的。总结来说面向对象的底层还是面向过程,面向过程抽象成类,然后封装,方便使用就是面向对象。
三、对测试的理解与实践
每个程序员的代码从来都不会报错吗?当然,这是一种理想情况。大部分情况是我们已经编写了实现代码,需要对已有的代码进行Junit测试。使用JUnit编写单元测试的好处在于,我们可以非常简单地组织测试代码,并随时运行它们,JUnit就会给出成功的测试和失败的测试,还可以生成测试报告,不仅包含测试的成功率,还可以统计测试的代码覆盖率,即被测试的代码本身有多少经过了测试。对于高质量的代码来说,测试覆盖率应该在80%以上。使用JUnit进行单元测试,我们可以使用断言(Assertion)来测试期望结果,可以方便地组织和运行测试,并方便地查看测试结果。此外,JUnit既可以直接在IDE中运行,也可以方便地集成到Maven这些自动化工具中运行。
大致步骤:
1> 扩展TestCase类;
2> 覆盖runTest()方法(可选);
3> 写一些testXXXXX()方法;
四、课程收获
大学接触的第一门编程的语言是C语言,熬过了学习基础部分,后面的程序都很好理解,一个c程序就好像在描述一件事情,这件事情包含了起因、经过和结果。平常做一些课后习题,诸如转换数组之类的,逻辑清晰了,敲起代码来便不会有太大的问题。可是当学期末做c语言课程设计时,当时是做一个学生成绩管理系统,我先是对学生成绩做增删查改,当然,静态的,需要用户输入成绩,退出时数据就没了。这样的代码已经很多了,当时记得是1000多行。后来,要加上登录功能,再后来加上权限功能。代码就变得不堪入目,只知道管理很难,因为变量都要在开头声明好,后面使用容易忘记。
一直到等我现在学到java,才知道c是一种面向过程的语言,它会完整的表现一件事物,根据每个不可再分的细节,写一句代码。也就是说,我需要很详细的通过c告诉计算机要干什么。我拿到一个功能需求时,便从头开始做了。可是java不是,java是一个面向对象的语言,什么是面向对象。我现在的理解是分类!把世界的每个事物归类,描述一件事情时,不再是详细的不可再分的细节组成的,而是由若干个包含一些细节的有机体组成的。重心是放在描述的事物上面,而描述的动作是谁发出的?是人!面向对象其实对面向人的思维和思考方式。这点在马克思主义理论里面关于世界的物质性原理可以简单的归纳为:意识对物质有反作用。
1.所有东西都是物质:世界的物质性
2.程序是一大堆对象的组合,对象之间通过传递消息知道自己要做什么:大脑和手的消息传递
3.每个对象都有自己的空间:大脑就是用来存放信息的
4.每个对象都是一种类型:左手右手属于手,左半脑右半脑属于脑
5.同一类的所有对象都可以接受相同的消息:左手能干的事右手也能干嘛
五、对课程的建议
虽然刚开始学习Java,但我感觉自己的编程能力水平与其他部分同学相差一大截。因为特殊时期大家都在家里上网课,老师也在思考新颖的教学方式如何才能发挥出最好的效果。基础知识永远都是编程的开始,最应该注意的就是不能只看书而不动手实践,这是没有实际作用的,动手才是重中之重以前总认为看过知识点之后,看过代码案列之后觉得自己懂了,但是动手实践之后就不知道到怎么下手,犹豫,这就是代码敲的少了。不管是学习什么编程语言,实践必不可少。其次就是要看一些优秀的代码,总结别人代码的优点,学习方法和代码风格。总结为一句话来说,就是动手动脑动眼睛。平常多积累格各种知识,总会有遇到的时候,遇到的时候要能够反映出来,这是什么意思,是什么,这也很重要。还有就是要了解目前最新技术,方法,这也对学习语言十分重要的。虚心学习虚心请教,勤学苦练,才能做一名合格的程序员。
浙公网安备 33010602011771号