一、前言
目前已完成了九次题目集,本次博客将对题目集7、8、9进行分析总结与反思。
很显然本次题目集难度要高了很多,需要在题目上花费的时间也要多出很多,即使只有一道题,也是需要我们来进行仔细的思考与设计的。当然,经过一段时间的思考,我们就能解决掉很多问题。
题目集7所涉及到的知识点为类的继承、多态性使用方法以及接口的应用,题目集8则重点考核类的封装性及类间关系设计(关联、组合及依赖),题目集9重点训练内容为抽象类、继承与多态。通过这三次实验及考察的知识点可以看出,类的多态及封装性在程序设计中十分重要。
二、设计与分析
1. 题目集7(7-1)、(7-2)两道题目的递进式设计分析总结
这两道题目与之前写过的图形继承等题目有着很多相似的地方,其核心还是考察对于图形类的各种处理方式。
跟之前最大的不同就是使用到了Comparable 接口以及其中的 CompareTo()方法。这个方法就是将指定的数与参数比大小,根据不同情况返回1、0、-1,从而方便进行后续操作,大大增加了我们的代码简洁度。
interface Comparable{ public int compareTo(Card card); }
shape类继承后将compareTo方法完善后代码:
public int compareTo(Card card) { return -(int)(shape.getArea()-card.getShape().getArea()); }
两道题目也很相似,一道排序,一道分组,实际上分组也是在排序的基础上进行的,也就是所谓的递进式设计,先将图片继承设计出来,随后设计排序,然后在此基础上进行分组设计,能够很大程度上改善代码的结构,让设计更加清晰合理,也方便思考。
在排序设计的时候一开始没有看到下方给出的类图,因此结构十分混乱,也没有什么头绪,导致设计出来的代码常常是拆东墙补西墙一样的,这里解决了那里又出现了问题。在一次延时后,我才发现后面给出的类图,重新对代码进行设计处理,才有了现在的程序。

7-1的圈复杂度↑

7-2的圈复杂度↑
现在写代码和以前相比已经好了很多,基本上不会出现复杂度大于10的情况了,相比以前结构也有了很大的改善。

