第三次博客总结

一、前言

这一次总结第七,八,九次题目集。感觉Java越来越有趣了,学期也马上要结束了,感觉接触java还在昨天一样

在第七次题目集中

通过编写图形卡片排序游戏和图形卡片分组游戏,进一步学习了有关JAVA中类的继承,多态性使用方法以及接口的应用;难度对我来说有些困难。

第八次题目集中

接触到学习JAVA中的题目——设计ATM仿真系统,重点考核类的封装性及类间关系设计(关联、组合及依赖);难度中等

第九次题目集

则是对第八次题目集的改进和提升,在原有代码上进行编写,并增加跨行转账等功能,重点训练内容为抽象类、继承与多态。不过老师给了我们原码,设计ATM机对我们来说是一个不小的挑战,耗费了大量时间去设计各个类之间的关系。

 

 二、前三次作业总结及思考 

1、第七次题目集:

这一次题目是卡片问题,卡片分了各种形状,然后要求他们的面积,体积之类的,这个题目重要的是 要搞清楚各个类之间的关系,关联,继承等,还运用到了接口,搞清楚各个类要做什么,还有对链表的使用,存储哥哥形状的信息,并对它们进行排序

7-1题目要求编写,求出各卡片的面积大小然后将卡片按照其面积值从大到小进行排序,同时求出所有卡片的面积之和。

  • 其中题目要求应用到Comparable 接口,那么就解释下Comparable接口的作用——该接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。

得出结论:从中我们可以看出sort方法对数据中的 String字符串按照一定规则进行了排序。

但当我将这种排序方法运用到本次题目,也就是卡牌排序中,看到不进行排序打印是正常的,但是排序时报错了。原因就是sort() 方法根据指定的顺序对动态数组中的元素进行排序。但如果数组中的对象不是String 而是自定义的类型呢,我们就需要 用到Comparable 接口对其强行排序,才可以成功。

在本次题目 集中使用到了 compareTo 这种自然比较方法

 

 

当程序需要进行改进(额外扩展或者修改定制专有的功能时)时候,应该提供一种抽象来扩展 功能而不是修改原代码。促使我们经量写成不 需要修改的模块,在扩展系统的行为时,我们只 需要添加新的代码,而不需要修改已有的代码 。一般可以通过添加新的子类和重写父类的方法来实现。

虽然对于我们现在来说,看似修改 代码和重写代码两个时间差不多,复杂度也差不多,但如果到了后期,对于代码修改所需成本极大,如果不遵守开闭原则,每次进行扩展时候都需要多之前的代 码进行修改,那么整个维护工作将变 得极度困难、成本惨重。

 

  •  另外在题目7-1的作业指导书中给出了主方法源码
     View Code

     

     

     在Main类中定义一个静态Scanner对象, 这样在其它类中如果想要 使用该对象进行输入,则直接使 用Main.input.next…即可(这样做可以避免采坑)。

 这是一个很使用的小方法

  • 第七次题目集中,最重要的设计当然是迭代的作业设置,这个一开始用起来挺难的,后面用多了之后就会觉 得挺简单的。7-1完成了对于图形名称、图形面积、总面积值的输出,如下图:

接着在7-2中修改总面积输出为最大面积输出,改并在输出格式有所改进,如下图:

 复杂度分析如下:

 

 

DealCardList类复杂度:

 

下面给出该类的

 可以看到这一类主要处理了卡片 的输出格式和总面 积计算及卡片合法性的检测,switch语句和if语 句的连续使用 增加了该类的复杂度,Main类也是同样的问题,但对于Main类来说,最大复杂度为5,原因其实还是 Main类主要 处理的是界面的运行 和其他类的调配,最大复杂度自然会小一些。

 

2、第八次题目集、第九次题目集

第八、九次题目集开始我们接触到了 ATM机类结构设计,是本学期的重点内容。包含了我们  整个学期学习的绝大多数知识,如继承多态、接口、动态数组、抽象类等等,难度不小。

