OO(Java)第二阶段作业总结

前言

  本次博客的内容是针对面向对象编程学习(Java)第二阶段的总结,以PTA平台的作业为总结评估对象,本阶段的主要学习内容以正则表达式、字符串处理、链表的排序与处理以及继承类、抽象类和接口为主。

 

一.作业过程总结

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

  第一次作业的题目难度确实分化比较大,就第一题来说是十分困难的,对于整体数据的各项精确处理方面,我花了很长时间学习正则表达式和字符串处理,后面两题比较基础,符合当时所学习的继承相关知识;

  第二次作业题量缩减为两题,但每一题的综合性增加,第一题较为全面的考察了多态性、继承与链表中以类的属性为排序依据对各类排序,第二题则在上一题的基础上增加了正则表达式的多维判断,必须要很严格的判断输入的多项式;

  第三次作业是在第二次作业的基础上,添加接口以实现高效快速的链表内的类排序;在加分题上考察了素数个数的高效算法

 

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

  这三次作业都是在类图的结构指引下完成了对每一个类的封装,而继承和多态性则是贯穿始终。在关于图形的各个题目中,对于每一个具体的图形(圆Circle、矩形Rectangle、三角形Triangle以及梯形Trapezoid)都是继承自Shape类(抽象),这样很好的体现了继承关系,降低了各具体图形的耦合。同时为实现多态性做好铺垫,在构建相似的属性和方法上,通过依赖到达主方法,并通过各功能的选择调用实现了多态性,反馈了对多类下不同需求得到了所需要的的应答。

 

 

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

  在第一次作业时,我是先完成了较为基础简单的后两题,当我面对综合性和准确性高要求的第一题时,为了完成功能:字符串数据的忽略部分空格、利用正则表达式的知识校验数据以及数据的计算等,我耗费了大量的时间去学习正则表达式的相关内容,有关字符串的各种处理(筛选、去除空格、StringBuilder等各种方法),但是最终没能完整的解决这道题目;

  在第二次作业时,首先是第一题,一开始我没能很好的处理输入数据和校验判断的顺序以及内容的储存,在我尝试和不断思考后我最终修改成了对每个具体图形使用for循环来输入的方式,通过这种方式,很好的解决了三种具体图形间的数据输入与判断的复杂关系。对于老师提醒的关于类在链表中按属性排序的问题上我并没有犯错,而是利用了排序法和ArrayList类中的set方法实现了交换进而成功对面积排序。而第二题时,我吸取了上一次作业的教训,面对较为繁杂多变的正则的校验部分,我开始变得更加游刃有余,对于每一种多项式的判定与处理,我更加细心,不断地修改并在正则的在线测试里反复尝试,最终获得了成功。

 

   

 

  在第三次作业时,第一题由于认真听讲和自己的实际操作以及上次作业的心得,并没有遇到困难;但是在第二题上由于自己没有认真看清楚格式的要求,在图形数量0上犯错,第二个问题是代码长度超出限定,我再次检查代码,通过删除不必要空行和简化优化复杂代码达到了代码长度的大幅减小,得以完成本题;在第三题的素数问题上,我因为知道不可能使用最简单的遍历法,于是通过资料的查找与学习,比较了欧拉法与筛选法的本质与测试时间,选择了略快的欧拉法,也很好的解决了高效的问题。

 

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

 

 

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

  通过这三次的作业,我感触十分深刻的严谨性认识在于正则表达式和审题这两大部分:先是对于正则表达式而言,在具体校验功能上来说是牵一发而动全身,每一处正则校验都必须非常严谨到一丝不苟,否则对于某些测试用例无法通过,也就是不能很好地包括某些情况,这对于编程也是不应该的;再说到审题,不可以先入为主的臆测题目,一定要仔细的思考,就像第三次作业中的第一题第二题中对于0的不同要求,如果没有很好的审题,就会一直错误,费神劳心,也是很大的教训。

 

二.OO设计心得

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

  封装性 在实体类和处理类中将方法与属性封装,外界只能通过方法来实现功能,使得外界无法直接获取私有属性,既很好地保护了内部信息;

  继承性:通过逻辑上的类继承,子类可以重载实现父类的方法,也继承了父类的属性与方法,这样可以实现子类间的耦合降低,有利于多态性的产生;

  多态性:基于类的继承得以通过相同的行为和不同的调用对象来产生多种状态的反馈,这是Java所特有的功能特性。

 

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

  单一职责原则:对于分配好的类来说,每个类的逻辑上是负责其某一个职责的,只能执行它应有的功能,而不能越界去干扰其他类;

  “开-闭”原则:开闭原则是能够提升代码复用率的实现渠道,基本内涵是对扩展开放,对修改关闭,即可以不断地在基本不破坏上一版本的代码的前提下,根据新的需求直接在源代码上新增功能,这样可以较好的提升迭代的效率。

 

③OO编程思维的理解

  基于对问题处理所需,从逻辑上对类分配后,按要求设计好类中的方法,类间设计好高效率的关系,比如继承、依赖、组合、聚合等,利用单一职责、开闭原则、依赖倒转等原则建构,体现Java的继承和多态特性,并对将来的可能的代码复用做好规划的整体性思维。

 

④类设计心得

  先要做好功能的需求分析,在要求功能的基础上分类,清楚每个类各自按照单一职责原则来实现各自的功能,再通过继承、依赖等方法建构类间关系,只有良好的关系才能提升代码的执行效率

 

测试的理解与实践

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

  1)判断所需功能是否能够实现,通过完整的测试功能,我们才能发现自己的错误并有依据来解决

  (2)提高完成本质功能后的程序的执行效率,我们可以通过测试的时间来改进算法,优化执行的时间,以减少存储空间并且提升操作性。

 

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

  Junit测试是可行的,这种在代码内部的小范围测试更有利于查找和锁定错误范围,或者是对编写过程中的预期结果进行测试,使我们不必再通过debug对所有代码测试,节约了时间,提升了效率。

 

四.课程收获

  自第二阶段以来,我深刻地感受到了自学和钻研实践的重要性,很多时候老师在课堂上的一些内容,我必须要再次查找资料加上自己的实际操作才能掌握,比如现在的正则表达式和链表、泛型与字符串处理以及部分接口等内容,否则在作业环节将花费更大的代价。而且随着课程的进度,题目的实际性和难度都在不断增加,这就要求我们要有良好的心态,面对难题不能抱有畏惧心理,应该通过自己的刻苦钻研来完成它,每一次成功实现都会产生一次很大的满足感,才会不断前进。

 

五.对课程的建议

①第三阶段作业难度、题量的建议

  我希望难度方面是结合课程内大部分学生的水平而设定,照顾编程水平不是那么高的同学,也要能够体现高水平同学能力,既不能过于基础,也不应该陡增难度,这样对于编程的学习热情都不利。可以通过每次作业难度的阶梯划分提高练习的区分度,比如设置一道基础题和较难的加分题。题量方面应该视难度而定,较难则适当减少,偏基础则适当增加。

 

②课程内容讲解方面的建议

  现在老师对于语法方面的讲解比例增加,是非常好的,可以更深刻地让同学们认识基础的知识。同时再辅以生动形象的实例,可以让我们深入浅出的理解重难点知识

posted @ 2020-05-02 11:42  风的缘故  阅读(167)  评论(0)    收藏  举报