OO第三次博客作业总结

Posted 可乐不加冰xch

tags:

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

20201124-熊彩虹

一、分析与总结

1、第七次作业

(1)作业总体总结:

         第七次作业只有两道题目,题目量适中。其中两道题都是对图形面积的处理,但第二题稍微要比第一题稍加复杂些许。在刚接触题目一的时候,觉得题目稍微有一些棘手,但是在解决第一道题之后,就大致理解题目的解决思路。在知识点方面,两道题都是考验了对类的设计,以及继承、多态的运用,考察程序是否符合的“单一职责原则”,“开-闭”原则。其次在第二道题中考察了对泛型的使用,和Comparable、Comparator 接口的应用。7-2相较于7-1还增加了对ArrayList 工具类的使用。

(2)题目分析:

         1)7-1分析:

         圈复杂度:

 

 

         类图:

 

        分析:在类的设计方面,对圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid)均设计了一个类,使得程序符合“单一职责原则”,除此之外设计了一个Shape类,而各个图形均继承自Shape类,并在Shape类中写入抽象的处理面积的方法,在各个图形类中再根据各个图形不同的求面积方法复写处理面积的方法,实现了代码的多态。在该题中,因为有要求要将每个所得数据经行大小排序。第一反应是使用冒泡排序法或者其他方法解决,但经过老师的提示之后,选择使用了ArrayList 工具类中的cardSort()方法,该方法可以直接将ArrayList中的数据按从大到小的顺序排序,使得代码更加简洁。

         2)7-2分析

         圈复杂度:

 

 

         类图:

 

         分析:由于第二题是在第一题的程序上进行深入研究,因此在第一题累计下来的不少经验在第二题中也适用。比如对程序类设计的思路以及ArrayList工具的使用在。除去两道题的相似点之外,第二题涉及了接口以及泛化的知识点,还有Comparator和Comparable。其中泛化了解了是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序。简单一点即是Comparable是将类内部的和外部传入的比较排序,而Comparator是将两个需要比较的值均传入类中,再将二者进行比较,得出结论。

(3)踩坑心得

         1、在刚拿到题目时,看到有考察排序算法的时候,第一个反应是使用冒泡排序法等算法,但是在得知有ArrayList工具之后,立马决定改用ArrayList工具,这在很大程度上简略了程序,缩减了代码长度等。

         2、在对比Comparable和Comparator方法时,二者均进行了尝试。首先是Comparable,由于这个方法是将内部的数据与外部传入的数据进行比较得出结论,又因为在类设计时,将Card类继承自Comparable,于是在在Card类中具体实现比较的方法,这样在实际调用比较方法时则可以直接将对象的数据与其他数据进行比较。第二个是Comparator方法,这是将两个需要被比较的对象同时传入方法中,若是使用这个方法,Card类就可以不继承自Comparator方法也可以直接调用(使用双重循环就能将动态数组中的数据传入),即在Comparator中就将比较方法写全。但是这样的话,程序的灵活性就稍微没有使用Comparable好,因为若是在日后需要增加一种新的比较方法,就比较不方便,因此使用接口来完成程序是非常有必要的,但同时也要牢记“开闭原则”。

(4)改进建议

         通过这一次的作业,对ArrayList工具类有了一定的熟练度,对接口方面和Comparable,Comparator也有了更深入的理解,但是这次的作业还是反映出了一些问题。首先就是对类间关系中的泛化不够熟练,需要尽快查阅关于“泛化”的资料,掌握它。

 

 

2、第八次作业、第九次作业

(1)作业总体总结:

         这两次的题目都只有一道题,且题目内容是不断更进的,于是将这两次的作业放到了这块儿总结。首先两次作业的题目量都不多,但是作业都有一定难度。题目是要求对银行用户在 ATM 机上进行相关操作的模拟系统设计,考察了我们对类的设计,以及实体类和业务类的理解。程序存取款问题实际上并不是特别难,但是题目考察了许多知识点。首先是对AraayList的查找。用户在ATM机上输入卡号,我们需要从用户输入的卡号获取用户的账户所隶属的银行等信息,于是需要使用查询的方法。第一次作业使用的是从上往下查询的方法,第二次作业使用了从下往上查询的方法,因此也学习到了双向绑定的知识点。从下往上查询的方法相较于从上往下查询的方法效率也会更高。在第九次的作业中还增加了借记卡和信用卡的区分,跨行收取手续费以及超支收取手续费的问题,在第八次作业的基础上难度更上一层楼。

