前言:本篇博客主要是是对这学期Java的所有作业的总结,以及自己在学习Java过程中的心得与体会,对面向对象三大支柱的理解(封装,继承,多态),对于这门课程的收获以及建议。

作业总结过程第一阶段的作业主要是对编程基础知识的了解以及用,考察的内容主要是循环,条件语句以及基础内容的考察,也适当的考查了对编程内容严谨性的考察,第一次作业中的对直角三角行的判断,如果仅从数学的角度判断就会出现错误。对于整数型直角三角行可以正确通过,但是对于非整数型就会出现错误。对于无理数计算机的存储空间有限,此时不会有严格意义上的等号,只能进行误差判断。参考代码如下:

else if((a==b&&(2*Math.pow(a, 2)-Math.pow(c, 2))<1e-6)||(a==c&&(2*Math.pow(a, 2)-Math.pow(b,2))<1e-6)||(c==a&&(2*Math.pow(b, 2)- Math.pow(a, 2))<1e-6))                
                    {                                        
                            System.out.print("Isosceles right-angled triangle");                                                            
                    }

第一阶段的第二次作业主要考察的是闰年以及时间的判断与计算,主要考察编程的严谨性以及对编程的基本结构掌握的熟练程度,题目具有连续性,第一阶段第三次作业考察的具体类的设计,涉及到的内容比前两次也教复杂,由于前期没有对代码进行很好的设计,导致后来计算前N天的代码较为复杂,后期的修修补补使得代码没有很好的复用性,第二阶段的作业主要考察的是Java 面向对象编程的设计与思想了,其中水文数据校验及处理的题目难度较大,对于初学者来讲,掌握正则表达式需要花费一定的时间以及精力,其中对于字符串的切割和对年份的判断等都需要花费大量的时间以及精力;

用正则表达式验证日期的难点有二:一是大小月份的天数不同,二是闰年的考虑。
对于第一个难点,我们首先不考虑闰年,假设2月份都是28天,这样,月份和日期可以分成三种情况
1、月份为1, 3, 5, 7, 8, 10, 12,天数范围为 01 - 31,匹配MM-DD的正则表达式为:(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])
2、月份为4, 6, 9, 11,天数范围为 01-30,匹配MM-DD的正则表达式为:
(0[469]|11)-(0[1-9]|[12][0-9]|30
3、月份为2,考虑平年情况,匹配MM-DD的正则表达式为:02-(0[1-9]|[1][0-9]|2[0-8根据上面的成果,我们可以得到匹配平年日期格式为YYYY-MM-DD的正则表达式
([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))
接着我们来解决第二个难点:闰年的考虑。根据闰年的定义,我们可以将闰年分为两类
1、能被4整除但不能被100整除的年份。寻找后两位的变化规律,可以很快得到下面的正则匹配([0-9]{2})(0[48]|[2468][048]|[13579][26])

附上正则表达式中关于年份的判断:

YYYY-MM-DD的正则表达式为

(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)
DD/MM/YYYY格式的正则验证表达式为:(((0[1-9]|[12][0-9]|3[01])/((0[13578]|1[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])/(02))/([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}))|(29/02/(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)))

关于圆形继承题目较为简单,主要考察的是类的继承以及类的复用等。第三阶段的作业主要是对编程思想以及简单的数据结构的考察,考察了开闭原则

开闭原则(OCP)是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段。

开闭原则的定义: 一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。

遵循开闭原则设计出的模块具有两个主要特征:

(1)对于扩展是开放的(Open for extension)。这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。

(2)对于修改是关闭的(Closed for modification)。对模块行为进行扩展时,不必改动模块的源代码,能够很好的保证之前的测试,不会应为改动代码而出现新的bug.

开闭原则的定义已经明确地告诉我们,软件实体应该对扩展开放,对修改关闭,其信念是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实

 

花费的时间比例约为1:3:10,通过这学期的作业能够很好的锻炼编程的严谨性。

OO设计心得:面向对象不需要太多的技巧性,而面向过程则需要较强的技巧性,面向对象能实现代码很好的复用性,当是在某些场合下又会下显得较为啰嗦,面向对象的三大支柱,继承,封装,范式,是其实现面向对象的基石,所以我们在学习中要深刻的理解,才能为自己今后的编程带来一定的益处。

课程的收获与建议:这学期的Java课程就快结束了,虽然作业不多,当时花费时间多,每次的作业都要花费大量的时间以及精力来进行学习,可能是由于疫情的原因,上网课的学习效果并不是很好,这学期的重要的课程也比较多,也可能花费在这么课上的时间并不是很多,作业做的不是很理想,当时通过这学期的学习也了解了自身的差距以及不足,后期会再次花费时间来弥补的,我觉得通过这门课程得学习然我加深了对自己所学专业的理解,也在一定程度上加强了自己编程得能力,课前一定要做到很好得预习,课后也一定要做到很好的复习。这样有利于加强对知识得巩固。希望老师能够提前布置一些预习做作业以及一些课后习题,不用太难。目的是帮助学生进行很好的预习以及复习,能使学生在最短的时间内消化知识,增强自身的能力等。