oop1到3次作业总结

发布时间 2023-03-25 13:52:36作者: 22201135-余耀

1.前言:第一次作业主要设计了各类知识点,例如:整形数据和浮点型数据,运用if条件语句,for循环的运用,运用Scanner类从键盘输出字符串和整形以及浮点型数据,数据类型的强制转换,字符串的拼接等等,题量感觉比较大,而且第一次很多知识点才刚学,感觉难度挺大的。第二次作业题量没有第一次作业大,但是难度略有增加,第二次作业主要是强化if条件语句的选择,每道题都是通过选择来输出语句完成要求,但是从第一道题的直接输出,到筛选两个条件,最后再从多个条件中筛选出所需要的条件,从而去达到输出的效果。第三次作业主要是关于类的使用,类中有属性和行为,一个类中可以有多个属性和行为,难度也是逐渐递增,先是类中只需要几个函数来完成题目,之后的题目需要用到多个行为,并且多个方法需要在主方法反复调用,多个调用才能正确的实现功能。并最后两道题和第二次作业最后一题相似,第三次作业的第三题是用类的行为当做函数使用,并非直接调用,第四题在第三条的条件上增加难度,从求下一天变成了求下n天,求前n天,以及求两个日期相差的天数。并且使用的行为也增加了很多,并且难度也是加大,需要通过数学逻辑思维能力来解决这个问题。我感觉前三次作业的难度都还算适中,花上几天时间去学习还是能够完成的,但是题量我认为还算比较大的,并且每次题目的难度都明显都在提升,特别是第三次作业的最后一题,我写了将近300行的代码,虽然这确实是和我的能力有限有关,但确实感觉这些题目的难度逐渐在提高,不仅在语法上需要学习比较长的时间,还思维逻辑的严谨上也需要花费一定的时间,再去通过不断的编码尝试,最终只能完成一个能够跑完所有测试点的半成品。

 

2.设计与分析:

7-3 定义日期类

 

 

 

 从图中明显可以看出这个程序我写了127行代码和89个句子,通过看类图可以发现,必须定义多个行为,包括最基础的Set和Get类型的行为。其中Date类型是第一次在作业中有体现,同时也在作业中实现了无参数构造类方法和有参数构造类方法。Date类型的返回值也和其他方法有所不同。求下一天主要还是需要考虑特殊情况,首先我们知道每个月的最后一天的下一天是第一个月的第一天,其次还要注意的情况就应该是闰年的时候。但在这道题中,我没有将常数赋值给数组,反复的通过if条件语句以及月和闰年的限制实现了最基本的功能,但是现在通过分析可以发现,其实有很多步骤可以优化,用数组可以将所有的月的最大天数存储,只需要几十行代码就可以实现现在的四十甚至五十几行代码。

 

 从环形图可以更直观的体现出我的类方法构造还是有问题,没有较好的做到单一原则,方法较为复杂,代码过长且一个方法实现了多个功能,这样不符合我们的编码规范。在之后的作业中我要有意思的去注意这方面,尽量慢慢做到简化代码,让每一个代码拥有不同的功能,以及一个方法只能实现一个功能,

接下来就是难度激增的第四题

 

 

 

 

 

 从代码量就可以看出这道题相比第三题增加了不少需求,这个代码的复杂程度很高,但是因为现在我的能力有限,只能通过一些重复无用的操作来实现所需要的功能。最复杂的方法应该就是求两天相差的天数的方法了,这个函数我只想到了最笨的办法,如果两个都用动态的去加减天数,我认为这个过程在编写代码的时候很可能会出错,如果定死一个日期,算这两个日期的差值也比较复杂,需要算他们相差的天数,还需要算相差了几年,这几年是否是闰年。所有我将他们都回归到一个固定的时间,算这两个日期和这个固定时间的差值。再用这两个差值相减就能取得所需的天数。这个方法我认为确实复杂,从图表中也能体现,因为它重复使用了很多操作,但是我认为这个思维逻辑没有太大的问题,只是需要在这个基础上优化代码。因为这道题相比上一道题,多了好几个数据都超出了阈值,这对于我们以后就业编写代码是非常不好的,这个意识我也正在慢慢的加强,但是改正我可能需要先加强最基础的语法,搞懂了这些方法存在的意义,他们适用在什么类型,这样我认为我才能提高编码的速度、能力、和质量。