这两道题目的类图与给出的类图相同,说明类设计符合要求。
2.题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
这两道题目都是关于ATM机的问题,其中由于题目集8是我第一次接触,导致我在设计的时候依然十分混乱,各种关系也没能够分析完善,导致类间关系混乱,并且也不符合生活实际。
能够从类图中看出来,各种关系,比如银联、用户、账户、银行卡之间的关系是混乱的,根本不符合生活逻辑,因此写出来的代码十分杂乱无章。
而题目集九则是在老师给出的代码基础上再进行修改,因此类间关系就相对明了,也明显更加舒服,能很清楚的看出各种结构以及实体之间的关系。
三、采坑心得及改进建议
1. 题目集7
这两道题都是在图形继承基础上进行的,因此也算是比较熟悉了,在实体类方面已经算是处理的得心应手了,不过在处理排序方面由于一开始没有注意看要求以及指导册,导致设计比较混乱,arraylist也没用到几次,还没有用到正处。由于后面题目集又开放了一次,最初混乱的版本也没有存下来,因此不在这里贴出来了。
在网上寻找参考的时候,我看到很多人使用了Collections方法,我便去找了它的使用方法,一开始我看见了Collections.sort()方法,能够直接对list进行排序,可当我实际使用进去的时候,会一直显示报错,因此我只能使用Collections.swap()方法,交换前后的位置,计算机在处理的时候可能会更麻烦一点。
public void cardSort() { for(int i = 0; i < cardList.size(); i ++) { for(int j = i + 1; j < cardList.size(); j ++){ if(cardList.get(i).getShape().getArea() < cardList.get(j).getShape().getArea()) Collections.swap(cardList, i, j); } System.out.print(cardList.get(i).getShape()); } }
原理上看起来就和以前学过的冒泡排序、选择排序等排序方法一样,不过将前后两个元素交换的过程简化了,可以看出还是十分方便的。
改进建议:尽可能解决掉Collections.sort()方法出现错误的问题,在此基础上进一步简化代码。
2. 题目集8
在一开始写ATM的时候,我并没有认真的分析各种类之间的结构,导致了我写出来的代码结构十分不堪入目。
class UnionPay { //银联 Bank bank; ArrayList<Card> car =new ArrayList<>(); public UnionPay() { super(); // TODO Auto-generated constructor stub } public ArrayList<Card> getCar() { return car; } public void setCar(ArrayList<Card> car) { this.car = car; } public void setUser() {//初始化用户 } } class Card { private String cardNumber; private double balance = 10000.00; private String code = "88888888"; Account account; public Card() { super(); // TODO Auto-generated constructor stub account = new Account(); } } class Account { private String Account; User user; Bank bank; public Account() { super(); // TODO Auto-generated constructor stub } } class Agent {//代理类 private String card0; private String atm1; private String code; private double money; private UnionPay unionPay; private ATM atm; private Borrow borrow; private Save save; private Card card; public Agent() { super(); // TODO Auto-generated constructor stub } }
已省略部分代码,仅展示类间调用关系
一开始我以为银联才是最终的控制终端,因此将所有用户的信息都存进了银联之中,然后再一层层的向下调用,ATM机反而和银行没有了关联。看到老师的代码我才发现各种调用关系的正确使用方法。
在使用我杂乱的代码提交成功后,我发现有很多测试点都没有通过。

然后在后来我尝试修改的时候就发现我设计错误导致我修改的各种麻烦,有点时候死活都找不出逻辑问题,但他确实存在错误,但是已经来不及了,大体结构已经定了下来,除非重新写一个新的程序。
改进建议:调整类间关系,处理好实体类的上下级关系。在写代码之前先分析每个实体之间的关系,以免后续关系混乱,导致代码修改困难。
3. 题目集9
一开始拿到题目我还是有点手足无措的,虽然上一个题目集写过,虽然有老师给的代码,但我还是对于这方面的理解有一点的弱了,因此看到更复杂的题目还是会不知道从哪里去下手。
在分析老师的代码过后,我决定先从用户增加下手,走一步看一步,在原本银行的基础上增加了新的银行,增加了新的ATM机,以及新的用户。
Bank ccb = new Bank("1001","中国建设银行"); Bank icbc = new Bank("1002","中国工商银行"); Bank abc = new Bank("1003","中国农业银行"); unionPay.addBank(ccb); unionPay.addBank(icbc); unionPay.addBank(abc);
新增加的银行
ATM aTM7 = new ATM("07",abc); ATM aTM8 = new ATM("08",abc); ATM aTM9 = new ATM("09",abc); ATM aTM10 = new ATM("10",abc); ATM aTM11 = new ATM("11",abc);
abc.addATM(aTM7);
abc.addATM(aTM8);
abc.addATM(aTM9);
abc.addATM(aTM10);
abc.addATM(aTM11);
新增的ATM机
User Zhangsanfeng = new User("360345600512434223","张三丰","13025686987"); User Linghuchong = new User("360805600578963578","令狐冲","13825345632"); User Qiaofeng = new User("360905600514567923","乔峰","13325098987"); User Hongqigong = new User("360905600576567653","洪七公","13924345436"); Account ccbDcc1 = new Account("3640000010045442002",10000.00,Zhangsanfeng,ccb,1); Account icbcDcc1 = new Account("3640000010045441009",10000.00,Linghuchong,icbc,1); Account abcDcc1 = new Account("3630000010033431001",10000.00,Qiaofeng,abc,1); Account abcDcc2 = new Account(" 3630000010033431008",10000.00,Hongqigong,abc,1); ccb.addAccount(ccbDcc1); icbc.addAccount(icbcDcc1); abc.addAccount(abcDcc1); abc.addAccount(abcDcc2); Zhangsanfeng.addAccount(ccbDcc1); Linghuchong.addAccount(icbcDcc1); Qiaofeng.addAccount(abcDcc1); Hongqigong.addAccount(abcDcc2); Card ccbCard11 = new Card("6640000010045442002","88888888",ccbDcc1); Card ccbCard12 = new Card("6640000010045442003","88888888",ccbDcc1); Card icbcCard13 = new Card("6640000010045441009","88888888",icbcDcc1); Card abcCard14 = new Card("6630000010033431001","88888888",abcDcc1); Card abcCard15 = new Card("6630000010033431008","88888888",abcDcc2); ccbDcc1.addCard(ccbCard11); ccbDcc1.addCard(ccbCard12); icbcDcc1.addCard(icbcCard13); abcDcc1.addCard(abcCard14); abcDcc2.addCard(abcCard15);
新增的用户代码
因为增加了贷记卡,因此在账户上进行区分,我一开始并没有区分,导致后面贷款操作出现了错误,甚至无法识别贷记卡或是借记卡,因此我在每个账户后面添加了区分,使用1或者0进而区分是贷记卡或是借记卡,从而方便后续判断。
由于一开始忽略了合法输入的判断,因此每次测试贷记卡或者跨行的时候数据都会报错。
后来还和舍友讨论了关于税率的问题,在我认识里,取出来的钱是已经扣过税后的钱,但感觉好像有有些不对劲,当时改了挺多次的,一直卡在借记卡跨行取出所有钱后到底是什么样的。谁想到最后问过别的同学之后发现原来要报出数据错误,而不是计算,毕竟要取的钱加税收要比原来账户有的钱多嘛。
果然在使用老师改进之后的代码后,各种改动也都顺畅了许多,尽管还有部分点没有通过

以后也要争取向这方面去发展!
改进建议:完善代码,解决剩余问题,找出所说部分问题,尽量调整。
四、总结
通过这几次的题目集,更让我对于类的继承设计有了进一步的了解,也让我对于类间关系的重要性有了进一步的认识,没有一个良好的类间关系,会对整体代码、程序的运行造成很大的障碍,也会使后续维护与改进变的困难。今后在写代码之前要先判断好各种实体之间的关系,然后设计好每个类直接的关系后再进性后续写代码的操作,以防造成更多不可逆转的损失。
通过这几次题目集的训练,我对于ArrayList的使用也有了进一步的认识,它不仅仅是简单的数组或是链表一样的东西,能够将其灵活应用将会对后续的各种操作带来极大的便利。
同时这几次的题目也让我认识到我所学习的远远不够,我需要更多的知识来提高我个人的能力,增强竞争力。不能光局限于书上所学,多想身边的人学习,多想其他人学习,遇到不会的及时去解决,这样才能不断的进步,不断的去积累知识。
我知道自己还存在许多的不足,经常在题目集结束之后才找到解决错误的方法,还需提高自己的学习效率,以及加强与老师同学的沟通,我也意识到了有时候一个人的力量是有限的,与人沟通的时候往往能够拓宽思路,找到新的解决方案。在今后的学习中,我要以更加积极的态度去面对困难与挫折,不逃避,也要改掉自己的坏毛病。
千里之行,始于足下,什么时候开始都不算晚!
浙公网安备 33010602011771号