oo第二单元(5-8周)作业总结
0.前言
这个博客是在完成第二阶段三次作业后,为了总这三次作业而写的,这三次完成的一般。但这几次左右内容很多,接触到的新东西特别多,最先的便是正则表达式,然后是数据的处理,之后便是面向对象的重点,继承,多态。及ArrayList。
1.作业过程总结
①总结三次作业之间的知识迭代关系;
在第五次和第六次作业中都用到了正则表达式,第五次作业第一题要求的是用正则表达式匹配信息是否正确,而第六次作业还要求用正则表达式把信息分组。第五次作业第二题开始出现继承和多态,从第五次作业的继承一个普通的类到第六次作业继承abstract类到第七次作业实现比较的接口。从第五次作业虽然用了继承但是没用到多态,到第六次作业之后开始用多态的方式去执行重写的方法。
第五次作业没用ArrayList,创建的对象很多并且数量不定的时候没有ArrayList会很难办,在后面几次类比较多且继承了相同父类的题目均使用了ArrayList。但是在第七次作业,求素数的时候,数组的长度是已知的,这时候用ArrayList就会使运行这个程序所需要的时间更长。所以ArrayList在数组长度不知道的时候用更好
第五次作业和第六次左右的关于图形,图形只是图形,是抽象的,第七次作业的图形是画在卡片上的,卡片类继承了图形类。这样做是更符合显示情况,更符合人的思维,更直观具体。
第五次作业对数据的处理最重要的是字符串的切割,而且符合标准的字符串是十分规则的,第六次作业求导数每一项的形态太多,用切割字符串去得到每一项十分复杂,这时候用正则表达式分组就非常方便,但在每项把系数和指数提取出来的时候每种形态的格式是固定的用切割字符串的方式会更容易思考。
②如何通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性;
封装性最主要的是信息隐蔽,即尽可能隐蔽对象的内部细节,只提供需要和外界发生关系的部分。比如,类里切割字符串的方法,这个方法是为了给外界输出数据中的一环并不直接与外界产生联系,所以这个方法写成private更合理。封装性的好处在写代码的时候最直观的就是先写完比较简单的之后就可以不用去修改比较简单的类,只要知道这个类其他类能用他来干嘛以及怎么用的就行。这样在处理复杂的类的时候思路会更清晰。
多态性是靠继承性实现的,继承可以使得子类具有父类的各种属性和方法,当需要处理一连串不同的类而需要处理的部分有很多的相似,特别是处理的类的数量不确定的时候,多态特别好用。在第六次第七次作业,处理图形的时候,图形/卡片数量未知,图形类别不同,但都是求面积,父类有面积的方法的话,用多态性加ArrayList处理只需要在创建类的时候考虑这是什么图形,在处理这些类的时候不用考虑具体是什么图形,调用父类的方法去处理就会很舒服。
③作业过程中遇到的问题及解决方法
正则表达式,写日期部分的时候,正则表达式的思维方式和日常思维差别很大,花了好长时间才转过弯来,解决方法是在处理日期时把所有可能的日期用正则表达式的规则列出来,把重复的部分尽量放在一起,比如一个月有31天的有1,3,5,7,8,10,12,把这些月份写在一起,最难的是闰年,闰年我是按网上查到的数学规律写的,然后在所有平年后加一个或在加闰年的2月29天。
在第六次作业求导数时,尝试用切割字符串的方式把每一项切割出来,当时失败了,找不到切割的规律,一开始是按符号切割的,马上发现符号的意义很大,这样切吧符号给弄没了。解决的方式是用正则表达式按每一项给字符串分组把每一组提取出来。
第七次作业时,给带图形的卡片分组,写的挺流畅,提交时代码长度超过限制。开始是想先按类的图形类型排序,排完再按图形类不同分成几条不同的ArrayList,后面把排序去了,直接判断类型分。还是过长,仔细观察发现有些不同行输出格式是一样的,于是把得到输出的字符串单独写成一个私有方法,这样不用每一行输出都来一遍直接调用方法就好。这样使代码长度缩短了很多,复用性也更好了。
④每次作业花费的时间比例
第五次作业耗时最长的是第一题处理水文数据,比剩下的题目加起来耗时还长,这题超过一半的时间花在写正则表达式
第六次作业耗时最长的是求导数,超过一半时间在考虑如何把每一项分开得到相应的对象
第六次作业耗时最长的是第二题给卡片分组,超过一半的时间在把这题的代码缩短
⑤对编程过程的严谨性的认识及教训
第七次作业第二题的输出部分比较繁琐,在没看仔细的情况下就写完了,本来就是这种图形数量为0也输出[]但一开始没输出,导致没看出输出格式是有规律的,一行一行写的输出,结果代码写的又臭又长,长度直接超过规定。
要时刻主要这个变量的实际意义,在把ArrayList中每种图形分成一条ArrayList时没注意到下标变量写错了,导致一直报跟数组长度有关的错,后面dubug才发现。
2.OO设计心得
①对面向对象三大技术特性之间关系的理解
封装性是面向对象编程一切的基础,继承是实现多态的基础
②面向对象设计的基本原则理解(单一职责原则及“开-闭”原则)
单一职责原则会使代码写起来更简便,在写这部分时考虑的东西只是这部分完成的,考虑的东西会更少,这样更容易写,在这个功能需要重复实现时可以不用再写,直接用,代码会更简洁,可读性会更高。
“开-闭”原则,对扩展是开放的,对修改是封闭的,这样之前的功能并不会在扩展之后改变,确保了软件质量,减少了测试的费用。
③OO编程思维的理解
先考虑类,需要哪些类把这个需求实现,每个类有什么,能做什么,该给这个类什么,确定了类的作用后,再考虑类实现这些功能需要什么方法,这些方法能做什么,最后去实现这个方法。最主要的是类的设计。
④类设计心得
在设计父类时最重要的是子类的共同特征。
类是一个一个完成的。不能把代码全部写完之后在去调试,在完成一个功能后就要去试这个功能是否已经实现,不然到全写完错了之后就可能不知道自己怎么错的。
3.测试的理解与实践
①测试对于编码质量的重要性
如果测试不严谨,在实际应用时遇到了没测试的情况就会产生不可预料的结果,代码会出问题,结果不可控的代码质量是很低的
②查阅资料,假设使用Junit进行程序的测试是否可行
是可行的,Junit可以检测给出的代码的结果,根据这个结果可以知道这部分十分正确,一部分一部分试下去就可以找到bug在哪
4.课程收获
接触到了正则表达式,在求导数判断输入表达式是否正确时体会到了正则表达式在判断格式的是否正确时相当好用,在遇到提取每一项这种情况时正则表达式也十分简便。
接触了ArrayList,了解了ArrayList常用的方法,体会到出现一长串数量很多有规律的类时用ArrayList十分有条理,但在求素数那种数组长度固定的情况还是使用了ArrayList,没转过弯来,这种情况用长度固定的数组会更好。
初次使用了继承和多态,体会到在数据统一处理时,多态性可以让程序只关注要处理什么,不用考虑怎么去处理。而且,是根据对象的不同对象自带最合适的方法,不用去考虑不同情况不同处理。如果有新数据需要对应处理的话,通过追加就可以了,在处理图形那几题,不同图形的类甚至可以直接拿来用,加上增加的图形就行,即使这几题的需求不同。
在产生错误的时候,把错误附近的数据输出,和目标数据对比,可以发现具体是在处理什么数据的时候出错,个人感觉比用eclipse的debug更舒服
5.对课程的建议
我没有经验,老师觉得行就行,个人比较希望在作业结束后讲讲大家都错的比较多的地方,以及这题怎么思考是比较合理的
浙公网安备 33010602011771号