NCHU第二次oop作业-blog
前言:
对于第二阶段的题目而言,我们学到的是类与类之间的关系:关联,聚合,依赖,继承等。这次的题目集是对Java的更加深入的探究,与我们前期的题目截然不同,了解到了java 的基本体系。在其中也有很多我们没有接触的知识,例如题目集04(7-2) 和题目集05(7-4)是对于日期类的聚合关系的不同方法之间的运用。主要是考察我们对类的封装和类的继承有所考察,总的来说考察的题目量不大,但是都是非常有意义的练习。第二阶段的难度也不是非常大,有些题目可能对于我们这写初学者来说还是有些困难的,只要自己能够潜下心去学习与题目中要用的知识点难题就会迎刃而解,例如我们的题目集05(7-4)中题目必须使用List、Set或Map中一种或多种。我对于这些接口并不熟悉,因此花费了一些时间,同时我觉得我对java的知识又更加精进了一些。下面是对这次blog题目的分析:
设计与分析:
1.题目集04(7-2)与题目集05(7-4)两种日期类聚合设计的优劣比较:
先给出两程序的类图,然后进行比较:
题目集04(7-2):

题目集05(7-4):

1)这两个题目主要内容是对日期的计算,要求实现求下n天,求前n天,求两个日期相差的天数这三个功能。
2)但用到的聚合关系是不同的,一个种是链式聚合(不严谨只是是一个比喻),第二个是对与DateUtil类的多聚合。
3)这里可以看出第一种的方法虽然比较简单易懂,但是对于程序的可维护性来讲是不友好的,可扩展性也是非常低的,调用类中的方法也不是很方便。但是对于第二种方法来说year, month, day, 这三个类是用DateUtil类作为中介类来聚合的,这种方法可以比较方便的调用,可扩展性也强。在第一种方法中DateUtil类没有发挥到作用,只是徒增写程序的难度。
4)第二种程序这种设计的方法可以运用到其他的程序设计中,就像我们上课讲过的雨刷类的设计也是像第二种日期的设计方法。主要是提高程序的可扩展性,降低耦合度,提高我们写的代码的复用率,对于我们这种初学者来说需要多借鉴这种方法。
5)分析两程序的复杂度
题目集04(7-2):
Parameter Value
========= =====
Checkpoint Name Baseline
Created On 1 May 2021, 16:02:38
Files 1
Lines 378
Statements 213
Percent Branch Statements 17.8
Method Call Statements 100
Percent Lines with Comments 3.2
Classes and Interfaces 5
Methods per Class 8.80
Average Statements per Method 3.52
Line Number of Most Complex Method {undefined}
Name of Most Complex Method Main.main()
Maximum Complexity 26
Line Number of Deepest Block {undefined}
Maximum Block Depth 5
Average Block Depth 2.44
Average Complexity 2.14
--------------------------------------------------------------------------------------------
Most Complex Methods in 5 Class(es): Complexity, Statements, Max Depth, Calls
DateUtil.compareDates() 6, 9, 5, 10
Day.getMon_maxnum() 3, 5, 3, 1
Main.main() 26, 56, 5, 39
Month.validate() 4, 4, 3, 0
Year.validate() 2, 1, 2, 0
分析复杂度:
从题目集04(7-2)可以看出我的平均复杂度只有2.14,表现比较好。但是最大复杂度达到了26,可以看出是由于主函数Main类的复杂度严重过高。我分析程序看出是由于我的Main类用了case 和if 语句 过多导致复杂度增加,后续可以考虑减少此类的语句的出现,就可以降低程序的复杂度。

题目集05(7-4):
Parameter Value
========= =====
Checkpoint Name Baseline
Created On 1 May 2021, 16:07:45
Files 1
Lines 374
Statements 209
Percent Branch Statements 19.1
Method Call Statements 95
Percent Lines with Comments 3.2
Classes and Interfaces 5
Methods per Class 8.20
Average Statements per Method 3.76
Line Number of Most Complex Method {undefined}
Name of Most Complex Method Main.main()
Maximum Complexity 26
Line Number of Deepest Block {undefined}
Maximum Block Depth 5
Average Block Depth 2.51
Average Complexity 2.27
--------------------------------------------------------------------------------------------
Most Complex Methods in 5 Class(es): Complexity, Statements, Max Depth, Calls
DateUtil.getPreviousNDays() 6, 13, 5, 8
Day.dayReduction() 1, 1, 2, 0
Main.main() 26, 57, 5, 40
Month.validate() 4, 4, 3, 0
Year.validate() 2, 1, 2, 0
分析复杂度:
从题目集05(7-4)看出也是和 题目集04(7-2)出现同样的问题。
2.题目集04(7-3)、题目集06(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)
题目集04(7-3)类图:

