OO第七到九次作业总结

Posted 於靬王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OO第七到九次作业总结相关的知识,希望对你有一定的参考价值。

一、前言

   这是我学习java的第三个月,而这个月的题目虽然少,但难度提升了很多。这几次的题目集主要是继续学习类的继承、多态性使用方法以及接口的应用,还在后两次的题目集中学习ATM机的工作原理,实现ATM机的模拟程序,能够完成用户的存款、取款以及查询余额功能。在写代码的时候发现自己有很多问题不太理解,想来应该是对方法的掌握不够,或是解题方法不清晰。

二、设计与分析

1、题目集7(7-1)、(7-2)两道题目的递进式设计分析总结

这两道题都是关于卡牌大小排序游戏的(规则为随机发放一些卡片给学生,卡片分为 四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid),并给出各种 卡片的相应参数,要求学生能够迅速求出各卡片的面积大小然后将卡片按照其面积值从大到小进行排序,同时求出所有卡片的面积之和)。7-2中要求在最后求出每组卡片面积之和中的最大值。

两道题的输出结构不同,且都要考虑面向对象设计的“单一职责原则”,思考该程序是否能够符合“开-闭”原则。7-2中改变了7-1中 ArrayList 工具类的使用。增强了接口在面向对象程序设计中的作用。

两提类图对比如下:

 

7-1:

 

 

 

7-2:

 

 

 

 

可见两题的类图基本一致,且每个类都完成了相应的任务,实现了单一职责原则。

 

 

 

 

于是,我又用SourceMonitor来测试了两个代码,发现右边的圈复杂度要高于左边。

总结一下,写代码可以多于ArrayList类,这样可以根据下标访问元素效率较高,在数组的基础上封装了对元素操作的方法,可以自动扩容。也有一些缺点,就是查找元素的效率较低。

 

2、题目集8和题目集9两道ATM机仿真题目的设计思路分析总结

1)目标:是编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能。

2)过程:先根据题目给出的提示,创建一些类(ckack类,ChinaUnionPay类,Bank类,Atm类,Account类,Card类,User类,Information类)。在尝试使用面向对象技术对银行用户在 ATM 机上进行相关操作的模拟系统设计,上述的相关概念均要设计为实体类,业务(控制)类要自根据实际需要进行扩充和完善。然后根据题目给出数据全部导入到代码中。我们在ChinaUnionPay类中包含了Bank类,Bank类中包含了User类和ATM类,Account类中包含了Card类,User类中包含了Account类,这样一步一步写下去。在后面加一个Information类来储存信息如下表:

题目集八:

 

 

 

题目集九:

 

 

可以看出题目集九中银行卡包含借记卡和信用卡两类,且允许跨行办理相关业务(例如在中国建设银行的 ATM 机上使用中国工商银行的银行卡进行业务操作)。并且多加了几个人的信息和ATM机的个数。使用面向对象技术对银行用户在 ATM 机上进行相关操作的模拟系统设计,上述的相关概念均要设计为实体类,业务(控制)类请自行根据实际需要进行扩充和完善。这两次的题目都只有一道题,且题目内容是不断更进的。在题目中要用Java Iterator迭代器来进行查找和用ArrayList。

圈复杂度:

 

 

现在来看一下这两题的类图;

题目集八:

 

 

 

题目集九:

 

 

 

在这次的作业中考察的还是类之间的关系构造,且这次只给出了实体类,让我们根据题目给出的提示来设计其他业务类。由于只知道用户操作的ATM编号,以及用户的卡号,于是若想对账号等进行操作,就必须一级一级往上查询。在这里使用了迭代器以及循环,从银联开始一级一级往下遍历匹配,如果匹配成功即将此时的个数据记录下来,也就算是成功查找到用户的信息。

第九次作业是在第八次作业的基础上继续深入研究,在原来的基础上增加了贷记账户,以及跨行收取手续费和贷款时收取手续费,于是我在Withdraw类中做了一些改动,使其判断方面出现一些改动。

