第二次博客总结

前言:

总体来说这三周的题目出来第一次水文数据校验的着实难了,其他的都在可以接受的范围内。由于最后一次的题目集老师做出了改革,题目变得更加精,我也更加适应了。最后一次的题目难度适中,我也学到了不少,对于正则表达式的运用也更多了。在这三次作业中大量使用到了多态和接口。对于一道题目我们使用了不同的关系去实现,从中我也发现了对于不同题目使用不同语法时的优点。

设计与分析:

1、第四次题目集的第二题和第五次题目集的第五题题目要求基本相同,题目的基本思路相同,但是由于使用了聚合与组合使得设计图区别很大。

下面可以看到两次作业代码的复杂程度其实是差不多的,想对而言后面一次使用聚合的方法实现所需要的代码还更多,但其实后面一次却做过迭代,从后面的类图就可以看出其实代码多并不代表不如长代码的好。

4-7-2

 

5-7-5

 

由于两次题目大致相同,只有构造关系由一定的变化,所以两个程序的复杂程度基本相同。但是两次作业中的主方法都具有比较高的复杂程度,我在输入时使用了switch进行选择输入类型,这相对于其他的方法更加简单,但是对于合法性判断我放在了case里,这导致复杂程度增加了不少,在下次的代码中可以尝试将合法性判断放在外面单独使用。

下面是依次的两个类图

4-7-2

 

5-7-5

 

可以明显的看出第一次为组合关系,第二次为聚合关系。对于这道题来说,第二次所使用的聚合优于第一次的组合。组合使得所创建的类具有局限性,复用率低,如果其中的一个方法出现了问题就会影响其他类的计算,不利于提高程序的复用的使用效率,当然,组合的好处也是计算效率高。除此之外,聚合使得程序的耦合性大大降低,让程序的质量更高。同时,由两次代码的长度相差较大还可以看出来,代码更简洁不一定更好。

2、题目集四的第三题与题目集六的第五题和第六题都是对于图形面积的相关运算。

(1)第四次题目集的第三题运算使用的是组合,由主方法开始,然后shape组为父类,里面有getarea的方法用来被子类覆写,并且输出相关提示,然后由Rectangle和Circle去继承和输出,最后由box和ball来具体运算输出。

(2)第六次的两次题目也都是对于面积的计算。在第五题使用了list的相关方法,用了tostring的方法来简化实现要求中的排序和输出要求,其中都有相关的方法,包括排序和遍历输出。主要步骤还是先建立一个shape类的抽象方法,然后由circle类,triangle类以及rectangle类继承,将shape类中的方法继承并且实现,最后由主方法调用输出,这里不同于其他的就是输入数据是直接进入对象中进行储存和运算的。

(3)第六次作业的第六题使用了接口,相对于抽象类,接口可以被多个类所继承,解决了Java单继承问题。接口相对于抽象类更加强调功能的实现,在这道题上明显效率更加高,抽象类则对于关系更加相关。

下面是各个题目的复杂程度表。

4-7-3

 

6-7-5

 

6-7-6

 

可以看到除了由于第六次作业的第六题的要求较少导致类相对较少,所以该程序的复杂程度相对较高,其余两个程序的复杂程度基本相同。

下面是三个题目的类图

4-7-3

 

6-7-5

 

6-7-6

 

由三个类图可以看到,相对而言,直接使用继承然后对父类进行覆写看上去会使得程序难以读懂,程序的复用率大大降低,耦合性也会由此提高。如果是使用了抽象方法或者接口则使得程序结构更加清晰明了。而抽象方法和接口相对比,接口的优势则在于抽象方法的类型是public,没有接口封装的安全,对于则个类型的题目来说,我觉得使用接口会是更优的选择。

当然,在这道题目里,使用抽象函数相对而言类更加少,结构也相对简单一些,所以在使用抽象函数和接口时可以根据实际情况判断使用的关系。

