第三阶段作业总结报告
第三阶段作业总结报告
一、前言
(1)实验感受
第三阶段的作业整体来说题目难度降低,数量减少,但是内容和知识点增多,比较全面,也是收官作业。主要的知识点和内容概括是:抽象类、继承与多态,类的封装性及类间关系设计(关联、组合及依赖)、类的继承、多态性使用方法以及接口的应用。
学习这些重要的知识,遵循规则和要求来做题目,循序渐进,就能熟练掌握这些知识点。
(2)题目集分析
题目集7:实验分为两道题
1、继承、多态的应用;
2、ArrayList泛型的应用
3、方法Comparable接口及泛型的应用
4、单一职责原则的应用“开-闭”原则的应用
难度适中
题目集8:实验分为一道题
1、类的封装性及类间关系设计(关联、组合及依赖)
2、是一对多的组合关系的设计
3、单一职责原则的应用“开-闭”原则的应用
4、面向对象中的封装性的应用
难度适中
题目集9:实验分为一道题
1、继承、多态及抽象类的应用
2、是一对多的组合关系的设计
3、单一职责原则的应用“开-闭”原则的应用
4、面向对象中的封装性的应用
难度适中
总的来说这阶段的作业数量减少,但是涉及的知识点都是最核心,最重要的。
1.为什么要使用继承
2.抽象方法的特点是什么
3.抽象类有哪些特点
4.继承抽象类时需要注意什么
这些问题都能在此次阶段学习中得到解决。
(2)设计与分析
①题目集7(7-1)
题目要求我们将图形进行面积大小排序、同时还要输出相应图形类型和所有图形总面积。里面涉及到类的继承、多态性使用方法以及接口的应用。
类图如下:

由类图我们可以看出类与类之间的关系:
Shape 是父类,其子类是Circle,Rectangle,Triangle,Traperoid。
Shape抽象类里面主要是进行比较的方法和输出格式。子类分别继承Shape类实现面积的计算。
这样设计主要是使类结构具有较好的可复用性,遵守开闭原则的软件,因为每次只是在拓展新功能不会对原先的功能产生太大影响,因此其稳定性强,从而易于维护,能实现面向对象设计原则中的“单一职责”原则和“开-闭”原则。
在此次功能的实现当中,最主要的就是Comparable接口的实现方法进行排序。此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
如下图:

复杂度报表:

从这里我们可以看出,由于第一题难度不是很大,所以算法比较单一和简单。第一次作业虽然非常简单,但是具有很大意义。第二次、第三次作业的架构都是在此基础上建立的。
题目集7(7-2)
题目要求求出排序前的各图形类型及面积、分组后的图形类型及面积、各组内图形排序后的各图形类型及面积、各组中面积之和的最大值输出。并且需要进一步完善7-1的内容。要求我们首先根据卡片类型将所有卡片进行分组(一个类型分为一组, 所以最多四组),然后能够对每组内的卡片根据面积值从大到小进行排序。
类图如下:

类与类之间的关系可以参考上面7-1。Shape 是父类,其子类是Circle,Rectangle,Triangle,Traperoid。
复杂度报表:

通过复杂度可以看出题目的代码数量增多,结构更复杂。
通过两题目对比,都是求面积和排序,7-1是简单的对所求面积进行排序,而7-2不仅要求面积排序,更要求我们对象和面积匹配,对对象进行排序。
由下图可以看出对象之间的联系

对于7-1的排序

这里只需要对最后的卡片数据进行总的排序就行。
对于7-2的排序

sort排序是由小到大排序,Collections排序方法效率很高对优化代码复杂度有很大帮助。
我们可以看出题目要求。总的来说7-1要求简单,7-2在7-1的基础上添加了更多的要求,且在在 ArrayList 工具类的使用上有不同点。
②题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
题目集8:
题目要求设计ATM仿真系统实现存款、取款、查询功能。重点考核类的封装性及类间关系设计(关联、组合及依赖)。
类图如下:

有图我们可以看出类与类之间的关系:Unionpay类中添加的是两个银行(中国建设银行和中国工商银行),User类他里面包括了所有用户的名字和账户信息,接着Bank类里面存储了银行的信息,并且在相应的银行添加的所属用户的信息,还有ATM机的信息。Account类里面添加了初始金额,还有每个账户所拥有的账户号。最后Card类和ATM类里面分别别添加的是卡号和ATM机编号。
总的来说内容功能齐全但是比较繁琐。
复杂度如下:

