《OO第二单元(5-8周)作业总结》

很快的三周时间过去了,相比第一次写博客的激动,这回我明显平静得多。对博客内容有了大致的确认,直接上内容!

0.前言

本次作业:《 OO第二单元(5-8周)作业总结 》

针对我们第二阶段的作业( 共三次 ),发表总结性博客。这三次作业,难度明显加大,成绩分别为92、76、130。

对于这四周所学习到的,开始迈入Java面向对象特点的学习。

1.作业过程总结

①总结三次作业之间的知识迭代关系;

      这三次作业难度提升非常明显,大量的要求,让我有些懵逼,第一次是水纹校验,蒙特卡罗方法求圆周率 ,图形继承。

      图形继承是在前几次的作业要求上,新增了部分要求:继承父类、重写父类方法;

      

      蒙特卡罗方法求圆周率是在第一阶段作业中坐标范围的基础上加了算法,指导书介绍了π的具体求法,做题中,在各类属性调用中,遇到了错误,粗心的使用了错误的属性,导致算法答案出错,最后还是通过一点点看代码才发现问题(不太习惯用单步调试,以后需要注意);

      

      水文校验就是新的知识接触,里面第一次遇到正则表达式,老师说关于正则的书都有两百多页,我就感受到了题目的困难,先是时间年份的格式,我直接采用的正则格式,所以需要考虑很多情况,例如:平年没有2.29;年份前没有0;大小月等等。接着就是数据的拆分,因为输入时,是用到了StringBuffer,以一条很长的信息输入,所以需要按格式拆分每条水文信息。做题中还遇到了,单个数据的正则格式表达。其中用到ArrayList的数组类,其中有很多方法,比较方便,但最后还是只能拿到52分,虽然现在也不知道那个格式错误错在哪。

      

      第二次作业是图形继承与多态、一元多项式求导。

      图形继承与多态在第一次作业内增加要求,其中用到ArrayList的数组,重写sort方法,运用到了Comparable<>接口进行面积排序,遇到了排序显示错误的问题,最后还是解决了; 

      一元多项式求导以正则表达式为基础,可我之前并没有读懂题目,不会拆分每个项,正则表达式也表示错误,所以只拿到了判断错误情况的36分。作业结束后,我又尝试重新写了一遍题目,成功推出每个项的特点,正确使用正则表达式表达。其中考虑:含x项系数只是+-号;第一项带符号;错误符号的使用等等。需要考虑很多细节,让我也是头疼。

      

      第三次 图形卡片排序游戏、图形卡片分组游戏、求素数。

      图形卡片排序游戏在之前图形类的拓展,同样需要使用到Comparable<>接口,重写sort方法,相对简单;

      图形卡片分组游戏在上一题的基础上增加难度,重写的sort方法里需要设计排序算法,不再是仅仅考虑面积的大小,还有种类的分配。这里我采用的是重新创建不同形状的ArrayList数组,输出时,只需要按顺序输出即可。

      

      求素数比较简单,但是题目要求对算法时间有具体要求。

     ②如何通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性;

     继承性主要是在图形继承里面体现,例如:形状属于每个图形的父类,圆形是球的父类;子类具有父类的所有特性,并在基础上拥有新的属性和方法;多态性的体现则是在方法形参的设计和实例的设计,例如:每个图形都可以有求面积的方法,所以求面积的形参接收可以使Shape类,在实例创建时是Shape的子类,这样在方法调用时,可以传入各种具体形状的参数。封装性体现在属性类的private设计和setter和getter方法的调用。不允许外界直接改变属性值。

     ③作业过程中遇到的问题及解决方法

     第一次作业:正则表达式的运用,正则里面的知识很多,如果运用到各种事例中,更是需要反复思考,得出正确的表达式,反复尝试,重新开个类调试。

     第二次作业:多项式的拆分,需要找到各种多项式的特点,结合正则表达式,同第一次作业,试出表达式。

     第三次作业:Comparable<>接口的使用和sort方法的重写,需要按题目要求设计排序内容,在CSDN中查找了相关知识。

     ④每次作业花费的时间比例

     这三次作业中前两次均一直到截止时间才能够完成,并且没有全部测试点通过,但结束后,仍有继续改进或重写代码,争取满足所有要求。第三次作业相对简单,接近一天的时间。

     ⑤对编程过程的严谨性的认识及教训

     渐渐适应了Java的简单编程语言习惯,但是在类属性方法的调用上仍会出现错误,包括类的设计和继承关系上,其中包含了多态性的体现。以后还需要多敲代码。

     2.OO设计心得

     ①对面向对象三大技术特性之间关系的理解

     封装:我认为一个类就是封装了数据以及操作这些数据的代码的概念。在一个对象内部,代码或数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了保护,以防止其他类的随意访问和改变或错误的使用了对象的私有部分。继承:通过继承创建的新类称为“子类”,被继承的类称为“父类”或“超类”。老师说子类属于父类的一个实例。继承的实现方式有二种:实现继承与接口继承。实现继承是指直接使用父类的属性和方法;接口继承是指仅使用属性和方法的名称、但是子类必须实现接口各种方法;多态:指一个类实例的相同方法在不同情形有不同表现形式。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类或者父类,它们可以通过相同的方式调用。

       ②面向对象设计的基本原则理解(单一职责原则及“开-闭”原则)

     单一职责:老师在解释的时候,我大致总结是每个类只有属于各自的特点方法,例如:输入加法表达式,接收的表达式可以设计为一个类,专门负责接收输入数据和按照"+"拆分成不同部分。然后设计加法算法类,只负责调用各个数据执行加法操作。总体来说,就是各个类各司其职,不去管其他功能。

   “开-闭”原则:一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。(这个我也解释不太好,就从网上截取了一句话下来)应该也是代码的复用性,即使要新添加一个功能,应该 是在不改变原始功能代码的基础上,直接进行添加,并合适的删改原操作时的代码。

     ③OO编程思维的理解

     思维上面应该是需要考虑对类、接口等等的设计。类只是一个概念,需要不断给其中增添很多定义,包括类与类之间的关联性:依赖、聚合......这些是面向过程中少有的。每个类被抽象化了,各有各的职责,就像是老师说的,可以在每个类中找到更多的相同点,再进行提炼,设计出新的类,而实体更像是被赋予了这个概念。

     ④类设计心得

     这几次作业都还是提供了UML类图可以参考。不过看了这几次作业类的设计,首先还是要体现单一原则,还有子类父类抽象类接口的设计,方便类的调用和多态性的使用。

     3.测试的理解与实践

     ①测试对于编码质量的重要性

     因为在做正则表达式的题目时,会经常出现错误,正则的表达不严谨,会漏掉一些特殊情况。这时我还是选择的是重新创建一个类进行测试,这种方法没有效率,不够方便,所以不值得提倡。老师之前介绍过断言的简单使用,可以按这个方法,多在代码里添加测试。

     

     ②查阅资料,假设使用Junit进行程序的测试是否可行   

     是可行的,老师上课提到的JUnit类库里面有Assert类里面的assertEquals就是一个适合程序测试的方法。百度百科的解释是:单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。例如,你可能把一个很大的值放入一个有序list 中去,然后确认该值出现在list 的尾部。或者,你可能会从字符串中删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了。简单的说,单元测试就是对你程序中最小的功能模块进行测试,在c语言里可能是一个函数,java中可能是一个方法或者类。目的就是为了提高代码的质量。

     4.课程收获

    总结这四周来在OO方面的教训及收获

    教训就是测试的问题,大量需要测试的功能,不可能像我这样还是一个个看或者重新开个类去一点点代码的测试。还有就是已经出现需要自学的部分——正则表达式,得提前或者课后多看看。收获就是了解到了:继承、封装、多态;父类子类抽象类接口的使用;和类的设计,其中雨刷器就是一个很好的例子,控制器,刻度盘、雨刷,分别只需要满足各自的功能需求,还有考虑到开闭原则。

     5.对课程的建议

     作业难度相对有明显的提升,尤其是水文校验的题目和一元多项式求导,其实每次作业难易结合还是挺不错的,可以让我们拿到一些相对简单的分数。题量应该也是适中,做完应该没什么问题,关键是能不能拿到满分就是另外一回事了。建议就是可以多添加一些测试点,因为我自己就有遇到过,一些错误的算法或者功能遗漏,仍可以通过测试,这就有些离谱。

猜你喜欢

转载自www.cnblogs.com/AiYu-Z/p/12815499.html
今日推荐