3、三次题目集都有使用到正则表达,它可以对字符串进行特定的查找并且对其进行替换删除,修改等功能。正则表达式的使用也十分广泛,许多程序的合法性校验以搜索功能都会运用到正则表达式。它的基本原理就是去匹配所要求的字符串,如果是校验合法性时则需要设置所有符合要求的字符,对于字符串进行判断。在使用正则表达式时,一定要对字符进行分组匹配,刚开始使用时,我总是因为不去分组导致有时看不懂自己写的正则表达式。总体来说,正则表达式只要掌握exce,test,search,replace,split以及match方法和一些基本的字符就可以正常使用。同时,在使用object类中的tostring方法输出时也会使用到正则表达式去对字符串进行修改和删减,正则表达式的使用是特别广泛的。

4、题目集五中的第四题使用了Java的集合框架用Hashmap来进行迭代输入数据。首先建立了一个字符串数组储存所需要识别的关键字,然后建立对象并且进行输入和判断输入是否结束,接下来对于输入的代码中注释’\\’后的语句进行分割,不对其中的语句进行处理。然后再对字符串中的语句进行匹配和计数,最后运用toArray进行输出。这道题的不足则是只使用了一个主类。

下面是复杂程度

5-7-4

 

复杂程度还是比较高的,这是由于我并没有使用类,只在主方法中对于代码进行了数据计算和输出,这是因为要求只是计数,没有必要设置多个类。

下面是类图

5-7-4

 

这道题只有主类,可以进行一些改进去增加一些类减少复杂程度。

踩坑心得:

 

1、编写代码是要足够细心,注意传入的参数。在编写第四次题目集的第二题和第五次题目集的第五题中,要输入年月日,我在设计和编写时逻辑都是正确的,可是在验证时却总是有几个测试点无法通过。后来通过多次验证后发现是传入的日期和月份放反了,这个错误特别不应该,在今后的编程中我要更加细心去编写代码,在出现错误时也要注意是否是传参错误,减少检查错误的时间。

 

2、Java保留小数的方法。Java保留小数的方法很多,我经常使用的主要是两种。分别是string的format方法和DecimalFormat的format方法。刚开始我是一直用第二种方法的,但后来在做图形运算的题目时发现它对于多个保留两位小数输出时会将小于一大于零的数字中的个位数删除,从而导致输出错误。所以以后的题目中我会多使用第一种方法,目前还没发现其缺陷。

 

3、在调用类中的方法时一定要注意所使用的类的位置以及明确方法所蕴含的含义。在第一次使用继承方法来写日期问题时我并没有注意这些细节,导致计算时我总是带入错误的数据导致运算错误甚至无法运行程序。

 

4、出现错误时可以在出错的类里每一次运行后进行输出来标记一下,然后再通过逻辑去判断对应的前一个语句是否出现错误,这样操作还可以在DBUG时快速找到自己出错的地方。

 

5、利用tostring方法进行输出时一定要注意输出的格式,对于输出中的逗号和中括号,可以使用正则表达式的方法进行去除。

改进建议:

1、对于第五次题目集的第四题,我只使用了一个主方法进行功能实现,其实还可以改进为多个方法来减少圈复杂程度,例如将关键字重新放在一个类里,判断方法放在一个类里,输出放在一个类里,最后利用一个经理类将所有类聚合起来进行判断和输出,主方法只起到一个入口的作用来输入。

2、在第六次作业中的第五题要求对求得的数据输出,由于我的输出格式和要求不完全相符,导致对于输入数据为零时我的输出格式不符。我只是重新定义了输出零时的特殊情况来输出,这提高了题目的复杂程度,我可以重新修改原来的输出,周一真可以减少对于零这个特殊情况的判断,简化程序。

总结:

在这个阶段的学习里,我了解到了用不同结构关系来处理同一个题目时会有特别大的区别,在今后自己编写代码时一定要好好思考程序结构,选择最适合的关系编写类和方法。同时,我也大概了解到了继承的使用方法,认识了多态,尝试着使用了抽象方法和接口,虽然在现在的题目中还没有体现出两者的区别,但我还是有了大概的了解。另外,我还学会了tostring的使用方法,了解了相关的方法,知道了输出时其实也可以使用tostring来输出,其中具有很多方法,排序,删除等,由于所有类都是object的子类,所以可以总结使用,可以减少所编写代码的计算量来简化代码。

 

 

posted @ 2021-05-02 13:08  I&R  阅读(66)  评论(0)    收藏  举报
Live2D