1. 前言
经过三周的时间,第一单元也算告一段落了。总的来说也算是第一次java课程的作业总结。总的来说三次作业难度越来越高,其中也开始需要一些自己不熟悉甚至没有使用过的方法,作业中遇到了多次卡壳,也花费了不少时间。但经过了多次代码修改和调试,作业都还算比较圆满的在规定时间内完成了。
2. 作业过程总结
三次作业在难度上越来越高,所需要用到的方法也是原来越难。
第一次作业在方法的使用上大可以说是最简单的一次,解决第一次作业的五道题基本上都是使用一些以前在C语言作业中所用到的固有方法,都是以一些非常常规的手段比如if...else等条件语句以及一些简单的循环语句,除了输入输出的方法不同,写到内容基本上和以前写C语言代码别无二致,表面上写的java代码,整体上却给人一种换皮C语言的感觉。但是整体上因为条件很多,也需要考虑很多方面,代码也给人一种冗长的感觉。
第二次作业中,开始学着java中对方法体的调用,也开始逐渐看到java与C语言更多的不同。第二次作业同样主要是使用条件语句以及循环语句,但是多引入了对方法体的调用。我本来觉得也会是比较简单的一次作业,但是我在第一题的时候就出了几次错。第一道题是求一个一元二次方程的两个跟,我一开在对方法体如何同时返回两个根上遇到了困难。在经过多次考虑后我发现其实是可以不用返回,而是在方法体中加入输出的方法,解决了这个问题。
第2、3、4题则是分别在同一条件背景下求日期的星期,前n天后n天的日期。在这几个题目中,我学会了同一个类中方法体之间的相互调用,题目变解决了一大半。但是我也注意到,题目不在是简单的考虑几个简简单单的条件,而是需要我们在一个隐含了很多条件的题目中,去发现条件,去考虑的更仔细、全面。例如在计算日期方面就需要考虑平年闰年,每个月之间的天数变化等诸多条件,本次题目将测试点都显示了出来,也算变向简化了题目吧,不然可能需要话更多的经历在密密麻麻的代码中找出那个错误的片段。可以说本次作业让我知道一个小小的错误甚至是一个符号的改变变回事整个代码出错,而且最难的地方在于如何在这茫茫的代码中去找出这个小小的错误,这使我意识到,每一段代码都是不能轻视的,都应该以一种严谨的态度去对待。
第三次作业,可以说是这几次作业中最难的一次了吧,本次作业中需要用到类解的方法。第三次作业的第一题和第二次作业的第一题同样是解一元二次方程,但是后者需要使用类,顿时感觉难度变上升了一个档次。与前两次作业不同,我需要使用的是自己完全没有使用过的方法。当我在写的过程中,我遇到了不少困难,诸如我在某个方法体下我开始在想我该返回什么,这个构造函数我该怎么引用,我开始不断的上网查阅相关的资料,在我解题的过程中我发现我逐渐学会了这种方法。所以在解第二题的时候就感觉稍轻松些了。第二题就是写一个类吧方法全部写到那个类中去,题目变解决了。
但是当我看到3、4题,看到要求的那几幅图的时候,我又懵了。我又一次发现类的调用不是我想的那样简简单单。我看到这个奇奇怪怪的设计类图的时候,我的思绪是很乱的。当我静下心来把设计类以及其中的全部方法都写好后,编译器中还是有许多行标着红叉画着红线,还是感觉挺心累的。继续将代码不断补完整后,思路变的清晰了,我开始尝试从Day类中调用Month类的方法,但是编译器一直都是显示错误。查阅资料,我第一次知道原来.符号可以连续写多个,通过这种方法间接调用其他类中的成员也是可以的,如图中这种toDate.day.month.year.isLeapYear()便可以在Datauntil类中调用Year类。
我在3次作业中花的时间是越来越多的,如果按比例来讲我觉得1、2、3次作业分别对应百分之15,百分之30,百分之55.三次作业中,从声明方法,到调用本类中的方法,在到较为复杂的类与类成员之间的相互调用,我不断的了解,熟悉这些方法的过程中,我能明显感受到自己写代码方面的不足。不够严谨的代码中,一个小小的错误甚至是一个符号的改变变回事整个代码出错,而且最难的地方在于如何在这茫茫的代码中去找出这个小小的错误。这使我意识到,每一段代码都是不能轻视的,都应该以一种严谨的态度去对待。解题的过程中应不断的发掘题目中所隐藏的信息,以及对整个题目涉及的方方面面都要加以考虑,这样写出的代码才是完整的。
3. OO设计心得
①面向过程与面向对象的比较:总体上来说,面向过程与面向对象差别还是很大的。前者解题偏向于一步一步,想一步做一部的感觉,给人一种比较死板的感觉,它注重的是先分析解题的步骤,然后通过方法将其一步一步实现。而后者解题是具体到问题中的对象,通过对象之间的关系对问题有一个大致的框架,然后赋予对象一些属性和方法,再让每个对象去执行,问题便迎刃而解。
②面向对象设计的基本原则理解:我认为前三次作业涉及一下原则:单一职责原则,一个类,最好只做一件事,只有一个引起它的变化。职责过多,可能引起它变化的原因就越多,反而容易因为一个小小的错误导致代码大篇幅的出错。拿第三次作业的讲,不同的类之间执行各自的功能使得代码思路更加清晰,便于排除错误。每个类执行自身对应的功能,相互独立就不会造成相互依赖于影响。依赖倒置原则,就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。依赖会存在于类与类、模块与模块之间。
拿第三次作业第3题来说,Day,Month,Year类间存在着明显的依赖关系,但是在依赖之间定义一个抽象的接口使得只能由Day向Month再向Year的方向进行调用,不可反过来,因此类与类之间的关系不会混乱,从而提高了程序的整体的稳定性。接口隔离原则,使用多个小的专门的接口,而不要使用一个大的总接口。同样拿第四题来说,Day,Month,Year类间都是通过不同的接口与DateUtil产生依赖关系的,但是分开独立的接口是得实现类型并非需要所有的接口定义,从而节省了空间内存提高了运行效率。
③OO编程思维的理解:OO编程思维主要是优先找到问题中的各个对象,确定各个对象之间依赖、继承等关系,从而对问题有一个大致的框架,然后赋予对象一些属性和方法,再让每个对象去执行,从而达到解决问题的效果。
4. 测试的理解与实践
①测试对于编码质量的重要性:测试能够极大的减少代码的错误以及漏洞,同时它还能够提醒写代码的人对运行时间过长冗杂的部分进行方法的改进。只要是提交的代码便会有错误的可能,而测试正是减少这些错误的最好的工具。
②假如让你设计测试用例,你会如何做:我会先进行需求分析,确定需要测试的具体内容,对所有基本数据进行测试,先随机选取非边界值中的几个值,再选取所有边界值进行测试,因为边界值往往是最容易被忽略的地方,从而尽可能的减少漏洞。
5. 课程收获
- 认识代码的严谨性,一整段代码,哪怕有一行有一个代码出了错,都有可能影响一整段代码的正常运行。对每一部分的代码都应该已十分严谨的态度对待。
- 学会利用测试点给予的信息,将代码出现错误的范围缩小,便于迅速找到错误的地方。
- 在解决题目的过程中,我掌握了更多的方法:从声明方法,到调用本类中的方法,在到较为复杂的类与类成员之间的相互调用,在熟悉这些方法的过程中,我能明显感受到自己写代码方面的不足。今后我也应该努力学习java来提高自己的编程水平。
6. 对课程的建议
每个过程的三个阶段要求迭代上升本来是很好的训练方法,可是由于一开始只给出了最简单的需求,往往不能准确猜测后续需求的变更,以致不能设计出很好的架构,往往要在需求变更后对自己的设计进行调整,如果时间不足甚至会放弃重构精致的代码,而是草草加一些新代码满足变更。如果一开始就给出最后的要求作为参考,然后每一阶段实现这个要求的一部分,这样应该对设计帮助更大。
希望老师可以带领我们多多练习,让学生也能看看老师是如何解题的。