题目集7-9的总结性Blog
Posted 天天向上zx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题目集7-9的总结性Blog相关的知识,希望对你有一定的参考价值。
(1)前言:
这三次题目集主要考察多态,抽象类,接口,如何进行类与类之间的设计等知识点。运用到的算法比较基础,主要考察对面向对象思想的理解。题量适中,虽然题目数量减少但是每个题目集所涉及到的代码量有所增加。题目集难度稍有增加,但是还是在可以接受的范围内,类与类之间的关系更为复杂,但是认真理解题目要求还是会有思路。
(2)设计与分析:
题目7-1:
(1) 这个题目集主要考察对多态以及抽象类的使用,两个题目是递进关系。首先先要解决多态的问题,创建一个抽象类Card然后通过这个类来实现多态。
通过阅读题目要求我们可以得出需要三个方法:1.计算面积 2.判断是否合法 3.显示信息 。所以我们要将这些实现相应功能的方法设置为抽象方法。
(2)接下来设计Circle,Rectangle,Trapeze,Triangle这几个类继承与Card类并重写其中的抽象方法,这样就实现了多态。在重写抽象方法时要注意各个类之间的重写内容是不同的要认真考虑每一个类的情况。
例如Circle类重写后是这样的
(3)有题目要求可以得出需要解决的相应算法:利用相关数据对每个对象进行排序
利用多态以及实现Comparable接口来实现这一算法是比较简单的
首先先让Card这个抽象类实现Comparable接口并且重写comparato方法(这样做可以简便的使用属性对每一个对象进行排序)
涉及到求面积总和的问题时只需要设计一个方法来解决就可以
(4)这样大体的类与相对应的算法就已经实现,接下来只需要简单的逻辑与循环语句就可以编写完成整个程序。
最后编写完成后所生成的类图如下
从类图中也可以看出使用多态可以使代码整体可读性更高并且使代码思路更加清晰。
圈复杂度如下:
由圈复杂度可以看出使用多态降低了代码的复杂度逻辑思路清晰,这也体现了面向对象中使用多态的好处。
题目7-2:
(1)这个题目是对7-1的进一步延伸,多了一个需求就是需要分组进行排序这是对算法难度的一个提升。
想要实现这个算法首先要创建多个对应的数组来记录和存储各个对象的信息,然后再进行整体的输出。
具体步骤如下图:
这样是使用数组进行数据分类的做法,但是设置的类型却是具体的实物类型可以继续改进此代码。运用多态创建数组,这样依旧可以利用多态的优点增加代码的复用性,
所以在学习过程中要不断反思与改进自己所写的代码,这样才能使自己的代码越写越好。
这个题目所生成的类图与7-1的类图相同,这里就不在给出。
圈复杂度如下:
由此可以看出这个题目的圈复杂度比7-1要大一点,因为这个题目还进行了数组分类逻辑思维量也更大一些。
题目集8:
本题主要目的是设计一个ATM系统,可以实现简单的存款与取款。首先需要设计类与类之间的关系(ATM,银行,账户,用户),然后添加有关的属性与方法。
Bank类:这个类用来管控ATM以及创建银行,总体来说较为简单,下面直接给出源码:
涉及到的方法是要判断所使用的ATM是否属于本行,所使用到的思路也较为简单。
ATM:这个类主要是要实现对账户的操作,然后实现存款与取款。下面给出这个类的主要方法:
Account:这个类主要记录密码与账户号,设计理念比较简单这里就不在给出。
Consumer:这个类主要记录用户的基本信息,这里也不在给出。
下面介绍本题需要用到的算法:1.存款取款只需要使用加减法就可以 2.核对卡号,密码用户信息,存款取款是否合法等
第二个算法我使用法的是String类中的方法,截取卡号然后利用equals方法来进行校验,给出部分代码如下:
在储存用户信息时需要用到集合,利用集合去添加用户信息更加简便,并且在使用的时候也很方便。具体代码如下:
最后再根据题意利用String的一些方法增加一些逻辑关系的判断就可以完成整个程序:
这道题的代码对面向对象的使用并不是很多,所以代码的可读性与复用性比较差还需要继续进行改进。代码中大量的使用了if-else语句这也使代码的圈复杂度有所增加。
下面给出这道题的圈复杂度:
从圈复杂度可以看出本题代码编写时运用到的逻辑比较复杂,但这并不是最优的选择,在以后的编写时应该注意对面向对象思想的使用,先构思再写代码。
题目集9:
题目集9是对题目集8的进一步改进与优化,但是同时它也增加了许多新的功能(可透支,可跨行交易)同时这次是在老师所给的代码上进行修改,所以难度也会有所增加。
1.首先要明确思路,借记卡与贷记卡是针对于账户的,所以多态就要运用于此。创建一个借记账户,创建一个贷记账户让它们都继承于Account类,同时重写Account中的方法这样就实现了多态。
两个子类重写的方法如下:
2.通过总结老师所给的代码我得出了各个类之间的关系:银联---->银行------>账户------->卡号 用户------>账号
得出各个类之间的关系对后面方法的调用就有很大的帮助。
3.Withdraw类用于各项条件的判断,因为有两类账户所以对数据的判断要进行分类讨论
特别需要注意的是要添加跨行操作的逻辑判断:
4.最后完善所写代码,所生成的类图为:
圈复杂度如下:
由上图可以看出即使题目集9比题目集8增加了6到7个类但是正确运用多态还是可以使圈复杂度比较稳定不至于提高太多。所以正确的类与类之间的关系设置和正确使用面向对象三大基础特性就显得尤为重要了。
(3)踩坑心得
1.写代码时没有先进行构思就开始编写,这就使某些算法思路还停留在面向过程当中。
设置数组时并没用运用多态,这就增加了不必的重复性,代码复用性也变差了许多,这也是以后需要注意的地方。
1.大量使用if-else语句,增加了代码的圈复杂度,这是一个很不好的习惯以后需要注意改正。
大量的if-else语句不仅逻辑复杂而且可读性差,可以用switch语句代替并且在以后写代码时也要避免不必要的逻辑判断。
3.增强对陌生代码的阅读能力,这次题目集9是在老师所给的代码的基础上进行改进的,所以要想完成题目就必须要读懂老师所写的代码。
首先明确类与类之间的关系,然后针对每一类中的方法进行研究搞懂每一个方法的作用,这样阅读陌生代码会更快的搞懂它的逻辑结构。
4.在使用多态时调用方法时出现了问题
在获取余额时没有运用正确的逻辑思路,首先要搞清楚余额是存储在账户里面的。所以调用余额时要getAccount()这样才能获取到正确的余额。
(4)改进建议
自己写的代码还不够有面向对象的味道,所以之后还得多加练习,在写代码之前先进行构思这样会很有效率。
在卡片题目中虽然使用了多态但是没用将多态贯彻到底这就使代码还是出现了一些美中不足,在ATM机的题目中没有正确的运用多态,虽然想到使用多态但是却不能正确的运用。
这样就要加强对多态的练习,不仅要有使用多态的意识还要学会怎样正确使用多态。
(5)总结
这几次题目集是对面向对象使用的进一步加强,可以说是如果不使用面向对象就不可能做出来相关的题目。在做题中也深刻体会到了面向对象带来的便利,尤其是使用多态时只需要重写方法就可以反复使用。
而且这几次的题目都偏向于生活中的实例这就让学生在做题时更加具有生活情境希望以后这样具有丰富生活情境的题目可以多出一点。本次题目集还有一个创新的地方就是在老师原有的代码上进行改动实现题目要求,
这也是一个值得保持的地方,因为看懂别人所写的代码也是一种能力,在看别人写的优秀的代码时也可以发现不同的思路同时对自己写代码也有很好的帮助。这几次题目集难度虽然有所提升在做题时也出现了许多问题,
在不断debug和改错的过程中也体会到了坚持的力量,在最后得出正确答案时感受到了成功的喜悦,这也是java课让我学到的东西,希望这样的感觉可以继续保持。反转课堂的效果也很好可以继续采取这样的教学方式。
以上是关于题目集7-9的总结性Blog的主要内容,如果未能解决你的问题,请参考以下文章