我们可以明显看出代码数量很多,复杂度也不可观。类之间的结构还有待改善。
题目集9:
题目集9的ATM仿真系统大体功能和题目集 8差不多,但是此次要求的内容更为齐全(本次作业中银行卡包含借记卡和信用卡两类,且允许跨行办理相关业 务)。这次重点训练内容为抽象类、继承与多态。并且一对多的组合关系也是重点。
我们知道抽象类好处,可以隐藏具体的细节信息,所有的子类使用的都是相同的方法原型,其中包含了调用该方法时需要了解的全部信息;强迫子类完成指定行为,规定所有子类标准行为。
类图如下:

这里定义了一个抽象类Account为父类,里面定义了银行信息,修改卡号,修改余额等方法。子类:DeAccount、CrAccount继承父类,分别是借记卡和贷记卡两种账户。ValidateData类用来判断是否正确,Withdraw类用来最后计算余额和实现相关功能。Main用来存储信息。
复杂度如下:

和题目集8相比较,题目集9类的结构更为紧密相连并且结构清晰易增添和修改。
(3)采坑心得
语法错误:通常,编译器对程序进行编译的过程中,会把检测到的语法错误以提示的方式列举出来。
主要有括号不匹配,变量未声明(此类错误最多)如下图:

数据类型之间的转换。例如String输入,int or double输出时。如下图:

我认为出现此类错误是好解决的。此类错误一般程序编译系统会自动提示相应的错误地点和错误原因,比如哪一行代码少了个括号等诸如此类的提示,常见的错误,看懂直接改正即可,如果是看不懂原因,可以将错误提示信息输入搜索引擎查找一下,一般都能找到具体的解决办法。需要的是多练和细心。
2、逻辑错误:由于编译器无法检测出存在的逻辑错误,所以此类错误有点麻烦。
主要有遗漏的情况出现。例如题目集5中的7-4,容易遗漏“”中的内容也属于字符串中的数据。
还有循环条件错误,指令的次序错误,程序设计算法考虑不周全等,尤其是当题目所涉及的情况较多时容易遗漏。在一般情况下,编译器在编译程序时,不能检测到程序中的逻辑错误,也不会产生逻辑错误的提示,因此逻辑错误比较难排除,需要我们仔细的分析程序,并借助集成开发环境提供的调试工具,才能找到出错的原因,并排除错误。
3、运行错误:运行时被迫中止且编译器开始不能产生提示。
主要有数组元素超出范围。(主要报错:ArrayIndextOutOfBounds数组下标超出边界)如下图:

方法的使用前后不匹配或找不到所要的头文件,如下图:

此类错误发生时,编译平台一般也会提示相应的信息,对于常规的错误会有比较精确地提示,但有时提示的错误原因会比较模糊,但因为此类错误一般在程序运行时,只在特定的条件下才会发生,所以根据错误发生的条件,能够大致判断程序出错的代码段,结合错误的原因,也能比较方便的调试出错误。
四、改进建议
对于题目集8ATM机类结构设计(一)信息存储可以利用一对多原则使代码结构更为清晰易修改。
对于接口定义的静态常量变量而言,他们的修饰词都是public static final。而且由于是不可变量,再加上没有构造器和初始化块,因此静态常量必须在定义时指定默认值。
五、总结
1、学到了什么
对于多态:什么是多态呢?按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。
如何理解多态?或者说我们为什么要用多态,什么情况下用到多态?
首先多态的必要实现方式有继承、方法重载和动态绑定(创建一个对象,该对象是父类类型的引用指向子类的对象,该引用只能调用父类中定义的方法和变量)
我们需要创建大量的类时,他们可能都有基类里通用的函数方法,但是每个角色又不尽相同,那么不同之处我们就可以用多态来实现解决,既节省了大量代码和时间,同时又符合面向对象的思想。
对于开闭原则:开闭原则的核心是:对扩展开放,对修改关闭,其目的是提高程序的扩展性,实现热拔插,即在每次需求发生变更的时候,能够在对原有代码不进行修改的基础上拓展新的功能来达到满足需求的目的。
这些都是重点,也是核心内容和难点。
对于进一步研究方向,我认为简化代码复杂度和学习更好的算法是接下来的学习方向。学习更优的方法。

浙公网安备 33010602011771号