Blog3

(1)前言:

 

  题目集7

  1,图形卡片排序游戏----考察对图形的继承,求面积使用多态,重写Comparable接口中CompareTo方法来排序。

  2,图形卡片分组游戏 ----以上题为基础,进一步考察arraylist的应用,以及面向对象设计的“单一职责原则”和“开-闭”原则。

 

  难度分析:第一题:经过前面对继承和多态的学习,对图形的继承和多态较为熟练,

       唯一需要考虑的点,就是对Comparable接口中CompareTo方法的重写,经过查阅资料,重写该方法也较为简单。

       第二题:在第一题的基础上进一步改进和完善,使其实现面向对象设计的“单一职责原则”和“开-闭”原则。

       因此总体而言,此次题目集较为简单。

 

     

  题目集8

  1,ATM机类结构设计(一) -----对前面学习的综合性考察,由业务背景,自行设计程序结构,重点考核类的封装性及类间关系设计(关联、组合及依赖)

 

  难度分析:该题由业务背景,设计程序结构。就必须理清各实体类的关系(关联、组合及依赖)、以尤其是一对多的组合关系,以及对实体类的设计要做到单一职责原则。

       此前从未做过此类练习,因此该题对我而言,非常吃力,但也因此学习到更多的知识。

 

 

  题目集9

  1,ATM机类结构设计(二) -----以上一题为基础,新增信用卡,重点考察继承、多态及抽象类的应用。

 

  难度分析:由题目集8中的代码进行进一步改进和完善,实现新的功能。难点在于新增的实体类(信用卡),与之前的类结构的关系,以及进一步完善程序结构。
 

(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泛型的应用方法。

 

需要进一步学习及研究:

接口和抽象类的使用;

无法熟练的对方法进行重写;

类的结构设计,以及对各实体类关系的理解,还需加强学习。

 

posted @ 2021-06-18 10:01  见到  阅读(115)  评论(3编辑  收藏  举报