第三次博客作业

后三次作业总结


前言

        这三次题目集的题目量都较少,但是整体难度却不小,而且都是紧贴面向对象进行设计的,不是那种可以直接动手的题目,需要先仔细思考才能下手。

1、在知识点上,题目集7涉及了对继承和多态的运用,ArrayList泛型的应用方法还有Comparable接口及泛型的应用,还有单一职责原则的应用和“开-闭”原则的应用,不过整体难度不是很大

2、题目集8只有一道题,但是难度却不小,需要我们通过ATM机业务背景自己去设计类间关系,题目本身逻辑简单,考察在实体类,业务类的设计,以及为后续迭代拓展,需要做到设计严谨,关系错综复杂,调用数据时需要小心谨慎

3、题目集9也只有一道题,是题目集8的升级版,增加了跨行和透支的余额的功能,整体难度还好,但是在进行代码的编写时还需要考虑清楚手续费扣款的各种情况


分析合集

1、题目集7(7-1)

7-1 图形卡片排序游戏

考虑一款适合于小学生的卡片(Card)排序游戏,其规则为随机发放一些卡片给学生,卡片分为四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid),并给出各种卡片的相应参数,要求学生能够迅速求出各卡片的面积大小然后将卡片按照其面积值从大到小进行排序,同时求出所有卡片的面积之和。 

设计与分析

相应类图:

SourceMonitor的生成报表:

        对于这道题目,通过设计出一个抽象Shape类,进而对Shape进行拓展出三角形,圆形,矩形,梯形类,其中在主类进行对象合法性的检验以及对应图形数量的添加。在不同的主体类中有着大致相同的方法:求面积,合法性校验,Set,Get方法,在DealCardList业务类中进行对对应具体图形类属性的添加,进而将实体类与业务类联系起来。这道题目整体不难,就是在排序的部分,对于ArrayList的运用不太了解,经查阅资料方能正确使用自带的排序方法。设计遵守了单一职责原则以及“开-闭”原则,便于7-2题目的拓展功能添加。


2、题目集7(7-2)

7-2 图形卡片分组游戏

沿袭作业 7-1,本次作业主要对卡片(Card)进行分组游戏,其规则为随机发放一些卡片给学生,
卡片仍然分为四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid),并给出各种卡片的相应参数,要求学生首先根据卡片类型将所有卡片进行分组(一个类型分为一组,所以最多四组),然后能够对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片的面积之和,最后求出每组卡片面积之和中的最大值。 

设计与分析

相应类图:

SourceMonitor的生成报表:

        这道题目跟上一道比起来,要复杂许多,添加了许多功能,添加的功能有:对初始求出的面积数据进行分组;对分组后的数据在组内进行排序;得到全部图形中的最大面积。在进行代码的编写中,考虑到要将各个图形分组,所以我一开始就直接将它们进行分组,也便于后面对分组后面积的排序。在进行输出的时候,要注意空格和“[]”的输出,而且通过使用ArrayList分组排序更加方便,对象的处理因此更为高效。

采坑心得

        这里要注意对第一个输入的数判断是否为0,因为,如果没有就会输出以下内容,所以第一个测试点一直都不能通过:

改进建议

应该加上判断:

如下所示,对于输出,应该直接定义一个函数,减去冗余的代码,直接传参进行输出就简洁明了许多


递进式设计分析总结

        两次作业带来的感觉就是面向对象设计在添加功能上的技巧性与规范性十分重要。若为了添加功能反复的使用if语句以及for语句,则是面向过程编程的设计思路,虽然可以同样实现功能但是若数据庞大,则难以进行功能的添加与数据的处理。不难看出第二题是第一题的扩展与递进,进一步的提高了难度,做到了图形分组,不同的图形到不同的组,然后在组里面排序,然后求和求最大面积,可以看出提高了对信息处理的难度,各个图形属于图形,所以将Shape类抽象化,从而提高了程序的拓展性,这两道题对于我们面向对象的编程思想都有所提高。


3、题目集8(7-3)

7-3 ATM机类结构设计(一)

编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能。尝试使用面向对象技术对银行用户在 ATM 机上进行相关操作的模拟系统设计,上述的相关概念均要设计为实体类,业务(控制)类请自行根据实际需要进行扩充和完善。  

