阶段性学习总结

距开始学面向对象程序设计这门课也有了将近五周的时间,于是便想通过这篇文章来进行这一阶段的学习总结。

 课程开始便开始学习类与对象的知识,通过在MOOC,B站以及课堂上的学习,初步认识了类与对象的关系,学会用使用类制造对象,在课堂上的学习中,引出了面对对象七大设计原则,为了让我们更好的理解类与对象之间的关系,以及面向对象七大设计原则中的单一职责原则,又提出了雨刷的问题。

课堂作业

雨刷1.0

在课堂上得知了雨刷的基本运作模式,以及大概的设计框架,要求我们根据司机通过对控制杆,刻度盘的调节,从而达到控制雨刷速度的目的。

 

 

 该题通过对象的创建,基本功能得以实现,但是在后面的分析中,发现在设计上存在着许多的缺陷,main函数所要执行的任务太多,且耦合度高。

                   

                                                                           雨刷1.0主方法代码                                                                                                                                             雨刷1.0类图

雨刷2.0

由于雨刷1.0存在缺席,于是对代码进行了改进,改进方案为新建一个View类,来进行原来在主方法中的选择功能与输出结果的部分,这样的设计降低了main方法中的耦合度,达到了解耦的目的。从而也满足了七大设计原则当中相当重要的单一职责原则。各个类。各司其职,不同的对象有着属于自己的属性方法而不受其他影响。

雨刷2.0类图如下

 

反思总结:本次雨刷的作业,初步运用了类与对象的知识,便且引出了面对对象七大设计原则中的单一职责原则,本次作业很好地体现了这一点。但在自己通过代码实现这个功能的过程中,也发现了自己的一些问题。最简单最基础的就是代码的规范问题,这次雨刷的作业不仅使我对类间关系理解的更为透彻,也帮助我规范了自己的代码书写,并在以前并没有单一职责这种意识,现在也明白了设计过程当中,单一职责的重要性。

PTA作业

题目集02 

7-2 串口字符解析 

题目要求:RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。

设计思路:首先是最基本的判断数据的长度,这里边可以运用String类函数length()判断输入数的长度能不能符合要求,是都超过11位,接着通过String类函数中的charAt()函数,利用for循环从而能够读取输入数据中每个数,再通过substring函数截取字符串并判断以及校验。

反思总结:刚开始看到这题时,比较迷茫,读不懂题意,通过反复的审题,并通过查阅资料,了解什么是奇偶效验,才明白题意。通过这道题又学到了一些课外的知识点,同时也使我对String类中的一些函数,比如length()函数,charAt()函数的使用更加的熟练,使用起来更加的顺手,对于这种截取字符串类的题做起来更加轻松。

 

题目集03

7-1日期类设计

题目要求

设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] ,应用程序共测试三个功能:

 

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法

 

设计思路:该题中已经规定了所需要编写的方法,于是便跟据步骤,讲一个个方法实现。

7-2&7-3日期问题面向对象设计:

两题要求设计DateUtil、Year、Month、Day几个类,程序可以测试求下n天、求前n天、求两个日期相差的天数的功能,且不能使用Java中与日期相关的类与方法。

其中两题的聚合方式并不相同,题目要求我们根据给出的类图进行代码实现,第一道题类图如下:

 

 

 第二道题类图如下

 

 

设计思路:根据类图,设计出 Main,DateUtil,Day,Month,Year五个类,然后根据类图,将每个类图中所给的属性以及方法进行填充。

总结反思:这两道题需要实现的功能基本都是一样的,但是两题的设计并不相同,两种聚合方式相比较我认为各有各的优势与缺点,聚合一相比聚合二,DateUtil类当中只与Day类产生了关系,这里相比聚合二中的DateUtillei类耦合度更低,但是聚合二的代码可读性我认为比聚合一高,光就写代码时的我而言,认为在写聚合二时认为其比聚合一更易理解。这只是我个人的观点,我也不知是否正确,如有不正确之处,也请读者指出。

 