综合以上两道题,我明显的感觉出了自己的问题,首先最重要的就是最大的复杂度。在一个方法里多次调用了for循环if语句还有&&和||这些条件语句,这些语句都是组成复杂度的一部分,在以后的实验里我会在完成代码的同时有意的控制缩减使用,减少最大的复杂程度。完成之后再使用Source Monitor去分析每一道题,去在之后通过反复的学习去优化代码。其次,就是代码深度的问题,函数深度是能够体现代码是否能够迅速读懂的一个标志,说明我这道题目的代码还是写的比较绕了,思路还是存在着许多的问题需要去改正。

 

3.踩坑心得:第二次作业判断三角形类型,第一次错误在没有正确判断三角形的类型,从三角形特有的到普通的依次输出才能正确运行,对于最特殊的直角三角形,我们能够知道直角边就是为其他边的根号2倍,但是Java中没有根号运算符,只能使用近似计算来判断,不然不能正确运行结果。在定义日期类中,一开始并为使用数组,用原本的year,month,day在主方法中改值,然后再在输出语句中调用可能会报错,可能是因为没有正确赋予值。之后通过重新用另外一个值来读取year,month,day的数据。然后对于日期类的作业,难度明显有递增。本来求第一天,只需要用数组记录每个月的最大天数,然后考虑特殊情况。但是求下n天难度感觉明显不同,我首先的思想是用月的最大天数作为分水岭,只要n大于月的最大天数,我就把它删除这个天数,然后把月往下加一,之后编着发现感觉很难用脑子想明白去,就很难用代码去实现,只能用最笨的方法去编写,将求下n天改为求n次下一天。然后求前n天也使用了相同的办法,只是把特殊情况改变了,其它的好像和求下n天的方法差不多。

 

 

 

 

这部分截取了部分代码,有些时候要灵活运用所学的知识,第一张图是求下一天的函数,第二张图是求下n天的函数,明显是第二个函数比较复杂,但是我第一个函数的代码量远比第二个函数长,这就是明显在做无用功,虽然之后改正了,但是下次如果遇到需要多次判断相同的常量,就可以通过把常量放入数组中的方法来实现代码的简化。 

 

4.改进建议:第三次作业的第四题行为过多,大部分都能够通过看方法名了解这个方法能够发挥什么作用,但是有些类感觉很难去能够运用,例如public boolean compareDates(DateUtil date),虽然给了注释是比较两个日期的大小,但是返回值是布尔类型,并不知道这个方法放在主程序中能够怎么体现出功能,以及判断之后的程序内容。我认为对于这种功能使用较为模糊的方法可以适当给出几行代码来引导使用。

 

5.总结:在三次作业中,我学习到了Java中各个数据类型,数组的定义,if语句的使用,学习了Date类和类的定义,能够正确运用类的属性和行为,对于类中多个方法并不能很好的明确每个方法特定特有的功能,类中的方法在主方法的调用还存在不足,我还需要学习Java中最基本的定义,很多类型的基本定义感觉基础概念掌握的还不是很好,对于这些方法的调用对于基础的定义还有待加强,对于很多方法,感觉还是最根本的定义不太了解,很多东西感觉明显不能像c语言一样用,有些程序正常像c一样用是没有问题的,可是也有一部分如果用c语言的办法却会直接报错。对于Java很多东西我都是初学者,但是老师应该都学完了,对于这些不同点,我觉得老师可以在上课的时候适当提点,不然我认为书上的概念感觉很少设计这方面,只看网课感觉也很难学会这么多东西,这些东西感觉很难找到途径去学习。我明显感觉在语法上还有很多不足需要去弥补,通过也需要去培养一种简化代码的思维,提高自己的效率,花费更少的时间做更多的事,然后就是需要不断学习新的语法,现在明显感觉时间不太够用了,在之后的作业里如果还需要一边学习一边编码的话可能会越来越吃力。