7-9次题目集总结
一、 前言
这三次题目集的难度都比较大,涉及的知识内容比较深,题目数量不多,每个题目集只有一两道,这几次题目集要求对类图中类与类之间的联系要有一定的分析,理解每个类在代码中的功效以及发挥的作用。
二、 设计与分析
1、 第七次题目集7-1题图形卡片排序游戏,该题目需要在输入一串数字作为不同图形之后再输入一串数字为其相关参数后能够对输入的图形做出排序最后再输出所有图形的面积之和。这道题目首先要对输入的数据判断是否符合规则,若不符合则输出wrong Format,若输入数据正确,则接收相应的数据进行面积的计算,最后通过比较来进行排序。通过对代码的分析可以看出来,目前对于代码的注释还是偏低了,需要后期不断地进行改进,其它的都还行
2、 第七次题目集的7-2图形卡片分组,这道题目是在本次题目集的7-1上做出改进,要求能够对卡片以图形进行分类,此外输出不同类型卡片之间的排序,难度较之有所提升。这两道题目在递进式设计方面,首先建立一个shape的抽象类,在类里建立一个获取面积的抽象方法和判断输入数据是否符合规则的抽象方法,之后建立了四中图形类继承shape抽象类实现抽象类中的抽象方法;用一个列表记下输入的图形数据,在一个类中对列表中的数据进行分类,之后在这个类里创建一个方法对各图形按照面积进行排序。
3、 第八次题目集7-1ATM机类结构设计(一)中,要求编写一个银行ATM机的模拟程序,能够完成用户的存款、取款和查询余额的功能。题目所给的设计书中有提醒到需要设计银联、银行、银行账户、银行卡、ATM等实体类,此外还有业务类,但是在写的时候并没有注意到,所以并没有编写业务类,而是将业务写在了实体类里面。首先将输入的数据以空格进行分割之后,放在一个列表中,让后逐条分析每个用户输入数据,判断用户输入数据是想查询余额还是存取款,在存取款上通过判断输入金额的正负来确定用户是想要存钱还是取钱,在Main类和账户类的一起作用下,完成了存取款功能,这样子耦合度比较大。同时在处理用户输入数据方面也是很繁琐,通过多层循环来查找数据进行判断,同时有些判断部分还重复了几次。下图为代码分析图,可能是因为那几处繁琐的代码导致了代码的最大深度和最大复杂度比较高。
4、 第九次题目集ATM机结构设计(二)是在第八次题目集的基础上改进,银行账户分为了借记账户和贷记账户两种,其中贷记账户可以透支取款,透支取款有一定的额度且需要收取一定的费用,银行卡也相应的分为了借记卡和贷记卡两种,此外相比于第八次题目集的ATM模拟程序,这次的取款能够跨行,只是要收取一定的手续费同时新添加了一个银行和几个用户。在这道题目的编写过程中在上次题目的许多地方都做出了改进,新添加了一个校验类里面写有校验数据是否正确的方法还有一个判断取钱是否透支的方法、一个存取款类里面有存钱和取钱两个方法,此外还有一个获取余额类里面只有一个获取余额信息的方法。在许多实体类的属性成员里添加了它的上一级的属性,这样在代码的许多地方需要查找该属性所属的银行或者账户用户等都比较方便,省去了许多繁琐的步骤。下图为改题目代码的分析图可以看出,经过改进之后代码吗的最大深度和最大复杂度是有明显的下降,在平均复杂度上,或许是因为代码需要进行的初始化数据比较多,使许多行代码都在进行输入初始数据使得平均复杂度不高。
5、 对于第八次和第九次题目集中两道ATM机仿真题目的设计思路上。首先银联类管理着所有的银行,其属性成员只有自己的名称和一个银行类型的列表,让所有银行作为其成员,在方法上也只有对银行列表添加成员和返回银行列表。银行类中属性成员有字符串类型的name记录本银行的名称、ATM类型的列表记录属于本银行的ATM机、用户类型的列表记录在本银行注册过的用户信息,此外相比较于第八次题目集在第九次题目集中还有一个手续费的比例记录着跨行在本银行取款所需要额外支付取款金额的百分比,该类中的方法也都是属性成员的set和get方法。用户类中的属性成员包括了一个字符串类型成员用来记录用户的名称,一个账户类型的列表记录用户所创建的账户。账户类中包括一个card类型的列表记录所属于这个账户的银行卡、一个字符串类型的number用以记录该账户的编号、一个double类型的money记录账户中的金额、一个type记录账户种类、字符串类型的bank记录该账户所属银行的名称、字符串类型的name记录该账户所属的用户名称。在银行卡类中包括一个字符串类型的number记录该银行卡的卡号、字符串类型的password记录银行卡的密码还有一个账户类型的account记录该银行卡所隶属的账户。在ATM机类中的属性成员包括一个字符串类型的num来记录ATM机的编号、一个银行类型的bank记录该ATM机所属银行。上述所有的实体类中的方法都只包含了属性成员的get和set方法。在存取款的类中的属性成员有一个银联和一个校验数据的成员,方法有存款,若输入的金额为负数即进行存款,通过银行卡卡号找到所隶属的账户然后将账户的余额加上要存的金额数;还有一个取款的方法,在编写该方法时首先要判断取款是否有跨行,若有跨行行为则需要另外收取跨行手续费,之后需要判断取款银行卡是否为贷记卡且是否有透支取款。在校验类中只有一个银联作为属性成员,在该类中有找银行卡的方法,通过输入的银行卡账号参数来找到卡号对应的银行卡并且返回银行卡;有找ATM机的方法,通过传入的ATM编号找到ATM机并且返回;有布尔类型的卡号校验方法,通过遍历各个银行的所有银行卡卡号比较传进来的参数来判断该卡号是否存在,若存在则返回true;布尔类型的ATM机编号校验,通过遍历各银行所有的ATM机编号来校验传入参数的编号是否存在;密码校验方法,先通过遍历卡号查找到对应的银行卡之后获取密码对比传入的参数判断是否正确;透支校验方法,先判断账户类型再分别编写两种账户类型的情况。获取余额方法中有属性成员银联,还有一个获取余额的方法,通过遍历对比卡号,找到卡号后返回卡号所属账户的余额。在main函数里则是对数据的初始化,然后是对输入用户输入指令的分析处理。
三、 踩坑心得
1、 在编写代码的时候复制前段代码中的一段排序方法时有些数据未进行更改导致了输出数据出错;
2、 在第七次题目集中比较各种图形的数据的时候在在三角形处把triangle 写成了 rectangle导致比较上出现错误;
3、 在第八次题目集中使用for循环对输入的指令进行分割的时候,将条件判断语句list.size()写成了list.size()-1,导致当输入一个数据时程序的这段代码不会发挥作用;
4、 在ATM机模拟程序中需要初始的数据较多,有时输错了一两个之后,测试样例时程序出错,却总是找不到问题,当时找了挺久才发现问题;
5、 在ATM模拟程序中判断取款是否透支处,需要考虑许多种情况的发生。
四、 改进建议
可以适度的提高自己对代码的注释情况,这样子可以在过了一段时间之后再回头看能够快速弄懂自己在某些地方写这些代码的作用,也方便出问题的时候问别人,让别人理解自己是想要做什么。同时还要提高自己对类图的分析能力,以便能够快速的弄清楚每个类所需要发挥的作用大概要怎么写。
五、 总结
通过这几次的题目集,感觉自己对于类图的分析能力有所提高,但是有较大欠缺,需要去不断地锻炼自己;对于类于类之间的相互联系能够有一定的分析。