OO第三次博客作业

一、前言:

    经过这三次的题目集练习,也有了一定的收获。在题目集7中主要练习的知识点为掌握类的继承、多态性使用方法以及接口的应用。此次题目集的难度、题量都一般。而后两次题目集题量较少,但难度较大,主要的知识点为类的封装性及类间关系设计(关联、组合及依赖)以及抽象类、继承与多态的掌握。在题目集7中,主要新增了接口的应用,需要应用Comparable接口,并按题目所给的图形面积大小重写其中的比较方法。而在第二题是在第一题的基础之上,新增了对所给的图形进行分类、分组,并对每组中的图形按照面积进行排序,且同样运用到了Comparable、Comparator接口。而后两次题目集为设计ATM机类结构,主要需要实现对银行账户实现存取款及查询余额的操作,题目集8主要练习类与类之间关系的设计,其中包括银联、银行用户及账户、银行卡、ATM机等类。而在题目集9中则是在题目集8的基础之上新增了借记账户和待机账户,因此增加了对抽象类、继承的运用。

 

二、设计与分析:

    在题目集7中,题目要求根据所给的不同图形及相应图形参数设计相关的类,并实现相应的求面积的方法,在求出面积之后需要对图形按照面积大小进行排序,且在排序时需要使用Comparable接口实现对图形的排序,最后再求出所有图形的面积总和。

    首先设计对应的图形类,先设计Shape类作为所有图形的主类。并设计相关图形对应的子类(Circle、Rectangle、Triangle、Trapezoid),其中Shape为抽象类,并在其子类中重写对应的求面积的方法。再添加Card类,其中的一个属性为Shape类,用于存储一个图形。最后再添加DealCardList类,用于存储所有的Card其中包含检验图形参数是否合法、排序、求和等方法。其中在Card类中使用了Comparable接口,并根据图形面积大小重写compareTo方法,从而可以直接对其进行排序。

    复杂度分析:

    

    以及总体类图:

    

    在第二题中新增了几个功能,需要将不同的图形进行分类、分组,并对其组中的图形进行分别排序,最后求出所有的图形面积的总和并输出所有图形中面积的最大值。

    首先对输入输出的数据格式进行处理,并校验输入数据是否合法,其对应的方法在DealCardList类中。再判断输入的图形种类,并存储到对应的组中。其中在DealCardList类中添加不同的组,用于存储不同的种类的图形,其实现方法是使用多个ArrayList。在处理完所有的输入数据后,分别对每组中的图形按照面积进行排序,其对应的方法在DealCardList类中的cardSort方法。由于使用了Comparable接口,所以直接调用对应的排序方法即可,最后在输出每组排序后的图形面积。下一步是求出每组图形的面积总和,其对应的方法在DealCardList类中,具体实现为遍历每组中的Card获得对应的图形面积,并将其加至结果中,最后输出结果即可。最后一步为求出所有图形中面积的最大值,对应的方法也在DealCardList类中。具体实现为遍历所有图形,与当前所获得的最大值比较,若更大则代替原来的最大值,最后输出结果。

    复杂度分析:

    

    以及总体类图:

    

    相较于上一题,这题类图有了一些变化,添加了一些对应的方法。

    

    对于后两次的题目,相较于前几次,这次题目并没有给出类之间的关系,因此需要我们自己设计。尤其是第一题,主要的知识点便是考察类与类之间的关系的设计,再者就是类的封装性。主要的类有银联、银行用户以及账户、银行卡、ATM等类。开始的想法是类中包含各个银行,银行之中包含银行用户,用户有多个账户,因此账户包含在用户中,在账户上有多张银行卡,而ATM包含在银行中。但后来才知道这种设计并不是很合理。经过修改后,用户并不包含在银行中,账户不仅包含在用户中,还直接包含在银行中。

    首先处理输入输出的数据格式,存储相应的用户名、账户号、银行卡号、余额等,以及其所属的用户及银行。并判断属于哪种业务。下一步是判断输入数据是否正确,若不正确则输出相应的提示。若输入正确后进行下一步。若业务为查询余额,则根据输入的卡号,找到对应的用户以及银行,输出其账户上的余额。具体实现为遍历所有用户列表,再遍历其中的账户,再遍历其中的银行卡,判断卡号是否一致,若一致则查找结束。若业务为存取款,则根据输入的用户名、银行、ATM编号以及存取款金额进行存取款操作。具体实现为与查询余额一样,遍历所有的数据,根据输入的信息定位到具体的用户、账户、银行、银行卡、ATM机,然后再在定位到的位置上进行存取款的操作,并修改余额,最后在输出结果。

    复杂度分析:

    

    以及总体类图:

    

    可以看出设计并不是很合理。因此在第二题中,不光新增了相应的功能还重构了代码,使类与类之间的关系更加合理。

    

    在第二题中,将账户分为借记账户和贷记账户,并且支持跨行办理相关业务,待机账户可以支持透支,且透支需要支付手续费,银行卡也分为借记卡和信用卡。由于此次作业主要考察抽象类、继承与多态,所以很明显地知道要将账户添加一个抽象类,并添加其子类分别为借记账户和贷记账户,并重写不同的存取款方法。由于手续费的存在,需要先判断余额是否支持存取,所以也要重写对应的方法。手续费率的设置分别在银联和银行中设置。其余与上一题相比并无太大改动。

    复杂度分析:

    

    以及总体类图:

    

 

    可以看到,相比于上一题的类结构设计更加地合理,且新增了工具类,用以执行相关业务,以及判断输入数据是否合法。账户也为借记账户和贷记账户,也分别设置了对应的类,并重写了对应的存取款方法和判断余额是否能够执行存取款操作地方法。

    

