Blog3
(1)前言:
题目集7
1,图形卡片排序游戏----考察对图形的继承,求面积使用多态,重写Comparable接口中CompareTo方法来排序。
2,图形卡片分组游戏 ----以上题为基础,进一步考察arraylist的应用,以及面向对象设计的“单一职责原则”和“开-闭”原则。
难度分析:第一题:经过前面对继承和多态的学习,对图形的继承和多态较为熟练,
唯一需要考虑的点,就是对Comparable接口中CompareTo方法的重写,经过查阅资料,重写该方法也较为简单。
第二题:在第一题的基础上进一步改进和完善,使其实现面向对象设计的“单一职责原则”和“开-闭”原则。
因此总体而言,此次题目集较为简单。
题目集8
1,ATM机类结构设计(一) -----对前面学习的综合性考察,由业务背景,自行设计程序结构,重点考核类的封装性及类间关系设计(关联、组合及依赖)
难度分析:该题由业务背景,设计程序结构。就必须理清各实体类的关系(关联、组合及依赖)、以尤其是一对多的组合关系,以及对实体类的设计要做到单一职责原则。
此前从未做过此类练习,因此该题对我而言,非常吃力,但也因此学习到更多的知识。
题目集9
1,ATM机类结构设计(二) -----以上一题为基础,新增信用卡,重点考察继承、多态及抽象类的应用。
(2)设计与分析
①题目集7(7-1)、(7-2)两道题目的递进式设计分析总结
题目集7(7-1)----图形卡片排序
类图
SourceMonitor的报表:
题目集7(7-2)----图形卡片分组游戏
类图
SourceMonitor的报表:
分析总结:
在经过前面对图形的继承、多态练习,题目集7(7-1)较为简单,
唯一需要注意的点,就是增加了对接口的使用,
需要对Comparable接口中CompareTo方法的重写,经过查阅资料,重写该方法也较为简单。
题目集7(7-2),在此7-1基础上要求对图形进行分组以及格式化输出,进一步考察ArrayList 工具类的使用。
②题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
题目集8----ATM机类结构设计(一)
类图
SourceMonitor的报表:
题目集9----ATM机类结构设计(二)
类图
SourceMonitor的报表:
设计思路分析总结:
题目集8,银联--银行--账户--卡,依次从上往下聚合,另外ATM与银行绑定,用户与账户绑定。从而实现各类之间的关系。
对输入校验时,从银联依次往下搜索卡号、ATM机、余额等信息。
在题目集9中,要求在题目集8的基础上增加功能,为增加信用卡类,将账户类写成抽象类,借记账户和贷记账户继承自抽象账户类。
(3)采坑心得:
在8-1 ATM机类结构设计(一)中,判断密码是否相等时,遇到问题
在用BigInteger 比较时,用!=判断是否相等,一直无法相等,程序无法进入if中去,程序却也不报错
1 BigInteger password1=new BigInteger("88888888"); 2 if(password!=password1) {//密码错误 3 System.out.print("Sorry,your password is wrong."); 4 return false; 5 }
导致,一直密码错误。
在经过调试和查阅资料后,才得知BigInteger比较要用compareTo 比较,大于返回1,小于返回-1,等于返回0。
改进后:
1 BigInteger password1=new BigInteger("88888888"); 2 if(password1.compareTo(password)!=0) {//密码错误 3 System.out.print("Sorry,your password is wrong."); 4 return false; 5 }
得到正确结果:
9-1 ATM机类结构设计(二)中, 银行的名字是通过账户来获得,没有考虑到跨行的情况
1 public void showResult(Account account,int flag,ATM atm) { 2 String type = ""; 3 if(flag == 1) { 4 type = "取款"; 5 }else { 6 type = "存款"; 7 amount *= -1; 8 } 9 String userName = account.getUser().getName(); 10 String bankName = account.getBank().getBankName(); 11 System.out.println(userName + "在" + 12 bankName + "的" + ATMID + "号ATM机上" + type + String.format("¥%.2f", amount)); 13 System.out.println("当前余额为" + String.format("¥%.2f", account.getBalance())); 14 }
导致输出的银行名字是账户所对应的银行,而非ATM机所对应的银行,导致输出错误
改进后:
1 public void showResult(Account account,int flag,ATM atm) { 2 String type = ""; 3 if(flag == 1) { 4 type = "取款"; 5 }else { 6 type = "存款"; 7 amount *= -1; 8 } 9 String userName = account.getUser().getName(); 10 String bankName = atm.getBank().getBankName(); 11 System.out.println(userName + "在" + 12 bankName + "的" + ATMID + "号ATM机上" + type + String.format("¥%.2f", amount)); 13 System.out.println("当前余额为" + String.format("¥%.2f", account.getBalance())); 14 }
得到正确结果:
(4)改进建议:
在题目集8 ATM机类结构设计(一) 中,对结果进行输出时,使用太多printf
1 System.out.print(business.getUser().get(i).getUserName()); 2 3 System.out.print("在"+business.getUser().get(i).getCard().get(j).getAccount().getBank().getBankName()); 4 5 System.out.print("的0"); 6 System.out.printf("%.0f",atm.getNumber()); 7 System.out.print("号ATM机上"); 8 if(num<0) { 9 System.out.print("存款"); 10 System.out.printf("¥%.2f\n",-num); 11 } 12 else { 13 System.out.print("取款"); 14 System.out.printf("¥%.2f\n",num); 15 } 16 System.out.printf("当前余额为¥%.2f\n",business.getUser().get(i).getCard().get(j).getAccount().getBalance());
对此,可以用String.format输出,让代码简化
1 String userName = business.getUser().get(i).getUserName(); 2 String bankName = business.getUser().get(i).getCard().get(j).getAccount().getBank().getBankName(); 3 System.out 4 .println("业务:取款 " + userName + "在" + bankName + "的" + atm.getNumber() + "号ATM机上取款" + String.format("¥%.2f", num)); 5 6 System.out.println("当前余额为" + String.format("¥%.2f", business.getUser().get(i).getCard().get(j).getAccount().getBalance())); 7
在题目集8 ATM机类结构设计(一) 中,在主程序中对数据初始化
为遵循单一职责原则,因将数据初始化封装为一个类
(5)总结:
学到了什么:
在这三次题目集中,学习到了接口、抽象类的使用,
熟练运用继承、多态;
“开-闭”原则的应用;
ArrayList泛型的应用方法。
需要进一步学习及研究:
接口和抽象类的使用;
无法熟练的对方法进行重写;
类的结构设计,以及对各实体类关系的理解,还需加强学习。