第二次作业总结

一、 作业总结

经过了一半个学期的面向对象程序设计的学习,我对java有了一点点自己的认知,也算是可以独立完成一些简单的面向对象程序设计了。

这也是我第二次写博客了,相较于上次第一次做博客,这次我会写的更加详实一些,一点点进步。一位同校同专业已经毕业的学长告诉我写博客还是很有用的,算是对自己平时作业的一种总结,而且在今后的求职路上也会有帮助。

前言:

   这三次题目相较于前三次的题目难度有了明显的提升,尤其是第四次作业的水文数据校验及处理和第五次作业的统计Java程序中关键词的出现次数这两道题目确实较难,不过好在老师在进行了一次问卷调查之后也体会到了我们可能做这一类的题目可能确实有一定难度,所以个人感觉题目的难度在逐渐下降。

   关于题量,我觉的题量还算比较适中,有难题的时候题量就会稍微偏少一些,反之题量就会多一些。个人感觉就算题量少了但是遇到那种没有头绪的难题有足够多的时间还是不会做,反倒是题量比较大但是难度不会很高的题目可以在重复中锻炼我们敲代码的技术和熟练度,个人建议可以多布置一些难度不会太高但是题量到位的作业。

   这三次作业主要是学习和熟悉了Java中的继承、多态、封装、接口等等知识。于我来说最大的体会就是进一步的体会到了Java面向对象这一特征,可以通过继承、多态来在几乎不改动原有代码的基础上加上新功能,满足客户的需求,大大提高了改写的效率。

(1)、第四次作业

   第一次作业只有三个题目,我认为主要是因为第一个题目:水文数据校验及处理。刚刚看到这个题目的时候,我就有些绝望了,第一次题目都没怎么看懂,索性先从最后做起,发现题目难度是递减的,写完第二题的时候,时间已经不剩多少了,通过第二题我学会了参考类图来写代码的方法,开始尝试做这个题目的大体框架,框架写了一部分,再加上正则表达式的不熟悉,最后在报错中到了截止时间。

   第二题的话说实话一开始我觉得我不会用很长时间的,毕竟之前做过类似的题目,但事实并没有我想象的那么简单,尤其是这种多层的聚合,用的还是私有属性,在调用数据的时候往往要调用好几层(对比后面的另一个聚会,等下会详细讲)显得有些繁杂了。但只要理清楚关系,明确哪里要调用哪个值的话,想要做出这道题目并不是很难。我主要想讲讲关于那个求两天之间天数的函数,我的思路是将两个日期转化成一共有多少天,最后用两个天数求差即可。(难点主要在闰年和2月的判断上)

类图:

 

报表:

 

   第三题的话比较简单,简单来说就是圆、球、矩形、立方体的面积和体积的计算,通过继承同一个shap类改写其中的方法实现,还算比较简单的一题。

类图:

 

报表:

 

(2)、第五次作业

   第五次作业的前三题一看就友好了很多,比较难的是第四题,主要是复杂的正则表达式的检测,第五题跟第四次作业的第二题大同小异,具体对比分析等下我会详细讲。

第一题是找出最长的单词,我认为主要是要我们学习x.legth();这个函数来获取一个字符串的长度,以及让我们学会如何用限定条件来分割字符串。(前三题在我看来都比较简单,这里就不做类图和报表了)。

   第二题是合并两个数组为新的有序数组,题目简单,思路清晰:新建一个数组储存两个数组后排序输出即可。

   第三题是对整型数据排序,很基础,但是那个时候确实只记得一个冒泡排序,所以就查了些资料,复习了下插入排序和选择排序。

   第四题是我最后做的,当时对正则表达式不熟悉,一上来就写了一堆格式错误的正则表达式,报错了也不知道从何改起,最后代码没敲出来,倒是在网上学了不少关于正则表达式的知识(顺便一提,菜鸟的正则表达式检测网站很方便,直接输入正则表达式就能帮你检测,还能自动生成代码)。

   第五题也是关于日期问题的聚合,开始我想直接改之前的代码,但是改了一部分就有好多地方报错,于是我决定重写,重写框架,并且选择性的粘贴一部分代码,效率实在是高出不少,这让我明白了:有些情况下改写代码可能比重写更复杂。

类图:

 

报表:

 

