第三次Blog
前言:
题目集07:题目很少,而且难度也不大。可能是因为恰逢劳动节,老师想让我们度过一个愉快的假期,所以本次在难度和题量上都有所降低。题目集都是与图形继承有关,主要是想让我们掌握类的继承、多态性使用方法以及接口的应用。图形的继承是一个非常典型的例子,可以让我们很好的理解多态与继承。在图形类的设计中,体会到了面向对象设计原则中的“开-闭”原则的实现方法及其作用。本题目集老师还让我们学习了有关Compareable接口的应用,并且重写接口中的CompareTo的方法,这是一个很常用几乎所有的类都有的方法,CompareTo方法可以帮助我们实现很多功能,例如比较该类属性的大小。
题目集08:本题目集就只有一个大题,ATM机类结构设计。本次老师没有给我们类图,所有的类都需要我们自己去设计,深度理解并掌握类设计的七大基本原则。本题目集的与之前的最大不同就是没有类图,所有一开始可能无从下手。很多同学一开始按照c语言的思维来做题,就只有一个主类,这显然是不行的。在听完老师对任务指导书的详细解释后,我终于明白该怎么去做了。其实在一开始设计类间关系时,有很多地方是不符合类设计原则的,在一次次修改代码后,终于明白了如何设计才能符合类设计原则。其实本题目集要实现的功能是非常简单的,主要就是考查我们是否理解并掌握类设计的七大基本原则。
题目集09:本题目集也只有一个大题,是对上一次题目集的拓展。这次老师给了我们上一次题目集的源码,让我们根据他给的源码基础上做出进一步的拓展。自己写的代码和老师给的代码虽然思路上都是差不多的,但是在类的设计上还是有很多地方需要改正,和老师的代码比简直相差太多。本题目集就是要在上一次ATM机的功能上做一次拓展,增加了跨行取款和可以借贷两个功能。本次重点训练的内容为抽象类,继承与多态。本次题目集的难度不是很大,主要是让我们明白类设计的七大基本原则带来的好处是什么。比如本次对功能的拓展,就很好的说明了开闭原则给带来的好处,可以不对原来代码进行修改就实现功能的增加。
设计与分析:
①题目集7(7-1)、(7-2)两道题目的递进式设计分析总结
题目集7(7-1)的类图与题目集7(7-2)的类图比较
题目集7(7-1)
题目集7(7-2)
这两个题目的类图基本没有什么不同之处,都实现了Compareable接口。第二次与第一次的不同就是少了个Card类。第二次题目其实就是在第一次的基础上增添了几个方法,把所有的图形都分类并且排序后遍历了一遍,主要是让我们明白Compareble接口给我们带来的好处。
题目集7(7-1)的类图与题目集7(7-2)的圈复杂度比较
题目集7(7-1)
题目集7(7-2)
本次两题的圈复杂度都很低,都是在5-6左右。因为这两题都不是很复杂,最多就是两次遍历的循环,并没有什么很难的算法问题。
总结:通过这两个题目很好的掌握了Compareable接口的使用,更加深刻的理解了继承与多态在程序中给我们带来的好处。这两个题目的递进式设计思路,在进行类的设计时遵循七大基本原则,可以使程序具有良好的拓展性和灵活性,这些在第二次的迭代中都很好的体现出来。
②题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
题目集8(8-1)的类图与题目集9(9-1)的类图比较
题目集8(8-1)
题目集9(9-1)
虽然这两个题目都是关于ATM机的一个大题,但是这两个类图还是有很多的不同。因为第二次进行拓展是根据老师所提供的源码来写的,所以这两个题目的类图有较多的不同之处。老师所提供的源码比我的简直就是天壤之别,还有很多是我需要学习和改进的地方。虽然在设计时我尽量遵循着单一职责原则和开闭原则,但是通过类图比较还是能够发现类的设计还是有很多不足的地方,例如一个类里很多方法明明可以分开。
题目集8(8-1)的类图与题目集9(9-1)的圈复杂度比较
题目集8(8-1)
题目集9(9-1)
题目集8是我自己敲的代码,类间设计还不太成熟,很多地方有不足。题目集9大多是老师提供的源码,可以看出这两次的圈复杂度相差很大。主要原因可能是我没有使用迭代器,当时为了省事偷懒就用来for-each循环来进行多重循环找到卡,老师所提供的源码是运用迭代器来进行多重循环的。虽然for—each循环写起来更加简洁,但是在圈复杂度上远远要比迭代器循环大。
总结:自己在设计类的时候,尽管时刻提醒着自己要遵循七大基本原则,但是设计出来的类与老师写的相比还是相差很大,还是有很多地方设置不合理。我的思路是设置一个中介类,中介类就是完成程序功能。然后其他的两个类,一个类判断输入消息是否合法,一个类查找类,根据卡号查找账户。老师给的源码中是一个业务类,另外是一个判断类,一个功能类。大致的设计思路上相差不太多,但是自己写的代码还是不够简洁,分类也不够严谨。在以后设计类的时候应该多参考本次老师所给的源码。
采坑心得:
(1)Comparable接口&&compareTo方法
compareTo(T t) :将调用对象与t进行比较,返回int类型的整数。
t可以是:Byte, Double, Integer, Float, Long 或 Short 类型的参数
返回值表示:
1.负整数: 调用对象的值小于t对象的值
2.零: 调用对象的值与t对象的值相等
3.整数: 调用对象的值大于t对象的值
例如:
但这里有个小坑,当要比较的数字是Byte, Double, Integer, Float, Long 或 Short 类型之外的数据类型:如int,或者char类型的数据就无法直接使用compareTo方法。
所以此时就需要通过实现Compareable接口来重写CompareTo方法。
(2)for—each循环与迭代器循环
在遍历链表中的元素时可以选择用for-each循环来实现或者用迭代器循环的方式实现,但是我在使用的过程中发现这两种方法都有利弊。题目集8与题目集9都使用到了这两种循环。
题目集8的for-each循环
题目集9的迭代器循环
由图可以看出在实现相同功能的情况下,for-each循环要比迭代器循环更加简单易懂,并且更加简便。但是从圈复杂度的角度来看,从之前的圈复杂度分析发现迭代器循环的圈复杂度比for-each循环更低。
改进建议:
(1)类的设计思路
以往的题目集都是老师给了类图,我们根据类图写代码完善功能。而这次ATM机的题目却和往常不一样,老师没有给类图,而是让我们根据用户需求自己去设计类。这就要运用到课堂上老师和我们讲的几大设计基本原则。
第一次做这种没有类图的题目我一开始无从下手,肯定不能按照以前c语言那一套来。于是在老师的提示下,模仿之前雨刷的例子。先设计这些实体类,然后在设计一个中介类把这些实体类给关联起来,实现功能。
下图为一开始时我的大致分类
在看完老师写的代码之后,感觉自己有很多地方是需要改进的,自己的代码有很多累赘而且没有完全的符合单一职责原则。
下图是老师的分类
老师写的代码分工细致并且有条有序,每一个方法都符合单一职责原则。并且代码的可读性非常强,让人很容易就看懂。所以说在以后需要自己设计类图时,可以以本次老师的代码作为参考,进一步去写出更好的程序。
(2)用户需求分析
本次题目集08和题目集09都是没有给出类图的,老师只给了我们用户的需求和需要满足的功能,还有对相关知识概念的介绍。在一开始做这个题目的时候,没有类图我无从下手。在老师的提示下,才明白如何从题目分指导书中一步一步找到解题的思路。
其实在一开始看题时不要着急敲代码,而是要把指导书中的用户需求还有各项功能都熟记于心。只有明白了用户的需求,才能知道如何去写程序。然后在设计类时,根据需求设计好相关的实体类,确定好每个类的属性,最后再来构造业务类。
总结:
可维护性较低的软件设计,通常由于如下的原因造成:
(1)过于僵硬
(2)过于脆弱
(3)复用率低
(4)黏度过高
好的系统设计应该具备如下三个性质:
(1)可扩展性
(2)灵活性
(3)可插入性
所以为了设计一个可维护性高的程序,我们需要明白如何设计类,如何灵活的使用多态与继承。并且在设计类时,秉记着几大设计基本原则。
这几次题目集都很好的运用到了多态与继承,我们能够了解并且能够熟练运用多态与继承,并且明白了多态与继承带来的好处。
继承优点:
(1):很好实现了代码的重用;
(2):能改进软件系统的可维护性;
(3):继承使得已有程序库具有清晰的层次结构关系;
多态好处:
(1):降低了程序设计时的复杂性;
(2):支持程序开发人员的知识重用;
(3):增强了软件灵活性。
在本次迭代的题目集8和题目集9中我们很好的理解了为什么要遵循几大设计基本原则去设计类,因为这样有利于我们在今后的迭代拓展。在设计类时,设计时考虑是否扩展,如果不需要扩展,则使用聚合关系,否则使用继承关系。

浙公网安备 33010602011771号