java第二作业周期(5-8周)作业总结

0.前言
针对第二阶段的作业(共三次)发表总结性的博客,作业在PTA上发布,近一周一次。每次作业在刚发布后即高效快速满分完成,但第二阶段的作业在PTA提交时有不少坑,有许多需要注意的地方,后对第二阶段作业作如下总结:
1.作业过程总结
第二阶段的这三次作业告别了第一阶段的披着Java语言语法的面向过程,进一步在老师建议的UML类图的设计下,加深对面向对象的理解。

第4次作业的图形继承和蒙特卡罗方法求圆周率相对简单,是放出来练练手,但水文数据校验及处理则是一个综合性的应用题目,也是第1次考察正则表达式的应用,对于本道题来说的话,乍一看是没有思路,但其实一步一步分解可以先从主函数的输入下手,采用单一原则,分别用CheckData检验数据的合法性,用DealData处理数据,用HydrologicalInfo储存数据,最后再拼接起来即可。
第5次作业的图形继承与多态是第4次作业的延伸,但老师课堂上讲过,所以说也没有过大的难度,一元多项式求导是考察多项式的正则表达式,指数项以及常数项的求导,虽然情况多且复杂,但一步一步拆解后,也可豁然开朗。
第6次作业是图形卡片类的两道题,再有了前两次作业的基础上,难度也不算大,主要是学到了Comparable和Comparator两个接口的应用,最后一题求素数是考察优化,所以说需要好好斟酌一下,避免运行超时的基础上,尽量使自己的算法能够在同等答案下运行最短时间内得到,所以也可以总结出好几种求素数的优化方法。

针对三次作业遇到的问题来说的话:在第4次作业第1题中需要注意的是字符串转数字的过程传入数据实体,另外就一定不要忘记初始时要申请引用空间,否则系统会报空指针,在分割字符串时也要注意,考虑到空指针的情况,比如如果没有dt[3],而分割时又要以dt[3]分割。在第3题中需要注意,题目中是按宽,长,高的顺序来输入,虽然题目没有考,但以后如果考的话还是要注意这个顺序的细节,另外错误格式时不输出构造打印,小数打印时要四舍五入,格式错误就是指打印各个面积中最后一个面积隐藏的空格。不然就会出现如下的疏漏情况:

在第2题中一开始写的都比较顺利,但一提交就直接报错了,后来检查发现:第一,随机生成也有需要生成一个对象空间,第二,整数类型的数相除时别忘记化成小数,比如要4*num*1.0/n,在圆形边界上的情况也是可以的,第三,循环时不要尽量不要在循环里面new,因为申请多余的new,有循环会内存超限。
第5次作业和第6次作业相对较为简单,但也学习到了一些新的内容,比如一个无限大的数进行加减乘除,要使用大整数BigInteger类型,它与String之间的转换与int之间的转换,从百度中学习到了,另外需要考虑的就是一些边界情况,就是pta中比较坑的一些测试点,比如连续输入为多个空的情况和数据中带空格的情况、圆半径为0的情况以及一元多项式求导中的数字带空格的各个情况中应该输出什么,在求素数的算法优化中,循环根号n次就可以代替循环n次采取降低为对数级的优化方法,可以使我们运行效率事半功倍。

总的来说,写代码的花费时间不多,但其他时间主要花在了调试方面,PTA部分测试点非常坑,需要不断理解老师的意思,然后在严谨性方面多思考,多角度考虑问题,每一项按照规定的输出规范输出,把所有的情况都考虑在内。这样在以后的实际问题,实际的公司才能得到更多的发展机会。

2.OO设计心得
做一些心得的话,就拿图形卡片排序游戏来说,如果要拆解,可以采用如下老师建议的UML类图:

 

但是我当时刚看到题目的时候,第一想法想到的是曾经在ACM训练中用到的HashMap一一映射容器,也就直接开写了,我没有使用comparable接口,而是利用Map容器映射特性,分别把,图形的名字一一对应图形的面积,存储到容器中,然后针对图形的面积进行排序,如下:

这样的话会自动将图形的名字根据面积而进行移动,但后来考虑到本题是可以输入多个相同的图形名字,比如可以都是 Circle,可以都是Rectangle,而HashMap映射容器的特性是不能存储多个相同内容,如果有相同内容会自动替换,这样的话无论你输入多少个,最后输出的只有最后一个,因此就要考虑到,Java语言库里面的HashMap容器类的构成,需要重写equals方法和HashCode方法,避免相同内容的自动替换,这样的话在多个相同内容的情况下也可进行排序。部分重写内容如下:

 

总的来说:封装性就是利用抽象数据类型将数据和基于数据的操作封装在一起,保护数据并隐蔽具体的细节,只保留有限的接口与外界联系,继承性就是使子类的对象拥有父类的全部属性和行为,同时可以增添自己的所特有的属性和行为。这样可以节省写共同具有的属性和方法代码的时间,有利于代码的复用。多态性就是一个程序中同名的多个不同方法共存的情况,通常使用方法的重载和重写来实现类的多态性,通过继承父类来实现,而比抽象类更方便的是将抽象类定义为接口,这样在单一职责的基础上,面向修改关闭,面向扩展开放。

3.测试的理解与实践

测试是一个整体设计之后的过程,需要先对整体的设计与规划,测试过程要去想测试方法,测试用例,首先验证基本功能是否都被实现,然后针对时间和空间是否需要去优化,有时也要借助辅助工具进行测试,比如Junit,这个过程需要先导入Junit包,然后编写测试代码测试时间,测试数据,测试异常等。使用Junit测试的好处就是很直观,方法少的时候可能凸显不出来,但当方法多时,比如有1000个,就能凸显及其大的优势。


4.课程收获
总结的话,可以说这三次作业是进一步增强对面向对象的理解过程,主要侧重点在与设计,如何设计才能更方便,耦合性更低,对以后扩展更有利。多利用其继承,封装,多态的特性,利用单一职责、开闭原则等对每个类进行详细设计,补全分析过程中遗漏的属性,并确定每个属性的数据类型。另外在设计时每个方法有各自的单一功能,方法中的代码一般不会超过30行,只需要满足本身需要实现的功能即可,在命名的时候也要直观,尽量做到所有人一眼能够看懂。


5.对课程的建议

听老师说第三阶段没有老师提供的UML类图,我觉得这样做更能让同学们自由设计出更好的类,进一步锻炼优化能力,题量的话,我更偏向于一道题,即针对一个实际问题不断扩展,不断增加难度,考验多方面的,多角度。希望PTA的测试点不要那么坑,题目应该点明各种情况下各自输出什么,因为每个人的设计不一样,代码结构也不一样,所以极端的测试情况可能会跟老师的代码输出不同的答案,而PTA又是卡测试点,所以我觉得可以弱化这种未知情况下的标准输出,可以多考察设计。课程内容讲解的话,更希望多讲一下实际问题怎么设计代码,先是每个人是怎么设计的,然后更好的设计是什么,可以用到哪些技巧。

猜你喜欢

转载自www.cnblogs.com/scy-blog/p/12804239.html