java第三次博客
java第三次博客
1.前言
题目集七:
主要训练我们关于类的继承,多态,接口的使用。题目集七的两道题目为递进式,第一题是对于卡片上图形面积的排序,第二题则是先进行图形分类,在进行排序。在题目难度上都很简单,只是基础应用,题目的代码数量相较于前几次也有明显上升。这两道题目都涉及到了类的多态性的使用,即一个抽象的图形父类及多个不同图形的子类,这明确使用了类的继承,然后在处理类中则使用父类的引用和子类的对象,实现类的多态性。本次使用的接口则是Comparable<>接口,这是系统文件中自带的接口,我在类中进行了重写compareTo方法,使得它可以排序按照要求我们的卡片类,为此使用了泛化,泛化为实体卡片类。在该题目中,还涉及了ArrayLIst的泛化使用及设计原则(开—闭原则,单一原则)的运用,巩固了以前的知识点。
题目集八 九:
要求我们设计ATM机的取款程序,这题主要是敲代码之前要想好初始化的数据要怎么存,存在哪,他们之间的关系要怎么实现,要怎么找到对应的人以及考虑“开闭”原则。以及实体类的单一职责原则,怎样实现读取卡号,再找到对应的账户进行存取款业务,以及对应的密码是不是正确的,以及怎样将字符串中的提取以及存取金额转化为int类型或者double类型,进行余额的加减,都是本次题目集中我们需要考虑的问题,对应的银行有其对应的ATM机的编号,我们在跨行时能否找出对应的ATM机,以及我们设计的ATM机是不是支持跨行取款,这些都是我们在设计中需要考虑到的问题。做题目集九的时候,很容易算错钱数,因为分不清楚利息和贷款利息,在计算余额时候要想清楚。
总结
这几次的作业难度都也大,但都趋近于完成一整个系统,而非只实现部分的功能。题目集八、九也不在给出类图,而是要求自己设计。我认为这是比较好的,不想当码农,而是要自己的设计能力,加大了题目难度以及题目代码的行数,对于基础知识点进行了综合运用,着重训练了我们的设计思维能力,加深了对于设计基本原则的理解(如:开闭原则,单一原则......)。知识点包括类的继承,多态和接口,这几次主要是考虑类的设计的合理性。题目总的来说难度大,特点是代码复用性较高,所以类的设计显得尤为重要。
2.设计与分析
①题目集7(7-1)、(7-2)两道题目的递进式设计分析总结
7-1 图形卡片排序游戏 (40 分)
掌握类的继承、多态性使用方法以及接口的应用。详见作业指导书 2020-OO第07次作业-1指导书V1.0.pdf
输入格式:
首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1 3 4 2 1 3 0
然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
输出格式:
如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边不能组成三角形),则输出Wrong Format。
如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
排序前的各图形类型及面积,格式为图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
排序后的各图形类型及面积,格式同排序前的输出;
所有图形的面积总和,格式为Sum of area:总面积值。

7-1复杂度分析

从图中可以看出:我的各项指标都还OK,平均深度还有待提高。
7-2 图形卡片分组游戏 (60 分)
掌握类的继承、多态性使用方法以及接口的应用。 具体需求参考作业指导书。
2021-OO第07次作业-2指导书V1.0.pdf
输入格式:
在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如:1 3 4 2 1 3 4 2 1 3 0
根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
输出格式:
如果图形数量非法(<=0)或图形属性值非法(数值<0以及三角形三边不能组成三角形),则输出Wrong Format。
如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
排序前的各图形类型及面积,格式为[图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ],注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格,在结束符“]”之前;
输出分组后的图形类型及面积,格式为[圆形分组各图形类型及面积][矩形分组各图形类型及面积][三角形分组各图形类型及面积][梯形分组各图形类型及面积],各组内格式为图形名称:面积值。按照“Circle、Rectangle、Triangle、Trapezoid”的顺序依次输出;
各组内图形排序后的各图形类型及面积,格式同排序前各组图形的输出;
各组中面积之和的最大值输出,格式为The max area:面积值。


然后从Monitor图中可以看出题1中是DealCardList是复杂度最高的,我为了判断输入是否合法先创建了一个ArrayList list如果输入全部合法就创建cardList通过判断list中存的都是什么数字来创建什么样的图形并获得图形参数。题2的Monitor图中可以看到是getMaxArea这个函数的复杂度最高,对比两个圆形折线图可以看到Max Complexity这一项题2明显高些其他没有什么变化,这个复杂度的变化就在getMaxArea这个函数上,因为两题之间有大改动的就是这个函数,原本这个函数在题1中是求和函数,由于我在写题1时并没有注意到这种分类问题所以并没有给每个 图形的类创建数列,所以要取得和最大的那个图型组的面积就需要我再对图形总数列进行区分在求和,几个和之间又要比较所有产生了很多循环和判断,增大了复杂度。
此次代码设计一个突出的要求便是使用多态继承进行相应的实现以使程序的结构避免过于繁琐。因此我们创建一个list将输入的图像类型进行保存。后续对列中的数据进行提出并进行相应参数的输入。我们创建一个类来进行list的处理,根据所存list的相应内容创建出相应的对象包括Circle,Triangle,Rectangle,Trapezoid。同时创建的该四个类同时继承抽象类Shape。
题集八和题集九
②题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
题集8和题集9都只有1道题,这里只放一道题题目因为两题题目一样(图一),是题目给的条件有些不一样(图二),如下
7-3 ATM机类结构设计(一) (100 分)
设计ATM仿真系统,具体要求参见作业说明。 OO作业8-1题目说明.pdf
输入格式:
每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:
存款、取款功能输入数据格式: 卡号 密码 ATM机编号 金额(由一个或多个空格分隔), 其中,当金额大于0时,代表取款,否则代表存款。
查询余额功能输入数据格式: 卡号
输出格式:
①输入错误处理
如果输入卡号不存在,则输出Sorry,this card does not exist.。
如果输入ATM机编号不存在,则输出Sorry,the ATM's id is wrong.。
如果输入银行卡密码错误,则输出Sorry,your password is wrong.。
如果输入取款金额大于账户余额,则输出Sorry,your account balance is insufficient.。
如果检测为跨行存取款,则输出Sorry,cross-bank withdrawal is not supported.。
②取款业务输出
输出共两行,格式分别为:
[用户姓名]在[银行名称]的[ATM编号]上取款¥[金额]
当前余额为¥[金额]
其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。
③存款业务输出
输出共两行,格式分别为:
[用户姓名]在[银行名称]的[ATM编号]上存款¥[金额]
当前余额为¥[金额]
其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。
④查询余额业务输出
¥[金额]
金额保留两位小数。
8的类图


