java第一作业周期(前四周)总结
0.前言
针对第一阶段的作业(共三次)发表总结性的博客,作业在PTA上发布,近一周一次。每次作业在刚发布后即高效快速满分完成,后对第一阶段作业作如下总结:
1.作业过程总结
第1阶段的这三次作业可谓是一个过渡性作业,是从c语言的思想到面向对象的思想的过渡。
第1次作业主要考察条件语句,考察思考问题是否全面,是否将每一种条件均考虑在内。第1次作业涉及5道题,从税率,坐标,字母,几何,代数多方面训练了多角度考虑问题,考虑临界条件等,这也是对c语言的一个回顾,巩固了编程思想。
第2次作业相比第1次的作业的难度上有所增加,在条件语句的基础上增加了简单的循环语句,除一元二次方程外,后三道题以日期类为样本拓展题目,先求判断闰年及星期,后延伸到求一天后再到求n天后,步步提高。
第3次作业更是第2次作业的一次大的转变,先简单的把第2次作业第1道题的一元二次方程,改为面向对象的语句练练手。之后又结合第2次作业的后三道题,以日期类来,结合题目要求设计面向对象的私有过程以及方法,并且考虑边界最大值问题。第3道题和第4道题更是以UML图为要求通过不同的聚合关系,考虑多种设计的可能性,寻找最佳面向对象思想的代码,是一次从面向过程到面向对象的综合提升,面向对象的设计,不仅可以多人,多平台设计,更方便以后进行维护,不仅代码的质量较高,而且效率高,易扩展。
针对三次作业遇到的问题来说的话:在第1次作业中,因为题目相对简单,普遍一次性过,需要尤其注意的是,在计算税率的时候一定要及其细心,因为情况较多,数字较多,也容易计算错误,尤其是在写完之后提交发现有一处答案错误在找bug的过程尤为麻烦,因此需要在写的时候就做好注释以及写代码时习惯良好,可以方便以后查阅维护。在第2次作业中,求一元二次方程,那一道题中需要注意的是,当二次项系数为0的时候,就不是一元二次方程了,所以为避免数据非法,需要特判一下。因为第二次题目相对简单,所以在之后几道题中只要控制好判断条件即可。第3次作业可谓是面向对象设计的一次大的提升,在作业过程中遇到的问题及解决方法可谓是受益良多,首先在第2道日期类设计时,需要根据题目的要求设计代码,这些方法的时候要注意方法的,返回类型以及参数类型
要返回对应的类型,如果没有对应类型,需要new一个新的空间,在计算过程中,由于类的成员变量都是private私有化,所以,如果直接使用year,month,day的话,则会导致最后的,结果不会变因为,中间的计算过程数值没有发生变化。要改变这种现状,需要用date.setYear(),date.getYear(),由于变量私有化,所以需要用set来赋相应值,用get来获取相应值。另外一个需要注意的问题是,在求取后n天和前n天时,要防止数据溢出,即避免在取整数int类型最大值 2147483647时,计算机读取的数值变为 -2147483647。因此经过调试后有两种解决办法,第1种是通过特判大于int类型最大值时的情况,单独进行运算,另一种则是通过改为long类型,使可运算范围增大。另外在PTA提交时需要避免代码运行超时的情况,则需要合理设计算法,比如简化代码,强化思想,比如计算两个日期相差的天数,可单独写一个范围外较近的特定日期,将两个日期分别减去特定日期,之后两个日期相减即可得到相差天数,代码简洁,执行效率高。

又比如在计算n天前时,有按天循环,按月循环,按年循环等多种设计方式,我则用提前打好的二维数组表,存储闰年和平年的月份中的天数,再加以按月循环即可简单实现计算n天前,又能控制在较短时间内运算完成,核心代码仅需五行