(3)、第六次作业

   这次作业整体上难度不高,一共有六题,我认为是比较适合的,只要愿意花时间,想要拿满分还是可以的(这是我比较理想的题目难度和题量)。前四题都是关于正则表达式的题目(这种难度逐渐提升的题目能让你确确实实的感受到自己的进步,我觉得挺好),第五题可以说是复习一下继承和多态吧,第六题则是一个接口的学习。

   第一题式QQ号检验,只要限定输入的长度:5-15位,输入内容:0不能开头、必须是数字即可,正好用上了上一次作业在网上学到的一些比较基础的正则表达式的知识。第二题输入字符串并排序,这里我试着直接用了x.sort(cahrs);直接排序。第三题就是检验验证码,一个简单的正则表达式([A-Z]|[a-z]|\\d){4}就行了。第四题是学号校验,稍微复杂一点点,但说到底还是一个正则表达式的事儿,这里前四题就不做类图和报表了。

   第五题跟第四次作业的第三题也差不多,先输入要创建的圆、矩形、三角形的数量,然后求出分别的面积和和总共的面积和,最后输出即可,也是通过继承同一个shape父类再改写方法实现。

类图:

 

报表:

 

第六题是实现接口和多态性,圆类和矩形类继承一个无属性的GetArea接口,返回面积。因为这题可能不是很复杂,所以我觉得这里的接口和继承没有太大区别,甚至有一些麻烦了,但是我相信当代码复杂程度变高的时候,肯定可以大大降低改写代码的难度。

类图:

 

报表:

 

二、 设计与分析

(1)、题目集4(7-2)和题目集5(7-5)对比分析

   题目集4(7-2)和题目集5(7-5)本质上解决的是同一个问题,基本的方法也没改变,主要是最初结构或者说是框架构建的不同。下面我将对两个的报表进行分析:

 

可以非常直观的看出在代码差不多的行数、分支、类、方法 等等条件下,使用多重聚合的调用次数和复杂程度明显变多了。

通过这里的对比,我算是对在完成一个程序之前的框架构建工作有了更深的思考:在完成一个程序之前,就应该将它的大致框架构思好,最好能画出相应的类图再敲代码,这样不仅能让你敲代码时的思路更清晰,而且可以在写代码的时候减少工作量,提高代码的运行效率。

(2)、题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)

题目集4(7-3)主要思路如下:

先创建一个shape类,然后一个圆类和矩形类都继承shape,球和立方体类分别继承自圆和矩形。shape类中有一个返回面积的方法,圆有半径和改写过的返回面积的方法,矩形有长和宽和改写过的返回面积的方法,球和立方体有返回体积的方法,立方体还有一个高属性。

类图:

 

报表:

 

题目集6(7-5)主要思路如下:

   先创建一个shape类,圆、矩形、三角形继承自shape。shape中有返回面积、判断输入是否合法的抽象方法,圆有半径和改写过的返回面积的方法和改写过的判断输入是否合法的方法,矩形有长和宽和改写过的返回面积的方法和改写过的判断输入是否合法的方法,三角形有三条边和改写过的返回面积的方法和改写过的判断输入是否合法的方法。

类图:

 

报表:

 

题目集6(7-6)主要思路如下:

创建GetArea接口,用圆类和矩形类实现接口。GetArea中有一个返回面积的抽象方法,圆有半径和改写过的返回面积的方法,矩形有长和宽和改写过的返回面积的方法。

类图:

 

报表:

 

(3)、对三次题目集中用到的正则表达式技术的分析总结

   正则表达式我也了解的不够深入,但是有一个印象最深的一点就是如果你想要判断一个两位数的范围的时候,不能用[xx-xx]一定要将两位数字分开判断,有特殊情况再分类写,比如我用于判断学号的正则表达式:

2020((1[1-7])|61|71|72|73|81|82)(([1-3][0-9])|40)|(0[1-9])这里就用了很多用“|”分开的情况。

还有就是要熟悉并掌握()的使用,()可以让一部分内容看成一部分,再穿插“|”使用,就可以讨论多种情况。

(4)、题目集5(7-4)中Java集合框架应用的分析总结

老实说这题真的挺难的,再加上写题目集5(7-5)用了不少时间,最后只写出了输入的部分。但是我有思路:先用一个字符串储存输入内容,然后删除字符串和注释里的内容,检测关键字,最后统计次数排序输出即可。但是空有思路却实现不了,说到底还是技术不够,这种感觉真的很难受,所以还是要打好基础,提高写代码的效率。