PTA题目集总反思:

在写Pta题目的时候,经常会出现边界测试点过不去的情况,老师也在课堂上提出了保证代码质量,在自己写代码的时候,需要考虑计算的误差,测试时使用比边界值略大或略小的数去测试。设计时需考虑单一职责原则,减少一个方法出现过多行代码的情况,在写完题时也可以尝试对代码进行优化。做完这三套题目集,使我对封装变量的访问以及在各个类中的调用有了更深刻的认识,这几个题目集虽然都通过,但是在通过的过程中出现了许多问题。在写丁一数据类型时,基本上只使用int 和double 两个类型,但在一些题目中发现,使用double有时会出现检测点过不去的问题,这也总是让我百思不得其解,后面才明白,题目要求的精度并没有那么高,而double的高精度反而会使检查点过不去,改用float便发现原来困扰已久的问题得以解决。题目集03中的两道根据类图写代码的题,也使我对类图有了初步的认识,经过题目集的磨练,我认为我的代码能力得到了提升。

double精度过高问题:

 

 

实验

在这个阶段的学习过程中,我们也完成了一次实验,第一次的实验任务较为简单,让我们自行安装JDK,以及学会通过记事本写代码及在dos指令窗口编译运行代码。在这个实验过程中,也接近了我的一个疑问:为什么有着好使的高级编译工却仍要使用记事本,后来我知道,在一些特定的开发环境,比如银行的系统的维护当中,是不能够使用其他高级编译工具的,那么这样维护就只能通过记事本来维护。实验当中还有一个重要任务就是学会用调试来发现解决代码及逻辑问题,尽管简单,但仍有收获。

学习汇总:

第一个便是类间关系:类间关系分为五种:

1.关联     2.依赖        3.聚集     4.泛化      5.实现

类间关系耦合性:组合 > 聚合 > 关联 > 依赖

其中也明白在设计类的时候,类间关系追求弱耦合性,而类内追求高耦合性。

设计中还有一种模式叫做MVC(Model,view,controller)

其中Model表示模型,实体类       VIew 表示 展示类  接口类      Controller表示   控制类,业务类。

其中还了解了设计法则迪米特法则,迪米特法则:

1.不要和陌生人讲话

2.只和你的直接朋友通信

3.最少知识原则。

this关键字:java虚拟机会给每个对象分配this,代表当前的对象,哪个对象调用,this就代表哪个对象。

注意事项及使用细节:

1.访问·构造器语法:this(参数列表)注意:只能在构造器中使用(即只能在构造器中访问另外一个构造器,且必须放在第一条语句)

2.this不能在类定义的外部使用,只能在类定义的方法中使用。

3.this用于区分当前类的属性和局部变量

继承:

继承给编程带来的便利   :   1. 代码的复用性提高了     2. 代码的扩展性和维护性提高了。
子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问。
不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系。java 所有类都是 Object 类的子类, Object 是所有类的基类.。
子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。
方法重写需要满足的条件:
1.子类方法的的形参列表,方法名称,要和父类的形参列表,方法名称完全一样。
2.子类方法的返回类型和父类方法的返回类型一样,或者是父类返回类型的子类。
 

心得体会

经过这几周的学习,初步熟悉并掌握了面向对象设计原则及其运用,也学会了许多新的库函数,还有一点很重要的就是,不能一看到题目便着手于写代码,而是要先对题目进行分析,进行需求分析,做好整体规划,大概树立一个结构,比如要写哪些类,类里面大概又有哪些方法。这样能够减少我们在写代码的时候手忙脚乱的场景。写完之后再分析自己的代码,看看能不能优化,平常多看看一些大牛写的代码,学习他们的风格,例如可以多看源码。以上便是我这个阶段的总结,希望在下一个阶段里能学到更多。

 

posted @ 2022-04-09 22:49  胡彦祖2333  阅读(107)  评论(0)    收藏  举报