三、踩坑心得

  1、在题目集7中,看到那么一堆图形,要求边长和面积之后再进行排序,于是我脑子里就疯狂回想学过有哪些排序方法,像冒泡之类的。但后来突然想到了ArrayList这个工具,于是立刻决定使ArrayList工具,这在很大程度上简略了程序,缩减了代码长度等。还在写代码时发现了一个很好的方法:Comparable方法,一个类实现了Comparable接口,就意味着该类支持排序。 实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。 此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器。

 

  2、在题目集8、9中,一定要用好迭代器Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。迭代器 it 的两个基本操作是 next 、hasNext 和 remove。调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。调用 it.hasNext() 用于检测集合中是否还有元素。调用 it.remove() 将迭代器返回的元素删除。

public static Card getCardbyCardNO(UnionPay unionPay, String cardNO) {
  Card card = null;
  Iterator<Bank> bankItr = unionPay.getBankList().iterator();

  while (bankItr.hasNext()) {
    ArrayList<AbstractAccount> accountList = bankItr.next().getAccountList();
    Iterator<AbstractAccount> accountItr = accountList.iterator();
    while (accountItr.hasNext()) {
      ArrayList<Card> cardList = accountItr.next().getList();
      Iterator<Card> cardItr = cardList.iterator();
      while (cardItr.hasNext()) {
        card = cardItr.next();
        if (card.getCardNO().equals(cardNO)) {
          return card;
        }
      }
    }
  }
  return null;
}

public static ATM getATMbyATMID(UnionPay unionPay, String ATMID) {
  Iterator<Bank> bankItr = unionPay.getBankList().iterator();
  Bank bank = null;
  ATM aTM = null;

  while (bankItr.hasNext()) {
    bank = bankItr.next();
    Iterator<ATM> aTMItr = bank.getATMList().iterator();

    while (aTMItr.hasNext()) {
      aTM = aTMItr.next();
      if (aTM.getATMID().equals(ATMID)) {
        return aTM;
      }
    }
  }
return null;
}

public static AbstractAccount getAccountbyCardNO(String cardNO) {
  Iterator<Card> cardItr = AbstractAccount.getList().iterator();
  Card card = null;

  while (cardItr.hasNext()) {
    card = cardItr.next();
    if (card.getCardNO().equals(cardNO)) {
      return card.getAccount();
    }
  }
  return null;
}

  像这里就是根据卡号获取银行卡,卡号正确则返回卡对象。

四、改进意见

  1、通过这次作业,发现自己对ArrayList方法还不太熟练,以后要加强这方面的熟练度,争取做到精通。ArrayList 中的元素实际上是对象,在以上实例中,数组列表元素都是字符串 String 类型。如果我们要存储其他类型,而 <E> 只能为引用数据类型,这时我们就需要使用到基本类型的包装类。

  2、要多运用面向对象的七大原则,像单一原则和开闭原则等等。

  3、平时写代码时老是出现一些小错误,以后要多注意这方面的问题,减少这方面的错误,这样也能加快写代码的时间。

  4、在这么多次作业中发现自己写的代码圈复杂度较高,所以在以后的代码中我会尽可能少用for循环和if语句,这会显得我们的代码非常繁琐。如输出数组时可以不用for循环,用foreach循环或直接输出数组都是可行的方案。

五、总结

  通过这三次题目集的训练,收获颇丰。我可以比较好的使用ArrayList方法了,并逐渐熟练与掌握,也比较熟悉了Comparable方法的好处。在ATM机的设计中我慢慢熟练地将类之间的关系整合起来,使他们更好的联系在一起。后来我又学会几种好的绑定方法,可以极大提高我们写代码的效率。

  最后我觉得自己应该更加努力的学习java,自学能力有待提高,以后要对思考的问题更加细心,尽量一次性考虑到更多可能出现的情况。希望自己以后越来越好。

 

20201224-徐建强

以上是关于OO第七到九次作业总结的主要内容,如果未能解决你的问题,请参考以下文章

pta作业总结3

OO第三单元总结 —— JML规格

OO第三次博客作业总结

OO第三单元总结

2018春 OO第二阶段总结

OO 第三单元总结:JML?离散!照抄完事。