三、 踩坑心得

通过这几次作业,我对封装、继承、多态、接口等概念有了一定的认知,也能用它们写一些简单的程序。

这次也谈不上什么踩坑,其实有几题不会就是不会,会做的思路出来再适当修改一下就行了,说到底还是技术不到家。下面我将逐题分析我在每题遇到的一些问题及解决方法。

第四次作业:

第一题水文数据校验及处理,没什么可以说的,就一个字,难。虽然没写很久,但是如果时间充裕我也大概率做不出来。

第二题日期问题,难度不是很大,但是很费时间,尤其是多层调用。出现的问题主要是有些地方调用的数据调用错了,调用了上一层的数据,这样不会报错,但是答案就是错的,而且十分难找出这个错误,所以在使用多层的调用关系时一定要思路清晰,弄清楚要调用的究竟是哪一个值。

第三题图形继承问题,我认为本质就是让我们了解一下继承,难度不高,主要理清楚谁是谁的父类,以及需要改写的方法。这题没有什么问题,照着题目要求基本不会错。

第五次作业:

第一题找出最长的单词,没什么问题,只要学会分割字符串,然后用x.length()比较长度即可。

第二题合并两个有序数组为新的有序数组 ,这题也没什么问题,新建一个数组储存两个数组后排序输出就行,之前还做过原题。

第三题排序问题,非常简单,有手就行。

第四题难度突然就上去了,统计Java程序中关键词的出现次数,有思路,但是做不出来。

第五题也是日期类问题,之前想改原先那个多重调用的代码的,但是开始改的时候就开始不停的报错,所以这里建议:对于框架完全不同的代码,重写会比改写效率高。还有就是日期类问题最重要的一个点,就是一定一定要判断闰年和2月,这对日期类问题真的很重要。

第六次作业:

前四题都是有关正则表达式的题目,我就一起说了。这几个题目如果出问题,那么%99都是正则表达式的问题,建议也很简单,就是多去正则表达式的检测网站上检测几遍,顺便找些题目练练手,我目前就总结了两点:

判断一个两位数的范围的时候,不能用[xx-xx],一定要将两位数字分开判断,有特殊情况再分类写

还有就是要熟悉并掌握括号的使用,括号可以让一部分内容看成一部分,再穿插“|”使用,就可以讨论多种情况。

   第五题和第六题主要是让我们了解抽象类和接口的使用(说实话我现在还没怎么弄清楚抽象类和接口的区别),主要问题就是一些语法上的错误,多看看书,或者去博客上看看大佬的讲解一般都能解决。

四、 改进建议

我认为我的代码整体上没有什么大的毛病,但是细节上还有很多地方要改,比如关于日期问题那求n天前的日期的方法我是日期一天一天减,如果日期变为0就日期变为前一个月的最大天数,然后月份减一,年份同理。最后是有两个点超时,我认为是我的闰年判断在每一次日期减一后就要判断一次,这大大降低了效率,其实闰年判断只要放在年份变化之后即可。还有就是在继承与多态的问题中,要对面积排序后再输出,因为要排序的对象是一个自定义的类,不能用sort方法,所以我重写了一种冒泡排序,但是其实这里是可以改成另一种系统自带的排序方法的。

五、 总结

这三次作业做下来,我充分的了解到了自己还有很多地方要学,还有就是要提高自己敲代码的效率。

总体来说,这几次作业主要学了继承和多态,以及衍生出来的接口,抽象类等等,也许在我们目前的简单的题目中用这些方法可能没有很多提升,甚至还有些麻烦,但是我能体会到当问题变得复杂,需要加入的东西越来越多,我们需要根据需求加入新代码时,使用继承和多态将会大大提升效率。

还有一个收获就是在写程序之前,一定一定要构思好框架,最好画出类图理清关系再写代码,这样真的可以减少你的工作量并且提高代码的运行效率。

六、 工具推荐

1.UML工具

因为我用的是eclipse,所以没有自带的类图的生成插件,这里我推荐PowerDesigner,只需要导入代码就能生成类图,很方便。

2.复杂度分析工具

我推荐SourceMonitor,也是一样,找到源代码导入就能得到数据,而且代码行数、声明、分支、最大复杂度、平均复杂度等等很多数据它都有,很实用。

 

posted @ 2021-05-01 22:05  独孤木公  阅读(62)  评论(0)    收藏  举报