第三次博客作业

一、前言

  上一次写博似乎是好久之前的事情了,有些课上着上着就把时间观上没了,不知不觉就要期末了。

  自第七次题目集到现在,我对于Java也有了一个初步的了解,继承、多态、聚合……就目前我学的都懵懵懂懂,一知半解,在具体的例子上都不知道怎么用。对于参考代码一看就懂,但自己动起手来一写就忘,一写就错。

  此次博客作业主要总结题目集7-9:题目集7涉及到类的继承、多态性使用方法以及接口的应用,两个题目都是关于卡牌游戏的;题目集8则开始了对ATM机的功能实现,考验学生对设计实体类、业务类及其完善和改进的能力;题目集9则是对题目集8的一次迭代,增加了一些新的功能,老师指导了关于代码的设计及思路。这三此题目集较比之前的,每次题目集发布的跨度较以往的更大,老师给了更多的时间做准备,难度也比之前的更高。

二、设计与分析

(1)题目7-1:

1、类图如下:

2、设计与分析:

  功能分析:

  1. 排序前的各图形类型及面积,格式为图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
  2. 排序后的各图形类型及面积,格式同排序前的输出;
  3. 所有图形的面积总和,格式为Sum of area:总面积值

  错综复杂的线交织在一起,无一不透露出"垃圾代码"的风范。代码一共有八个类,一个主类,一个图形父类,四个图形给子类,一个业务类,一个Card类(应该也算业务类吧)。各种图形均继承Shape类,Card类用了Comparable接口。shape抽象类有求面积、求周长的方法,子类则只用直接对其进行重写即可。card用了list存储。

3、踩坑心得:

  关于三角形输入是否合法的判断,个人还是想了很久的时间。一开始的打算是直接写(假设三边分别为a,b,c):a+b>c,a+c>b,b+c>a……因为三边大小没有排序,每个判断都要写好几遍,觉得很麻烦,便先排序。排完序后直接写了a+b>c,c-b<a。发现有好几个关于三角形的点没过,后面改为( ! a <= 0 || b <= 0 || c <= 0 || a + b <= c|| b- a>= c|| c- a>= b|| c- b>= a)后才可以(其实我到现在还不能理解)

4、改进建议:

  我把所有处理输入数据的方法都丢在了main方法里,这种设计思路还是从C语言来的。后面才发现有一个叫做业务类的名词,就是用来解决这方面的问题的一个名词。所以此代码可以增加一个业务类,把丢在main方法里的获取输出的方法丢在那个类里。也使得代码设计更加清晰,不会为了找处理数据的方法再类图里看半天没看明白(这是我写博的时候的亲身感受,我一直在找一个处理数据的业务类,愣是没看到)。

(2)题目7-2:

  (1)类图如下:

 

 

2、设计与分析:

  功能分析:

  1. 排序前的各图形类型及面积,格式为[图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ],注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格,在结束符“]”之前;
  2. 输出分组后的图形类型及面积,格式为[圆形分组各图形类型及面积][矩形分组各图形类型及面积][三角形分组各图形类型及面积][梯形分组各图形类型及面积],各组内格式为图形名称:面积值。按照“Circle、Rectangle、Triangle、Trapezoid”的顺序依次输出;
  3. 各组内图形排序后的各图形类型及面积,格式同排序前各组图形的输出;
  4. 各组中面积之和的最大值输出,格式为The max area:面积值

  相比之前的题目7-1,题目7-2多了分组后排序的功能、各分组的面积之和的最大值。类图中但依旧是绕来绕去的线。有较大幅度修改的是DealCardList类,因为要对图形分组,我用了许多的list。

3、踩坑心得:

  我没记错的话,这个题目我只用了不到半小时的时间,在前一个题目的基础上修改后提交了。而且对于pta上的测试点是一遍而过。

(3)题目8:

  (1)类图如下:

 

 

 (2)设计与分析:

  老师在老早之前就说过,到时候会有一个atm机的题目,而且要对他进行多次迭代、重构。读完一遍指导书的时候我还是不知道怎么设计,又读了第二遍、第三遍……一直看了七遍,才看懂了大概的内容。

这次的ATM机只有最简单的存取款功能:每人每个账户初始余额1w,不能透支,不能跨行,一个人也只有一个银行上有账户。

(3)踩坑心得:

  因为很多时候你需要某个变量得到另一个变量,这时候双向绑定就显得十分重要。不然就要这样:

 

 一直点,一直点,直到得到你想要的。

(4)改进建议:

  判断ATM机号、卡号、密码、存取款金额都在main方法里,这应该单独写并放在一个类里。在Main类写了一个initIMassage方法用于初始化数据。因为建行和工行分了两个类写,在user类里就有两个list。

改进建议:写在Main类里的初始化数据和读取数据、操作金额等应作为业务类单独开。

(4)题目9:类图:

 

 

 (1)设计与分析:

  相比上一次的ATM,多了借记卡、借记账户、跨行取款;多了两个银行,也多了两个用户,但仍维持在一人只在一家银行有账户。因为许多同学反馈需要源码,老师便提供了,并要求我们在他的原马上进行代码的迭代。相比上一次我写的代码,增加了三个业务类:一个通过各种账号得到相应的类对象,一个输出错误信息,一个计算存取款操作;我将account设为父类,可以借机的账户设为子类;card也是这样的设计。因为使用了双向绑定,相比之前的类图更为复杂,类里面的方法也相应的更多,但是通过某属性获得另一属性相对变得更加方便。

(2)踩坑心得:

  之前写的ATM的代码一直没搞懂账户、卡、用户、银行之间的关系,后面看老师的源码,一点都看不懂,迫于无奈,花了一个晚上加一个上午的时间总算看完了,并且有了大致的思路。感觉简简单单就可以实现的东西,结果花了剩下的好几天时间,在截至日期快到的时候才完成。

(3)改进建议:

   目前还没有涉及密码的修改、校验,用户在不同银行的开户,也没有涉及转账,甚至跨行转账。

三、总结

  每次写完代码,感觉这代码难度“就这样”,有什么难的,大致的设计思路在脑海徘徊,不断有声音在呐喊:就这?现在代码重写一遍肯定不要之前的十分之一的时间。几乎每次都有这种错觉,却没有一次真的去动手第二遍写写试试。关于ATM机的题目,第一次写的不尽人意,在看懂老师提供的源码之后,大致的思路在脑海游荡,有一种重新写的冲动。结果刚敲完public static void main(),我就不知道从何下手,也不愿去回想,什么都没写出来,(好吧,主要还是嫌麻烦T_T),而且虽然有大致思路,却再也没付诸实践。回想起之前写的C语言的代码,那叫一个怀念,好想再回到写那种简简单单代码的时光。现在写代码动不动就是上百行,快要上千了。之前写C语言代码过50行都不得了,甚至还要怀疑是不是写错了。随着代码量的提升,我也能感觉到自己的编码能力有了一定的提升。在脑海里写代码和实际在电脑上敲代码,可能你写的是同一个题目,但是却是两回事。

  老师也积极听取同学们的反馈,对题目的难度、题目的数量、题目涉及的知识点、每次都有详细的调整和解答。也总是积极回答同学们的疑惑。后面的作业因为难度提升,也专门写了pdf提供帮助,业务需求,设计思路,基础测试点。

posted @ 2021-06-19 12:02  hred~  阅读(43)  评论(0)    收藏  举报