题目集06(7-5)类图:

题目集06(7-6)类图:

分析:
1)题目集04(7-3)与题目集06(7-5)有相同之处都是对于一个Shape类进行聚合但是对于题目集04(7-3)来说它 的Shape类是一个实体类定义了一个求面积的方法,而对于题目集06(7-5)是对于一个抽象类Shape进行继承。
2)三个题目虽然都是对于图形类的继承但是都有不同的特点,题目集04(7-3)中的继承是对于单个图形的求面积而对与题目集06(7-5)中的求面积可以设定多个图形的求面积,因此需要在程 序中创建一个数组来储存对象。例如:

3)对于创建的对象以Shape的形式储存在一个ArrayList中,然后进行后面的求面积。对于题目集04(7-3)与题目集06(7-5)中来说除开对于实体类与抽象类Shape中的不同,就还有了对于题目集06(7-5)中对于多对象的一个处理上是不同。
4)在对于题目集04(7-3)与题目集06(7-5)两程序的编写上来说如果要对于合乎规范的编写,还是要创建一个抽象类Shape,其他的图形类继承这个抽象类。
5)然而创建一个求面积的接口似乎是对于实体类图形的更好的方法,例如题目集06(7-6)从类图上来看也是更加简便,题目的目的是求图形的面积,所有的类都需要实现求面积的方法,因此可以将求面积的方法做成一个接口,然后不同的实体类图形使用这个接口,更加的符合编写程序的规范。
6)分析这三个程序的复杂度:
题目集04(7-3):
Parameter Value
========= =====
Checkpoint Name Baseline
Created On 1 May 2021, 16:14:41
Files 1
Lines 178
Statements 115
Percent Branch Statements 16.5
Method Call Statements 36
Percent Lines with Comments 4.5
Classes and Interfaces 6
Methods per Class 3.50
Average Statements per Method 3.71
Line Number of Most Complex Method {undefined}
Name of Most Complex Method Main.main()
Maximum Complexity 17
Line Number of Deepest Block {undefined}
Maximum Block Depth 5
Average Block Depth 2.66
Average Complexity 1.76
--------------------------------------------------------------------------------------------
Most Complex Methods in 6 Class(es): Complexity, Statements, Max Depth, Calls
Ball.getVolume() 1, 2, 2, 1
Box.getVolume() 1, 1, 2, 1
Circle.getArea() 1, 1, 2, 0
Main.main() 17, 55, 5, 26
Rectangle.getArea() 1, 1, 2, 0
Shape.getArea() 1, 1, 2, 0
--------------------------------------------------------------------------------------------
题目集06(7-5):
Parameter Value
========= =====
Checkpoint Name Baseline
Created On 1 May 2021, 16:17:06
Files 1
Lines 251
Statements 140
Percent Branch Statements 6.4
Method Call Statements 53
Percent Lines with Comments 10.0
Classes and Interfaces 5
Methods per Class 5.20
Average Statements per Method 3.42
Line Number of Most Complex Method {undefined}
Name of Most Complex Method Main.main()
Maximum Complexity 12
Line Number of Deepest Block {undefined}
Maximum Block Depth 4
Average Block Depth 1.81
Average Complexity 1.46
--------------------------------------------------------------------------------------------
Most Complex Methods in 5 Class(es): Complexity, Statements, Max Depth, Calls
Circle.validate() 1, 1, 2, 0
Main.main() 12, 53, 4, 41
Rectangle.validate() 2, 1, 2, 0
Shape.toString() 1, 1, 2, 2
Trianle.validate() 1, 6, 2, 1
--------------------------------------------------------------------------------------------
题目集06(7-6):
Parameter Value
========= =====
Checkpoint Name Baseline
Created On 1 May 2021, 16:18:36
Files 1
Lines 88
Statements 51
Percent Branch Statements 2.0
Method Call Statements 13
Percent Lines with Comments 2.3
Classes and Interfaces 4
Methods per Class 3.50
Average Statements per Method 1.86
Line Number of Most Complex Method {undefined}
Name of Most Complex Method Main.main()
Maximum Complexity 4
Line Number of Deepest Block {undefined}
Maximum Block Depth 3
Average Block Depth 1.43
Average Complexity 1.23
--------------------------------------------------------------------------------------------
Most Complex Methods in 3 Class(es): Complexity, Statements, Max Depth, Calls
Circle.getArea() 1, 1, 2, 0
Main.main() 4, 11, 3, 9
Rectangle.getArea() 1, 1, 2, 0
--------------------------------------------------------------------------------------------
分析复杂度:这三个程序的平均复杂度都不高都是由于主函数Main类的if else 类的语句使用过多导致的最大复杂度过高。
3.对三次题目集中用到的正则表达式技术的分析总结
1)对于正则表达式我这次做的题目需要用到的正则表达式并不多。由于之前我们做过多项式的求导,和后来水文数据的校验,可以说我对正则表达式可以掌握大部分的语法和方法。
2)在这次题目集中出现的水文数据的校验也用到了大量的正则表达式。
例如需要判断这段数据输入的合法性:
2015/8/2 4:00|133.8400|133.070|1.11/1.21|75.780
2015/8/2 6:00|133.840|133.080|11.11/1.11|72.8a0
2015/8/2 8:00|133.830|133.070|1.11/1.11|73.890
2015/8/2 10:00|133.820|133.080|1.11/1.11|74.380
exit
需要对各个数据进行逐条处理,先用 .split 方法对数据进行切割,然后再对每个“ | ” 字符中间的数据进行校验。
3)除了对正则表达式中方法的运用还是要对语法的熟悉,例如在题目集06中,老师就出了四个简单的小程序来考察我们对正则表达式的基本语法的运用:

