第三次博客总结

前言:

这几次作业的题目难度相比之前有了明显的增加,程序所需要的代码量大幅度提高,甚至导致我在PTA上提交源码的时候出现了代码长度超过限度的提示,一些本可以在电脑上测试成功的程序无法提交,我第一次的题目集也由此无法满分。第二次的题目集如果只是想通过其实并不难,但是考虑到后续的延展功能,所以第二次题目集虽然只有一题,却也花去了我大量的时间去书写。其中主要的难点则是对结构的设计以及初始化数据,清楚其中的每个实体类之间的关系。第三次题目集则是对第二次题目集程序的迭代,添加借贷卡,并且允许跨行取款。其中题目的主要难度就是对新1添加类与其他类之间的关系以及对使用借贷卡时取款的相关数据运算,所以我在计算时花费了大量时间。

 

设计与分析:

1、第七次题目集由于是放假期间布置的,所以老师给的题目相较平时稍微简单一些,两道题目的逻辑基本相同,将不同类型的图形类继承与形状抽象类,再由shape类实体化抽象类,再利用接口将shape放入card里进行输出,这里具体输出时可以直接输出,也可以使用tostring方法输出,只是后者需要删除不符合题意的符号或者时直接重写输出方式,老师为了减小难度还给出了主类,所以也在主类中要求了tostring的使用,虽然时要求,但在输出时也的确比自己直接输出方便不少。对于基础的数据直接输出即可,特别的排序输出时我们使用了链表进行输出,根据要求还重写了compareto方法来从小到大输出,这里也学到了一种排序的新方法,在这一题中的arrylist运用也止于此,不过第二题着运用到了很多。

 

7-7-1相关类图及圈复杂程度图

 

 

 

 

 

 

7-7-2相关类图及圈复杂程度图

相对而言,第二题对arrylist的使用多了tostring的使用,这样方便了分组的输出。对于分组采用了for循环去判断图形名字来分组输出,并且在其中计算每种图形的面积总和。最后再进行比较面积大小并输出。这里我不能提交到PTA的原因是由于代码长度超过限度,即代码占用内存过大,这是由于每种图形计算总和时在for里嵌套了一个加法,但是对于计算总和其实可以重新利用for循环相加,这是我后来意识到的,所以并没有实现,在今后的代码中我要多加思考,争取解决每一个遇到的问题,不再犯这样马虎的错误。(由于原本完整代码无法通过PTA,所以这里的代码是没有提交但是完全正确的程序)

 

 

 

 

 

2、第八次题目集只有一题,是关于ATM机的账户存取款的。这次题目的主要难度在于我们要自己设计类和类间关系,并且储存初始化的数据。按照要求输入是一行一行的输入数据,所以在输入时接受的是一行一行的字符串(这里在循环里套了一个输入保证循环输入),然后根据空格进行分割,通过分割后的数组大小判断要求的操作是什么。将输入的字符串分割后传入相应的方法进行运算。在输入指令后我先按顺序判断是否符合要求并进行输出。当符合所有要求后在最后输出的同时进行改变相关数据。

  这里一共设计了六个实体类,其中ChinaUnionPay中被传入了Bank,而Bank中传入了ATM和User。User中传入Account,Account中传入Card。由于银联可以有多个银行,所以Bank在其中,而ATM和用户是属于银行的,一个银行可以有多个用户和ATM机,所以两者都在银行中,同理,一个用户可以有多个账户,一个账户可以有多个Card,所以Card放入Account。除此之外,我还声明了一个Test类来传入数据,这里要踩坑的是必须先建立相应的对象再传入数据,并且再super方法中调用相应的方法。这里初始化我也卡了挺久的,主要问题是对object中的相关方法掌握不够熟练。

  这里我使用的查找方法比较low,没有后续老师所给源码使用的查找方法那么高大上,我是使用for循环找到每一级之后的相关对象并对所找到对应属性的类进行标记,所以在其中我使用了多个for循环,使得代码运行效率较低。

  最后便是编写相应的判断方法和处理操作方法,这些我放在一个Agent类中,其中可以接收相关数据并进行查找判断是否相符。最后所有的方法都在Main类中进行判断输出。下方是相关类图,圈复杂程度仍然比较高,在之后的完善中可以将输出的相关和判断的相关方法放在其他类中进行输出和改变数据,这样可以简化一些步骤,使主类变得更加简单,由此减少圈复杂程度。

 