9的类图


结合题集8和题集9进行一个名词与名词之间的分析。这应该是一个包含一个的关系,和之前的日期有些相似。首先是有中国银联之下拥有几个银行和透支取款手续费和最大透支额,银行拥有自己的几个ATM机和几个用户和跨行存取手续费,用户拥有自己的几个账号,账号分借记账号和贷款账号,账号拥有初始余额和几张卡。我就是通过这样一层一层的关系,将这几个名词都写成类,从最里面一层开始写,也就是卡,我这里认为卡号可以作为一个属性在账号中所以就没有写成类,账号类拥有卡组、账户号、账户余额和账户密码这几个属性题集9这里加了一个标记标记是借记账号还是贷款账号,用户类拥有姓名和账户数组这两个属性,银行类拥有ATM机组、用户数组、银行名称和跨行存取手续费这几个属性,中国银联类(在我的代码中是DataBase类)有透支手续费、最大透支限额和银行数组这几个属性,场景的初始化我就是在中国银联类中实现的。然后为了完成一个完整的场景需要进行的用户操作,我创建了一个DealData类引用中国银联类,使用其中的数据进行存期钱以及查询的操作。所有的数据处理都在这个类之中,这也就是Monitor图中所示复杂度最高的地方。该类可以判断用户是进行了什么操作,如果是取钱可以判断是否超过可取上限,取钱成功余额的扣减也在这个函数中实现。题目集9在取钱操作上有许多需要考虑的地方
总结:这两道题目还是有一定的难度的,考察的不再是对部分数据的处理,而是将实际的问题变成了我们对于实体类设计,怎样用Java实现具体的功能,对我们的考察有了进一步的提升,在解这两道题目我们最先考虑到的是类的设计方法,怎样设计实体类的功能,以及在 最开始要弄清楚,银联与银行,银行与账户,账户与卡号之间的关系,只有在一开始我们把所有的关系都理清楚之后,我们才能去设计出我们需要的类。
3.采坑心得
7-2要注意的就是分组的格式问题,格式要正确,否则就得不到正确的结果;
编程的严谨性是不可忽略的问题,前面设计的时候不想仔细后面改的时候只会苦叫;
ATM:输入数据的判断方法应该放在哪一个类中,在第八次程序中体现的很完全,但是后来的程序编写时,我把他们全部放在了一个判断类中,使用静态方法进行设计,从而我每个类都可以直接使用这些静态方法,从而判断输入;
9-1计算跨行利息是一个需要细心的点,此时要注意区分好跨行利息,看清题目;
8-1中写的时候对Map还不是很熟,所以花了很久在想如何遍历,如何找到对应用户;
ATM机需要我们考虑到的情况多变,不再局限于解题,而加入了实际问题,这也需要我们在设计的时候想清楚,尽可能的考虑到每一种情况。
4.改进建议
在题目集八中改进的部分就是类的设计上,我认为还是应该把存取款、查询余额都单独拿出来,作为一个业务类,这样会大大方便我们进行扩展,对于从属关系上,用户确实不应该和银行直接联系起来,毕竟在实际上用户和银行独立存在的。这些在题目集九中已经改进了大部分,但是在题目集九中,还是存在着好多问题,其中取款的操作可以不用继承,依旧使用一种综合的取款方式,就是先算出手续费和取款金额,然后直接取款,毕竟在这之前会判断能否取款成功的。对于其他的改进现阶段没有什么能想到的了。
5.总结
随着学习的深入,每次的题目集在难度上有了提高,这次的三次题目集又增加了类的继承,聚合,多态以及接口引用 。这三次题目集中,更具综合性更有难度的其实是题目集9。这里我谈谈我对聚合和多态的理解:如果类B聚合于类A,那其实是是将B作为类A中的一个属性。
所谓的“多态”,简单的理解就是对象在不同情况下的不同表现,具体体现在定义和功能两个方 面,简单的总结一下,多态可以用“三个定义和两个方法”来总结。三个定义分别是父类定义子类构 建、接口定义实现类构建和抽象类定义实体类构建,而两个方法分别是方法重载和方法重写。
通过本次题目集的学习,我还了解到了接口,前面也提到过,接口相当于一个完全抽象的抽象类,其中有抽象方法,而接口和抽象类一个重要的区别就是接口中只有抽象方法和常量,但接口可以进行多继承,这是两者的区别,使用接口可以提高代码的可维护性和扩展性,且接口可以减少代码的书写,学会使用接口对我们专业的学习非常有帮助。我现在还只了解接口的大概,还需要进一步地去学习接口。
浙公网安备 33010602011771号