20201103-邓彬
题目集四:第一题,水文数据校验,即利用正则表达式进行字符串合法性校验,题目难度较大,加上没有合理安排时间和正确预估难度,导致这题没有写出(遗憾)!第二题为日期问题面向对象设计,难度不大,但由于是在给定类图的基础上进行类设计,代码量有点大,但难度不高。第三题,送分题,pass。
题目集五:前三题送分题,第四题为利用正则表达式对字符串进行校验,难度较高,由于一开始采用的策略不是最佳的,导致有少部分测试点过不了,第五题难度不高,是题目集四的第二题的另一个版本(给定类图不一样),稍微花费点时间就过了。
题目集六:整体难度都不打,都是一些简单的题目,围绕课堂上讲的一些知识点的巩固训练,是三个题目集中最简单的。
三个题目集的难度其实都不算很高,题量也还行,主要涉及的知识点是:java正则表达式的应用,类间设计,以及继承与多态,主要难点还是正则表达式的使用。下面开始逐个对各题目集进行分析。
日期聚合设计优劣比较:题目集四(7-2)与题目集五(7-5)为两种不同的日期类设计,两题目给定的类图不一样,下面给出题目集四的7-2给定类图与我写的代码的类图和题目集五的7-5的给定类图和我代码的类图
题目集四7-2
题目集五7-5
类图都是一样的,说明根据了题目要求正确的完成了程序的编写,这两个题目所采用的是不一样的类设计方法,题目集三7-2通过一个类向另一个类发送消息的方式形成了一个链状UML类图,各类之间的耦合性较强,反观题目集五的7-5,三个实体类之间毫无联系,遵循迪米特法则,采用了一个业务类DateUtil类来使用这三个类,使三个实体类之间的耦合性降到最低,这四个类的设计都符合单一职责原则。在编写的过程中,总是会因为7-2的类设计不好导致代码很长,逻辑有点乱,一边看类图一边写代码真不好,然后导致DateUtil类编写的过于庞大,程序跑起来之后出现问题要debug好久,折磨人 。总的来说,题目集四7-2的类设计劣于题目集五的7-5,在实际编写过程中也感受到了7-5的优越性。下面将分析这两题的圈复杂度,依次给出使用SourceMonitor分析圈复杂度产生的报表。
从报表中看出7-2的三个实体类的圈复杂度几乎一样,而DateUtil类的圈复杂度则小于7-5,原因是7-2的DateUtil中有方法写错了,不能完成程序所要实现的功能。实际来说,类间关系设计是几乎不会影响程序
的圈复杂度,采用不同的方法进行类间关系设计只能影响到代码质量,影响后续拓展。而要将圈复杂度改小可改进计算天数的算法,原来的算法是计算两个日期距离一年一月一日相差的天数,改进可以从小的那个日期入手,进行遍历来计算天数,这样就少了一个for循环。
题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用:
依次先给出三个题目的类图
这三个题目分别是类继承,抽象类继承,还有接口的运用,题目集四7-3采用的使简单的继承:Shape类的两个子类Circle和Rectangle,还有Circle的子类Ball,Rectangle子类Box,子类继承了父类的非private属性与方法,还有对方法进行重写,例如getArea方法,Circle的面积和Ball的面积计算方法不一样,所以要进行重写,从类图上看,程序的编写是符合题目要求的,使用了类继承来解决问题。题目集六的7-5,7-6分别要求使用不同的方法(抽象类继承和接口的使用)来解决问题,从我给定的类图可以看出7-5采用的是一个Shape抽象类为父类,然后在shape的三个子类对抽象方法进行复写,并根据类自身所要的方法在增加方法,而7-6采用的是接口,然后也只需要少量的代码便可完成。总的来说,这三题难度都不大,主要是为巩固课上所学的知识点,与课堂内容相结合,加深对抽象类和接口的理解。这三题的圈复杂度报表截图如下
除了题目集四的7-4中的Main类圈复杂度12,一骑绝尘,其他的均低于10,而7-4中超过十的原因为Main类中聚合了所有算法,而其他四个类中没写到一些方法,这也是为什么其他四个类的圈复杂度均为1的原因。
这三个题目集有大量的正则表达式的使用,难度依次下降,题目集四的7-1水文数据校验是三个题目集的正则表达式中最难的,光是任务书就这么长。本题要求对给定数据进行合法性校验,在这题要对每行数据先进行空格筛选,然后以|为界进行分割,分成的数据进行处理,其中处理操作difficult,至今也没写出来。然后其次就是题目集五7-4 统计Java程序中关键词的出现次数,这题其实说实话不难,起码没有贼长的任务书,主要是对Java的53个关键字进行统计,在这题中学习了一下哈希表的使用,了解了哈希表的工作原理以及出现的哈希冲突,对字符串的合法性校验即正则表达式的使用倒是不难,但我这题出发点错了,我将每行作为一个字符串来进行处理,但是这样就忽略了多行注释的情况,所以在这题中应该改进的方法是将每行进行拼接,已处理多行注释的情况,下面给出使用SourceMonitor进行的圈复杂度分析
圈复杂度仅为8,在这里就没有改进的必要了。然后题目集六的正则表达式so easy,送分题,校验QQ号,学号,验证码,这些都是正则表达式应用的常规操作,在这就没必要做分析了。总的来说,正则表达式的训练效果还是有的,增强了我对字符串处理的功力,加深了对字符串的理解。
题目集5(7-4)中Java集合框架应用的分析总结:这是题目集五7-4采用的是哈希图(Map)集合来解决问题,哈希图是以数组为基础的一种集合,能提高查找效率,Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value,时间复杂度为为O(1)。在题目集五7-4中,对Java的53个关键字通过hash函数进行运算,得到它所对应的value,储存在图中,但是好像这样并没有提高查找效率,应该要对值进行取模,但是这样又会出现哈希冲突,自己对Java中集合应用框架中的hash图的理解还不到位,而且java集合应用框架还有很多其他的实用性强的集合,这也是日后还要继续学习的方向。
总结:这三个题目集给我的感觉就是难度下降,题量上升,题目集侧重点开始向课堂内容倾斜,以及增强我们的类设计能力,加强了对类间设计原则的理解,以及类设计的不好会带来哪些影响,从实际编码中得出类间关系设计到底给我们带来了什么好处。设置继承,多态,接口的练习题来加强对面向对象学习的理解,从面向过程程序设计过渡到面向对象程序设计,让面向对象的理念深入到同学的思想理念中。还有java集合框架,这是课外所要学习的内容,java的学习不困于课堂,疑惑的解答,知识的拓展,自身的认知同样要借助广大热心网友的力量,看别人写的好的代码,学习别人的手法,也是我们必不可少的技能。最后,对java课程的建议就是没有建议,十分接受这种授课模式,至少比c语言好得多!
原文:https://www.cnblogs.com/n1120/p/14726091.html