(2)题目分析:

        1)第八次作业

             圈复杂度:

           

 

 

             类图:

 

            分析:在这一次作业中依旧是考察了类以及类间关系的设计,这一次作业不像以往的作业一样给了类图或提示,这一次只给定了实体类,除去已知的实体类,还要根据情况自行设计其他业务类。在此我只设计了一个业务类Data类,用来初始化原始的数据。在根据各个数据关系时,选择了一层层递进的方式,换句话说就是将属性放入ArrayList中在声明在隶属的类中。

            在题目中,由于只知道用户操作的ATM编号,以及用户的卡号,于是若想对账号等进行操作,就必须一级一级往上查询。在这里使用了迭代器以及循环,从银联开始一级一级往下遍历匹配,如果匹配成功即将此时的个数据记录下来,也就算是成功查找到用户的信息。

 

        2)第九次作业

             圈复杂度:

 

 

 

              类图:

          分析:第九次的作业实在第八次作业的程度上进行了更深入的研究,在原来的基础上增加了贷记账户,以及跨行收取手续费和贷款时收取手续费。这一次在设计类时,取消了原本用来初始化数据的Data类,而选择将初始化直接放在了Main函数中。设计了WithDraw方法用来具体处理存取款问题,设计了一个Card父类,CreditCard和DebitCard两个实体类继承自它,在两个子类中分别复写不同的具体取款方式,实现程序的多态。

          另外,在第八次作业中我们同样遇到了一个棘手的问题,就是已知卡号获取其账户等信息,在上一次的作业中选择了从上往下的查询方式,但这个方法有一定的缺陷,因为若是数据少或许影响不大,但是一旦数据繁多,那么一项项数据去匹配就非常浪费时间以及会导致效率低下。所有在第九次作业中,选择了从下往上双向绑定的方法去寻找。在设计类的属性的时候就将该类所隶属的类设计成该类的属性(比如账户隶属于银行,那么就将银行设计成账户的一种属性),这样在查询卡号的所属信息就可以大大节约时间,提高程序的效率。

 

(3)踩坑心得

         1、在弟八次作业中对查询功能的使用有误,最初在编写代码时,错误的将默认将查询功是放在最后,忽略了在存取款中途查询余额的情况。于是在判断完卡号后接受输入的密码时,判断输入的密码是否是19位或者是“#”,若是19位则代表用户再次输入的是卡号,则再继续至循环开始处,若输入的是“#”则代表用户结束输入,则进行查询后结束程序。

 1             if(card.idValidata() == false || flag == 0) {
 2                 System.out.println("Sorry,this card does not exist.");
 3                 System.exit(0);
 4             }
 5             passport = input.next();
 6             if(passport.length() == 19) {
 7                 System.out.println("¥" + df.format(account.getBalance()));
 8                 cardNum = passport;
 9                 continue;
10             }
11             if(passport.equals("#")) {
12                 System.out.println("¥" + df.format(account.getBalance()));
13                 System.exit(0);
14             }

         但是这样的写法仍然是有漏洞的,因为还有其他未考虑周全的地方。

         相较于第八次一个数据一个数据的读入,第九次作业选择了一次性将所有数据读入,再将数据按行划分后放入动态数组中,再将动态动态数组中的数据按空格划分成另外一个动态数组存放。这时在判断是否是查询功能的时候只需要判断第二次划分出的动态数组的长度,若数组长度为1,则为查询余额的功能,否则就进行存取款的功能。

 1         String[] dt = sb.toString().split("\\n");
 2         for(int i = 0; i < dt.length; i++) {
 3             String[] dataLine = dt[i].toString().split("\\\\s+");
 4             
 5             if(dataLine.length == 1) {//查询
 6                 GetBalance gb = new GetBalance(unionPay);
 7                 System.out.println("业务:查询余额 " + String.format("¥%.2f", gb.getBalance(dataLine[0])));
 8             }else {
 9                 Withdraw wd = new Withdraw(unionPay,dataLine[0],dataLine[1],dataLine[2],Double.parseDouble(dataLine[3]));
10                 wd.withdraw();
11             }
12         }       

        2、在第九次作业中由于增加了跨行收费以及贷款收费,且贷款透支金额最大为50000,于是编写代码的过程中,疏忽了一种较为极端的情况。当用户贷款加手续费刚好等于50000时,若用户还进行了跨行取款,这时就无法进行取款,解决方法就是在CreditCard的取款判断中多加一个判断是不是有跨行手续费且超支的情况,使得程序更加严谨

(4)改进建议

        在这两次的作业中都反映出了一个问题,在判断所有情况时总是不能一次性将所有情况都判断出来,常常会考虑得不够周全,甚至有的时候会为了一时的方便去简化一些小步骤。在日后得学习中不仅编写程序要尽量做好思虑周全,在学习生活中也要思虑周全。

二、总结

       通过这三次的作业,收获颇多。四道题目,两种类型。第一个图形面积的处理,更加熟悉了ArrayList工具类的使用,以及熟悉了Comparable和Comparator的功能以及区别和二者的优劣势。以及两道题中都考察到了复写,使得对代码的多态理解的更加清晰了。在第九次作业中,学会了双向绑定的方法,在很大程度上提高了程序的效率。在日后的学习中,要多熟悉熟悉泛化相关的知识,毕竟目前对这方面还不是很熟练,还有要对思考的问题更加细心,尽量一次性考虑到更多可能出现的情况。

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

第一次OO课程总结

OO前三次作业总结

OO第二次博客总结

BUAA OO 第三次作业总结

oo第三次博客总结

oo第三次总结