设计与分析

相应类图:

SourceMonitor的生成报表:

        对于这道题,首先要构建银行类与账户类之间的关系,银行和账户之间是关联关系,银行用户拥有自己独立的银行账户,而银行账户通过银行卡进行操作,ATM机作为银行服务于用户的机器,联系着银行与账户。将数据插入到实体类中,构建出属于数据储存库,保证调用对应账户或者银行卡号不会错乱,在主类中利用正则表达式对输入的情况进行不同的分支走向,比如通过空格分隔元素得到是存取款还是查询余额。通过合法校验的数据则进行数据处理,通过依次对应的if语句,逐一进行判断,层层检查,最后输出结果。

采坑心得

        在解题之前要分清楚各个类之间的关系,银行与银联,银行与账户,银行与卡,只有在一开始掌握好实体类之间的关系,才能解出这道题。


4、题目集9(7-1)

7-1 ATM机类结构设计(二)

编写一个银行 ATM 机的模拟程序,能够完成用户的取款以及查询余额功能。尝试使用面向对象技术对银行用户在 ATM 机上进行相关操作的模拟系统设计,上述的相关概念均要设计为实体类,业务(控制)类请自行根据实际需要进行扩充和完善。 

设计与分析

相应类图:

SourceMonitor的生成报表:

        和前一次的数据对比可知,这次多加了隶属银行“中国农业银行”以及账号种类,银行卡包含借记卡和信用卡两类,其中,借记卡无法透支,也无需考虑透支取款手续费及透支最大限额的问题;而贷记卡则需考虑。且此次ATM允许跨行办理相关业务,值得注意的是,跨行需扣除一定的行取款手续费。

采坑心得

        主要是跨行取款,一开始要判断ATM号是否正确,然后又要判断是否是本家银行的ATM,如若不是,又要判断是哪家银行的ATM机,重复判断很麻烦,而且对于取款来说更麻烦要分成是否在本家银行取款,然后再判断是否为透支取款,如若为透支取款,又要判断是取完后透支还是取前就以透支,确实有点麻烦。

改进建议

        这道题目整体书写运用的还是面向过程来完成的,实际没有起到练习的作用,应该多设定几个实体类,这样对数据的处理会更加方便,还有数据校验类,用来数据的计算会让代码更加清晰。设计思维需要改进,在每次写代码解题之前就想清楚,各个类之间的关系,以及这个类有怎样的功能,该承担怎样的职责,把这些全部想清楚这样就在写代码时大大的提高了我们的效率。


ATM机仿真题目的设计思路分析总结

        这两道题目还是有一定的难度的,不再拘泥于对部分数据的处理,而是将实际的问题变成了题目,考察了我们对于实体类设计,怎样用Java实现具体的功能,对我们有了进一步的提升,在解这两道题目我们最先考虑到的是类的设计方法,怎样设计实体类的功能,以及在 最开始要弄清楚,银联与银行,银行与账户,账户与卡号之间的关系,只有在一开始我们把所有的关系都理清楚之后,我们才能去设计出我们需要的类,之后在解题的时候就是考虑到所有的情况,跨行取款,跨行透支取款,先不跨行取款再跨行透支取款这些较为复杂的情况,这两道题才能拿到满分。总的来说,这两道题目考察的内容较为全面,对于我们的能力有了进一步的提高。


总结

        本阶段的作业谈的不再是难点,而是更加贴合实际的功能实现。这一阶段的题目所涉及的知识点则是前面学习的多种知识点进行串联而成,但是在进行代码的书写过程中,完成的却有点艰难,还需要进一步提高自己的编程思维,在解题时提前设计好类之间的关系,类的功能,这样写起来代码很快,效率高。在这一阶段的学习中,对于作业难度并不是以往的设计好的算法去实现,前几次阶段的题目更像是套着面向对象的壳去用电脑完成数学题。这一阶段本身题目逻辑并不复杂,考察的是我们对于一个事物去实现,我们该如何去做的一个好的设计,设计围绕着可维护,可拓展,以及后续根据源码去添加功能,都在让我们学习并实际去运用着面向对象编程的设计思想。

posted @ 2021-12-14 19:54  爱吃巧克力慕斯蛋糕  阅读(65)  评论(0)    收藏  举报