为了方便梳理设计思路,首先给出ATM机设计的类图—————

 

 

 

 

 

 接着我们对整个程序进行分析

ATM机的设计主要包含以下几个实体类:

         1.中国银联(China UnionPay):通过动态数组使各 种银行的添加 和删除,同时在跨行转账,跨行取款 时提供账户信息。

         2.银行(Bank):银行内有变 量为bankNO(银行编号)、bankName  (银行名字)及ATM和Account的动态数组  。Bank类主要与ATM类和Account  有关联

         3.银行用户(User):User类下有变量name方便查找用户对应账户和卡。也有ID和phone,虽然本次并未使用,但为了之后设计完整,仍然添加两个变量,之后使用时候直接调用,而不用再增加。

        4.银行账户(Account):Account类可以说是这个几个类中最重要的一个类,从类图可以看出,它作为一个纽带连接其他几个类,不论是对于获取卡号校验User是否使用正确,或者对业务类Withdraw中校验取款金额是否大于余额或透支金额超过最大透支金额、跨行取款都是不可或缺的。注意:按银行规定和生活常识分借记卡和信用卡,但对应账户分借记账户和贷记账户,

       5.银行卡(Card):card类其实是account的表现形式,Card类中有变量password和cardNO变量,password在本次题目中并无太大作用

 

6.ATM机(ATM实体类):ATM机类内其实并无太复杂的变量,ATMID的作用是为了方便跨行取款时的检测跨行并且计算利息,区分哪家银行等 ,作为一个业务类。

 

 主要是各种数据的储存,还有搞清楚各个类之间的关系,还有如何调用各个类,还有用户的数据及时更新,难度挺大的对于我来说,幸好老师给了源码,我才能从老师的源码中窥出一些端倪,第九次相比我做第八次要轻松很多

 

 Withdraw类中最大复杂度达到了21,可以看到平均方法是5.00,Withdraw类作为一个业务类基本包含了该ATM机器所有主要的方法,比如: 跨行检测并收取手续费、校验取款金额是否大于余额或透支金额超过最大透支金额、校验卡密码是否正确等方法都存储在Withdraw这一类中。这个累可以再改进一下,复杂度有点太高了,可以在另设计一个类,用来校检密码,还有取款金额之类的,输出错误的结果都另一个类来输出正确

 

 

下面给出主类在SourceMonitor的复杂度图:

 

作业总结:

这三次题目集,学到了类继承、聚合等,这些内容中我对类的继承学的较好,这些内容还是不算很难,这三次的题目集大都是大题目,题目量不大,但写起来还是要挺久的。这里还是觉得自己需要提升的还有很多,应该重点分析类与类之间的关系,这才是面向对象的核心。这几次题目集坐下来,我也对"单一职责"原则、"开放封闭"原则理解更深了,也都会尽量屈遵循。
Java课程即将结束,但我知道这只是个开始,毕竟老师也一直和我们说,连老师学到的也只是java的一角,所以学Java的路还很长,

题目集八,一开始不知道怎么开始判断那么多种输入情况,但后来借鉴了以前做过的一些题目,决定使用正则表达式去分类输入。

题目集九,借记和贷记一开始我直接在类里区分,后来老师提醒不能这样做,所以我将他们各自继承card类,就可以达到直接区分。而且跨行取款的利率问题,一开始没有弄好计算的先后顺序吃了很多苦头。

一些难度不是很高的题大可不必给出类图,让我们自己尝试做题思路也不错,我这几次的代码,自己感觉有点乱,常常自己写着写着,回过头来,自己都很难看懂,这应该是我单一职责与封装没有做好的原因,所以我还需要更加深刻的去理解这两个性质,这对我代码的质量很有必要。

 

 

posted @ 2021-06-20 22:16  啊,麻烦死了  阅读(53)  评论(0)    收藏  举报