第二次blog作业
前言:
在六到十周的学习中,我们主要是对类设计和链表类题目以及农夫过河进行练习,题目量虽然不大,但都有一定的难度,所以做起来也比较困难,耗费的时间比较多,对MVC模式以及七大原则的使用的要求较高,而后,我们还将要进行图形界面化设计,使用idea编译器进行JavaFX的一系列学习。以下是我对六到十周练习的总结:
设计与分析:
(1)链表练习
链表练习的最初是比较困难的,由于上个学期链表底子较薄,使得java链表学起来很费劲,所以第一次和第二次练习提交的源码都不能运行,到第三次老师讲解之后,才有了相对应得了解,在经过自己的练习,双向链表也比较熟练:

以上是我添加1 3 5 8 9 2,删除第三个位置上的结点,得到第一个位置上结点的值以及最后一个位置上结点的值的结果,而双向链表与单向链表也是有一定的区别:(1)单向链表由数据域和指针域组成,每个结点都有一个指针,每个结点的指针的指向都是指向自身结点的下一个结点,最后一个结点的head指向null,对单链表的操作只能从一端开始,如果需要查找链表中的某一个结点,则需要从头开始遍历一遍。(2)双向链表的每个节点要指向“直接前驱”和“直接后继”,所以节点类需要含有两个指针域,指向直接前驱的指针使用previous表示,指向后继的指针使用next表示,双向链表是在单向链表的一个基础上的一个改进,每个节点指向其直接前驱和直接后继节点,因此,从双向链表的任意位置开始,都能访问所有节点。

总的来说,双向链表比单向链表更为复杂,内存占用较大,但是在查找方面比单向链表更加方便快捷。
(2)农夫过河
农夫过河练习还在持续,类的数量也越来越多,十分考验我们的继承和多态的基础,在农夫过河的持续练习中,学到了很多,一个游戏从简单的输入输出到后来的类设计,这个过程是艰辛的也是充满挑战的,接下来看看农夫过河变化的类图吧:

这是一开始农夫过河的类图,比较简单,类与类之间的耦合性相对较高。

这是第四次农夫过河的类图,显然比第一次的农夫过河复杂,但同时耦合程度也较低,降低耦合度的方法又有:(1)少使用类的继承,多用接口隐藏实现的细节;(2)模块化尽可能单一,功能单一的模块其他模块调用的机会就少,也就是说,高内聚低耦合。在农夫过河的多次实验中,我意识到了MVC模式的重要应用,也同时在实验时遇到了不少错误,例如:开始,我将原本给出的类图以及解释搭好了一个框架,而后再进行各部分的继承的实现以及调试改错,在调试的过程中,我遇到了只声明对象没有创建对象的错误,以及对各个动物行为的不明确分析和对判断游戏是否结束情况的判断错误,导致游戏提前结束:


以上是对只声明对象没有创建对象错误的改正,由于对各个动物行为的不明确分析,导致最后输出结果为动物们都还活着:


以上也是进行了相应的改正。
(3)PTA图形类设计题目
图形类设计题目对我来说难度应该是最大的,只要涉及图形类设计就没有拿到过满分,由于没有了类图而要自己凭空去设计类,并且完成对正则的结合,让我感到十分困难,因此,由于刚开始便没有运用类设计而是一股脑的将所有代码放入一个主类,导致后面的迭代四边形也没有完成好,这也是我前五周最大的不足以及我后面最想弥补的地方。

往往只有case1=case3是正确的,到case4和case5都会因为判断标准以及没有正确的算法而报错,到现在也没有想出办法去改进。
(4)期中考试题目分析
期中考试的题目是一个迭代的点线面模式题,设计的巧妙就在于要一题一题的往后做,一题一题的迭代,从一开始比较简单的继承题到后来加了容器:

ArrauList容器有add,remove,getList等方法,在此处主要是进行了增加,删除以及打印序列的作用,在此次考试的最后一题中我也遇到了一些麻烦,如:在switch后没有添加choice=in.nextInt();导致只能输入一条语句,并且无法输出:


改正后,也得出了正确答案,通过测试点,其实ArrayList就是Array的一个复杂版本,可以实现直接添加,删除,而array需要遍历,效率较低。
(5)图形界面化设计
在未来几周,我将要开始将农夫过河的用户界面改为图形界面,我也开始用idea在学习JavaFX的基本原理和组件,以及java的事件驱动机制和lambda表达式,

例如:接受一个参数类型返回其两倍的值:x->2*x;或者接受一个string对象,并在控制台打印:(String s)->System.out.print(s);
java的事件驱动机制:所谓事件驱动,简而言之就是你点什么按钮,电脑便执行什么操作,例如:Button button=new Button("农夫过河");便是在场景中放置一个按钮,按钮中内置名字为农夫过河。再例如:
button.setOnAction(actionEvent -> {
stage.setScene(scene1);
});
意思就是按下这个按钮场景就会由scene跳转到scene1场景。图形界面化我并没有学习完,将来也会持续的学习。
改进建议:
在前几周的学习中,我认为最需要改进的便是我的图形类设计,由于我全部放在一个主类里,导致代码重复率高,耦合性高,复用性低,代码质量差。以下是我想要的类图分析:

在进行类设计时我们也要遵从七大原则:(1) 单一职责原则:降低类的 复杂度,一个类只负责一项职责;提高类的可读性,可维护性;降低变更引起的风险。(2)历里式代换原则:在子类中尽量不要重写和重载父类的方法。(3)依赖倒转原则:变量的声明类型尽量是抽象类或接口;使用继承时遵循里氏代换原则。(5)接口隔离原则: 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。(6)迪米特法则:一个对象应该对其他对象保持最少的了解,也叫最少知道原则,也就是说,对于依赖的类不管多么复杂,都尽量将逻辑封装在类的内部,对外除了提供的public方法之外,不泄露任何信息,只与直接朋友通信。(7)开闭原则:一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。
总结:
在第六周到第十周的学习中,我学习到了如何进行类设计,大部分类都是actor,就是存储某些特有的数据,并将其与特定的操作联系起来,为了使用这些类,我们就需要通过声明一个对象,将某些具体的数据与特定的操作联系起来。而失败的类的原因这个类涉及了太多的数据和操作,导致类的复用性低。在以后的学习生活中,应当加强这方面的练习,做到逻辑清晰,提高类的复用性。
浙公网安备 33010602011771号