在第3次作业后两道题中,是由于聚合度的不同,产生不同代码的设计方式,这样做会增加以后写的便利性,中间的过程也是思考了许久。
最后针对这三次作业,做一些总结的话,可能是在ACM中训练一年多产生的成效,感觉三次作业在逻辑上和算法上普遍偏简单,多数代码一次性过,每次作业花费的时间差不多两三个小时,但是就面向对象的思想以及代码来说的话,还是有一定进步,因为面向对象整体的设计优势较大,其本质是以建立模型体现出来的抽象思维的过程和面向对象的方法。由于其继承,封装,多态的特性,自然可设计出高内聚,低耦合的系统结构,使得系统更加灵活,更容易扩展,也方便维护,成本较低。
2.OO设计心得
面向过程与面向对象总的来说各有优劣,即
面向过程优点:性能要比面向对象高,因为类调用时需要实例化,更消耗空间;比如单片机、嵌入式开发等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象容易维护、多次使用、扩展
面向对象优点:容易维护、多次使用、扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程低
综合前三次作业的心得和老师课堂上所讲内容,以及之前自学的Java内容,增加感悟后可总结出目前遇到的题目所采用的面向对象设计的基本原则为:1. 单一职责原则(每一个类应该专注于做一件事情),2.尽量少的耦合原则(一个类的实体应当尽可能少的与其他实体发生相互关联)3.公私有原则(属性私有,方法公有,也可灵活设置)4.聚合原则( 一个类中有另一个类的对象,类与类之间关系多重)
编程思维的理解:
编程思维并不是编写程序的技巧,而是一种高效解决问题的思维方式。编写一个计算机程序就像解决生活中的问题,本质上都具有某些相同或者至少相似的逻辑。编程过程中所涉及到的思维方法可大体归纳为 “提出问题——理解问题——分析问题——解决问题”的过程。具体可包括逻辑构建,拆解,批判性和全方位考虑等。
3.测试的理解与实践
我们对于不知道的东西,很容易形成自己的主观臆断,如果只是满足题目所给的测试样例,进行一下简单的测试,功能正常就可以了,但是我们不能100% 的确定代码质量,每次提交代码,都会有可能造成错误,所以应进行充分的测试。当然,这个充分是自己以为的以及环境允许的充分,因为很多环境都不在了,不能保证改动的每个地方都能被测试到。所以,只要提交代码,就有犯错的可能。测试往往是一个整体的过程,需要整体的设计与规划,不应该想到什么就做什么,所以测试对于编码质量尤为重要。
如果我去想测试方法,测试用例,我会对于错误的处理一系列完善的措施,首先验证基本功能是否都被实现,然后针对时间和空间是否去优化,罗列的各项功能、性能指标,来构造测试用例的输入数据,充分考虑测试数据覆盖的范围以及边界(最大与最小),正负以及特殊值(0、特殊点等),格式等。
4.课程收获
总结的话,可分为以下几点:
1.这三次作业可谓是一个过渡性作业,是从面向过程的思想到面向对象的思想的过渡,开始训练多角度考虑问题,考虑临界条件等,是对c语言的一个回顾,巩固了编程思想。
2.是一次从面向过程到面向对象的综合提升,面向对象的设计,不仅可以多人,多平台设计,更方便以后进行维护,不仅代码的质量较高,而且效率高,易扩展。
3.面向对象整体的设计优势较大,其本质是以建立模型体现出来的抽象思维的过程和面向对象的方法。由于其继承,封装,多态的特性,自然可设计出高内聚,低耦合的系统结构,使得系统更加灵活,更容易扩展,也方便维护,成本较低。
4.在面向对象设计阶段,需要对每个类进行详细设计,补全分析过程中遗漏的属性,并确定每个属性的数据类型,指定每个属性的可见性。
5.getXX()方法和setXX()方法能为属性添加存取时的控制,又能屏蔽属性的许多细节,减少其他不可知因素的改变对程序的影响。因此,除了比较简单且不常发生变化的属性可以直接公有外,其他属性最好都能用getXX方法和setXX方法访问方法封装一下。另外类的属性和关系尽量在UML类图上合理设计,进行尽可能合理的相互转化。
5.对课程的建议
面向对象程序设计的课程,主要就是在面向对象的思想下,进行大量的编程练习,我认为扩大代码量,才能进一步提高,才能熟练面向对象代码的运用。但针对一些选择题,判断题,或者对实际用处不大,很偏的知识点的测试题则没有必要练习。
6.之后一个阶段的计划
下一个阶段的作业就是大作业了,大作业是面向对象思想的全面提高,就我而言的话,我觉得更需要训练的是代码的设计思维,如何分配规划类,如何处理类与类之间的关系,如何更方便之后进行维护和扩展,因此我需要在思考上下功夫,再代码上出成果,多尝试多优化,尽量使代码更合理,更加实用化。

浙公网安备 33010602011771号