8-7-1相关类图及圈复杂程度图

 

 

 

 

3、第九次实验是对第八次实验的功能进行扩展和补充,其中添加了借记卡和借待卡的概念,借贷卡不但有初始资金还可以进行透支输出,并且还支持了跨行取款并且收取一定的手续费。其中较为有难度的就是对借记卡和借贷卡的关系编写,其次就是相关计算方法。

由于上次题目集讲解时老师给出了源码,所以这次题目集中代码的编写是由老师给的源码进行改编得到的。相比之下,老师给出的代码不需要输入给出的指令,可以直接搜寻到卡号对应的用户及其信息。而这题中两种不同卡的关系其实是两个账户类之间的关系,我选择的方式是将新加入的借贷卡作为借记卡的子类,即Account类新声明一个子类BorrowAccount类,这个继承了Account类的方法。根据老师的源码,我新加了一个quota属性在BorrowAccount类中。除此之外要改变的便是修改数据的withdraw类,修改判断余额和取款金额的方法,加入对quota的判断,对属于BorrowAccount类的进行强制类型转换,其中用instanceof

来进行判断,这是本次作业新学到的判断所给的对象属于的类的一种方法。之后便是分别判断。取款时便也是同理,先判断之后分别进行修改数据。最后的输出也是如此,先判断,再修改类型后进行输出。

最后需要添加的便是修改数据的对收手续费的计算和修改。由于我刚开始并没有分清其中的逻辑关系,所以每次都有所偏差,后来经过与同学的讨论和自己的思考,我最终想出了一种计算方法。刚开始还是对所属类型的判断,如果是借贷卡:先定义一个a=0来记录手续费,如果跨行则修改a值,然后算出手续费用索取金额减去余额进行欠款利息计算,如果余额足够则用余额减去取款及手续费,如果余额不够则多减去利息。如果是借记卡则正常计算的同时减去手续费即可。这里容易出错的是对于利息的计算,在讨论中只要考虑余额是否够用即可。

 

 9-7-1相关类图及圈复杂程度图

 

 

 

 

 

 

 

 踩坑心得:

 

1、在编写代码时对于循环的使用最好不要嵌套过多,这样会使得程序过大,不利与程序的使用,在提交源码时也可能会出现一定的问题。

2、编写代码前要理清每个实体类之间的联系和对应关系,我在编写时就在类与类之间的关系纠结了好久。

3、类间关系一定要遵循实际进行编写,例如ATM的实验中要分清楚每一层级之间的关系。

4、要明确Java中各种自带方法的含义及使用方法并且要熟练掌握,不能再在简单的问题上浪费时间,在初始化时我就由于这个问题一直我发传入数据。

5、在调用类中的方法时一定要注意所使用的类的位置以及明确方法所蕴含的含义,简单的编辑会导致后来使用或是阅读源码时出现障碍。

 

改进建议:

 

1、在编写时可以尽可能多的去设计类,保证每一个类或者方法中的运算单一明确,提高代码复用率。

2、在编写时可以多加使用抽象类或者接口,我目前还是对继承的使用过多,这不利于更加复杂代码的编写。

3、对于第二次题目集中的类间关系我的程序与老师有些出入,我将User类放在Bank中,这限制了一个人只能在一个银行办卡,具有缺陷,在后续的迭代中可以加以改进,将User放入Account中。

4、在设计方法时要尽量做到见名知义,我在设计时总是使用一些随意的字母命名,这不利于后续读代码时候的理解,在今后编写时要多加注意。

 

总结:

 

1、编写时一定要搞清楚类与类之间的关系,正确的类间关系和程序结构可以简化代码长度,提高程序运行效率。

2、在编写代码前一定要认真审题,明白要求和相关运算逻辑,减少出现不必要的失误。

3、编写代码时要严格遵循单一职责,确保代码的复用。

4、在程序中要对抽象类加强使用,必要时还可以设计一些工具类,由此降低代码的复杂程度,同时提高代码的执行效率和降低编写难度。

5、本次编写代码时了解到的一个比较特殊的Java方法是instanceof可以对对象类型进行判断,在判断有继承的对象所属类型时可以进行使用。

6、编写代码如果在遍历链表时嵌套太多可能会导致链表过长无法运行。

 

 

 

posted @ 2021-06-16 17:14  I&R  阅读(53)  评论(0)    收藏  举报
Live2D