OO第三次博客作业
一,前言:
(1)知识点:
这三次题目集的知识点考察主要是类的继承、多态性使用方法以及接口的应用,面向对象中的封装性。对实体类的设计要做到单一职责原则,且不能缺少规定的实体类)务必注意本题目中的各实体类之间的关系,尤其是一对多的组合关系。 在“合成复用原则”及“单一职责原则”基础上,尽量符合 “开-闭”原则。
(2)题量:
这三次题目集的题量到是比较少,第七次题目集有两道题目,第八次和第九次就只有一道题目。
(3)难度:
这三次题目集总的来说难度不是很大,第七次题目集还是要花点时间,至于第八和第九次题目集基本上没花什么时间。三次题目集考察的知识点早已烂熟于心。
二,设计与分析:
(1) 题目集7(7-1)、(7-2)两道题目的递进式设计分析总结
a.对两者的总体分析:
第一道题的主要需求是求出各卡片的面积大小然后将卡片按照其面积值从大到小进行排 序,同时求出所有卡片的面积之和。并且给相应的类图和主方法,对后期的代码实现有了一定的限制。设计的思路应该是设计不同图形相对应的图形类,在根据输入的数值判断输入的是什么图形,做好标记之后再存入相应的链表中,再使用各个类中相应的方法去计算。
第二道题的主要需求是根据卡片类型将所有卡片进行分组(一个类型分为一组, 所以最多四组),然后能够对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,最后求出每组卡片面积之和中的最大值。主要的方法可以参考第一题,设计的思路应该是设计五个链表,在分别将四个图形相关的数据存入相关的链表中,每一个数据也要在主链表中储存,方便之后的计算和排序。
b.通过圈复杂度的图对两道题目进行分析:
由图可知两题的复杂度中无论是最大复杂度还是平均复杂度,第二题都更大。就是由于第二题在后面加入的更多的链表,提高的复杂度主要是在计算上面的。
List<Card> cardList = new ArrayList<Card>(); List<Card> cardList1 = new ArrayList<Card>(); List<Card> cardList2 = new ArrayList<Card>(); List<Card> cardList3 = new ArrayList<Card>(); List<Card> cardList4 = new ArrayList<Card>(); Double[] arr = new Double[4];


c.通过类图对两者的结构进行分析:
由类图可知,两者的结构并没有很大的差距,都是用四个图形类去继承Shape类,再通过相关类去计算结果。所以它们的圈复杂度并没有多少差距。两者的主要差距是部分计算的差距。


(2)题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
a.总结分析:
第一题的设计思路尤为关键,因为第二题就是在第一题的设计逻辑上加以改进的。先分析第一题的思路,我们得知道类的关系,卡一定是最小的,之后在是账户,后面是用户和ATM机,再是银行,最后是银联。所以我们首先创建卡类,在他里面创建卡的信息。之后创建账户,账户中有储存卡的链表,还有账户的有关信息。再创建用户类和ATM类,ATM中就只有ATM有关的信息,用户类中有用户的信息,还有账号的链表,用来储存账号的信息。再将所有的用户都储存在银行里面,再把银行放到中国银联里面就可以。通过信息的初始化将信息全部储存在由中国银联联系的各个类中,再计算即可。第二题无非就是在第一题的基础上改了一些计算,没有难度。
b.根据圈复杂度分析:
二者在复杂度上的有点差距,首先是最大圈复杂度,第二题的最大圈复杂度明显高于第一题,这主要归功于第二题中根据需求的改变而改变的算法。而在平均复杂度上二者的差距就没那么大。
下图为更改的代码:新建的类和算法的改变
class Account1 extends Account { public Account1(String accountNO, double balance, User user, Bank bank, int num) { super(); this.setAccountNO(accountNO); this.setBalance(balance); this.setUser(user); this.setBank(bank); this.setnum(num); } } class Account2 extends Account { public Account2(String accountNO, double balance, User user, Bank bank, int num) { super(); this.setAccountNO(accountNO); this.setBalance(balance); this.setUser(user); this.setBank(bank); this.setnum(num); } }
/** * 校验取款金额是否大于余额 */ double sum = 0; if (amount > balance && card.getAccount().getnum() == 1) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } else if (amount - balance > 50000 && card.getAccount().getnum() == 2) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } else if (amount - balance > 0 && card.getAccount().getnum() == 2 && balance >= 0) { sum += (amount - balance) * 0.05; } else if (amount - balance > 0 && card.getAccount().getnum() == 2 && balance < 0) { sum += amount * 0.05; }else if(amount == balance && account.getBank().getBankNO() != aTM.getBank().getBankNO() && card.getAccount().getnum() == 1) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } // System.out.println(sum); /** * 校验是否为跨行取款 */ if (account.getBank().getBankNO() != aTM.getBank().getBankNO() && aTM.getBank().getBankNO().equals("1001")) { sum += amount * 0.02; } else if (account.getBank().getBankNO() != aTM.getBank().getBankNO() && aTM.getBank().getBankNO().equals("1002")) { sum += amount * 0.03; } else if (account.getBank().getBankNO() != aTM.getBank().getBankNO() && aTM.getBank().getBankNO().equals("1003")) { sum += amount * 0.04; }