在这之中还是考验我们对正则表达式基础语法的运用情况。
4.题目集5(7-4)中Java集合框架应用的分析总结

1)上图是题目集5(7-4)用到的集合框架
2)在此程序中Map集合是对key中的字符进行查找:

3)然后是用正则表达式对输入的数据进行处理:
//Test public method
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}
exit
除去注释后的语句,然后 “ ” 中的语句 ,接下来对输入中的程序进行查找:

采坑心得:
在这次的题目集中总体来说难度不是很大,但是也有一些让人模棱两可的题目。
1)例如水文数据校验中的对输入数据的判断,究竟如何去处理数据这里花费了较多的时间;

这个测试点是困扰了我许久,然后的解决办法的添加语句

用这个语句进行处理,就可以通过这个测试点。
2)其次是这次题目集中的日期问题面向对象设计的聚合一和聚合二,在写聚合二的时候,我没有仔细看类图,本以为还是和聚合一一样的写法,于是我就用到了“代码的可复用性”直接提交。结果被老师说会被判零分。
3)还有在写7-6 实现图形接口及多态性的时候由于对接口相关的语法并不是很熟悉,我就在直接写出了创建对象,后来才知道可以在主函数中创建一个接口对象。
例如:

改进建议
1)首先是对于我的代码主类Mian的最大复杂度很高感到不满意,后期写程序的时候可以考虑自己程序的复杂度然后在进行编写程序。
2)其次是在编写代码的时候考虑的东西并不多,在7-4 统计Java程序中关键词的出现次数中我甚至吧程序都写在了一个类中,其实这种方式是不严谨的,后续写代码需要好好用到类的单一职责,这种思路可以帮助我更好的提高我写代码的质量。
3)还需要多对java种的相关语法要深入学习,还学要对面先对象的思想种的各种原则在编写代码的时候需要融入在写代码的过程中。
总结
总的来说对于这次的题目集主要是让我们对面向对象的思想有一个初步的了解,在面向对象的过程中还需要摒弃C语言时候的固有观念,主要我们编写的程序才能有更好的质量。
还要对我们这程课中的各种学习到的东西仍需静下心来反复咀嚼,提取其中精华,来提高我们编写代码的能力。在之后不仅仅靠的是课堂上老师讲的东西来吃饭,而是要对于自己
以后的方向的确定要增加自学的能力,总之,是师傅领进门修行靠个人。因此对于这个专业更加要有强大的自学能力。

浙公网安备 33010602011771号