三、踩坑心得:

    在题目集7中,主要的难点在于对Comparable接口的使用,由于以前并未使用过Comparable接口,所以使用起来并不是很熟练。一开始重写compareTo的方法时并不清楚返回-1、0、-1分别代表什么,上网查找了相关说明和资料后才弄明白。也因此加深了对Comparable接口的理解和使用。 

    

    在题目集8中,开始并不是太理解类与类之间的关系,不太清楚类的功能及作用,以及包含等的关系,所以设计地并不是很合理。在仔细学习和理解了一遍后终于弄明白了类之间的关系。并添加了工具类,以方便存取款、查询余额等相关操作。

    在题目集9中,由于新增了借记账户和贷记账户,其中贷记账户允许透支余额,因此这里便涉及到了在存取款时需要分类处理。由于一开始对多态的理解并不是很深,所以在实现相关操作的时候是直接判断输入的是那种账户,再执行相应的存取款方法。在仔细学习和理解了一番多态的概念和知识后,才对多态有了基础的认识。并设置账户类为抽象类,添加借记账户和贷记账户类,重写对应的存取款方法,这样就可以直接调用存取款方法,而不再需要去判断属于哪种账户。

    

四、改进建议:

    在题目集7中,应将不同的图形所具有的参数写在子类中而其共有的属性和方法等可以写在其父类中,对于共同具有的方法,而具体实现不同的方法,可以在父类中添加相应的抽象方法,在子类中重写该方法,以达到继承和多态性。

    在题目集8和9中,类与类之间的关系的设计极其重要,在设计和分析是应该做到对每个类的功能和职责深入理解、了如指掌,只有这样才可以设计好类与类之间的关系。每一个类都有其自己的作用和职责,不互相交错,才可以做到可持续改进。

 

五、总结:

    经过这三次的题目集练习,让我对类的封装、继承和多态有了一个全新的认识,尤其实在多态的具体实现上,有了进一步的深入理解。在类与类之间的关系的设计上也有了初步的理解,但还需继续深入学习,逐渐完善这方面的思想及设计方法。在代码上也应做到可持续性,以及可复用性,以便可以做到持续改进。在今后的学习里,应该继续努力学习,完善面向对象的设计思想和理念。

posted @ 2021-06-18 14:14  qweqqewe  阅读(85)  评论(0)    收藏  举报