c.类图分析:
根据类图显示,两者就Account上有一点差距,其他并没有很大差距。都是依据原有的属性关系衔接起来的。

三,采坑心得:
(1)第七次题目集:
就这次题目集比较难得分的点是在第二次题目集中有关细节没有把握住,就这个测试点我尝试了很久都没有解决,后面是朋友告诉我该如何去解决这个问题,原来是和第一道题目不一样了,老师挂了数据,就在题目的参考书中写的明明白白的。经过了这次失误,我在之后的每一次作业当中都认真仔细的阅读题目参考书。
![]()
(2)第九次题目集:
就这次题目集我有一个不是很明白的点,就是余额的计算方法,这个图片只是表示了我的错误方向,和这个一样的错误还有喝多,到最后我还是问了同学余额的计算方法才明白余额的计算方法。

四,改进建议:
(1)可维护性:
感觉自己的代码可维护性太差,在很多方面都有需要改进的地方, 先是自己创建的类的关系,感觉挺乱的,没有什么逻辑,可以根据类图看出来功能和所创建的类有点不匹配。

(2)单一原则:
对于Java的单一原则没有很准确的实现。比如就不该在主方法中实现信息的初始化,应该重新创建一个有关信息初始化的类去实现这个这个功能。类中方法的单一原则实现比较差,在一个方法中有多个功能的实现,这不仅仅是对代码维护性的极大破坏而且也降低了代码的可读性。


(3)代码逻辑:
在创建User类中,没有明白 Account类和User类的关系,导致在计算的时候花了很多时间,后面的代码可维护性差了很多,并且在后面的代码重构中也吃了很大的亏,也是到后面才明白Account类是在Bank类中的,因为用户可以跨行去存取款,而跨行存取款的基础是用户在该银行有属于他自己的银行账户,所以账户一定是在银行类里面的。
class User { private String name; private List<Account> list_account = new ArrayList<Account>(); public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Account> getList_account() { return list_account; } public void setList_account(List<Account> list_account) { this.list_account = list_account; } }
五,总结:
整个这三次题目集,算是Java这门课程的最后三次题目集,在这三次题目集当中总结了前面学到的几乎所有的知识相关于类的一些知识,还有一些原则上的问题。通过这三次题目及的集中训练,我对这3我对这Java的基础知识都有了大概的了解,并且将其完整的完好的掌握了。但是有一说一,这个题目我觉得还是有待考量,毕竟题目量比较少。不过训练的强度确实达到了,因为有些测试点真的要花点时间才能过。我觉得老师的教学方法挺好的,让同学们自主学习。老师线下线上的课程非常的科学,很符合我们现代大学生的学习要求。总之来说就是没什么问题吧,这三次题目集让我明白了,自己对知识的掌握还是有点不够,应该再接再厉继续努力吧。
浙公网安备 33010602011771号