OO面向对象第一单元总结

OO第一单元小结    

一.三次作业代码分析。

1.第一次作业

       第一次作业作业是完全简单幂函数的求导。难度较低,但是对于刚刚入门JAVA的我来说,对于类与对象的理解与应用还不是很熟练,以及怎么构建出一个层次,以及层级间如何进行数据交互是一个头痛的问题。

       最终经过不断考量,勉强做出一个我自己比较满意的结构:Main函数入口,构建表达式类Poly,先去除多余空格与符号,然后依据+-号来进行项的分割,构建item类,提取其系数和指数,在Poly类构建一个 Arraylist 来储存每一个item的系数和指数,求导法则较为简单,只需要根据系数和指数进行更改即可,然后将更改后的系数和指数返回得到新的Arraylist,再合并同类项,构建 toString 方法,生成表达式输出,基本上就完成了格式正确情况下的求导正确性部分了。

      WF格式的判断对于新手来说的确不友好,大串正则不仅容易出错还容易爆栈,但是惭愧的是,第一次作业我还是使用了大正则,以至于再过了中测后,自己还是找到了不少bug。爆栈的问题也是经过大佬指点,知道贪婪模式和懒惰模式,在结尾加一个'+'号就解决作业了中的爆栈问题。

     类图:

    

     度量分析:

    

   

2.第二次作业

     第二次作业相比第一次作业增加了sin,cos和连乘,格式判断也更为复杂。但是大体思路没有变化,我仍然采用第一次作业的结构和思路,虽然完成地比较顺利,但是基本没有可拓展性,导致我第三次作业推倒重来。

     类图:

    

 

    度量图:

   

    

 

3.第三次作业

    第三次作业难点在于嵌套和表达式因子,并且没有很鲜明的几个特征值来直接进行求导,所以前两次作业的架构完全不行,于是我开始了灾难的重构。但是由于对接口和继承的用法没有理解到位,所以在构建的时候也没有将之运用在程序之中。

    本次作业的输入格式分析和第一二次完全不同,因为带有嵌套因子和表达式因子。所以这次作业,我先进行了表达式预处理,排除掉一些错误情况,然后在递归求导的过程中,对每一个非表达式因子进行合法性判断,嵌套因子和表达式因子则拆开之后继续递归调用poly的depart()方法进行拆项求导。并且由于递归的使用,为了追求正确性,我放弃了优化。

类图:

  

度量图:

 

   PS:此外,由于刚接触OO这门课程,每一次作业对我来说都是不小的挑战。于是我采用了上学期祭祖写P7的方法,先在脑子里思考好大部分情况,写一个简要的设计文档,提醒自己该干嘛,该怎么写,有哪些情况要考虑清楚,这样不仅会减少出bug的概率,也会在写代码的时候事半功倍,这也是我为什么周六或者周日才开始编码的原因。由于第一二次作业思路较为简单,在此我只贴出自己第三次作业的"设计文档": (由于是一个思路草稿,写得比较粗糙,若有错误和遗漏(肯定有),望包涵并指正)

     

 

二.BUG分析

第一次作业

(1)在公测时候没有处理好WrongFormat的判断,导致爆栈和错误输出。

   (2)  没有考虑到空白字符只能是/t和<space>

   (3)  在求导后,删除系数为0项后没有考虑到当每一项都为0的时候也要输出一个0

第二次作业

  (1)在删除系数为1的时候直接采用了replaceAll方法,导致可能会有系数为11或者指数为-1的时候省略导致出错。

第三次作业

   (1)WrongFormat的复杂性没有考虑全以及手抖出现的错误,导致公测过得比较艰辛。

   (2)由于进行嵌套因子检查的时候,出现了数组越界访问导致sin(-1)此类的数据给判了WrongFormat。

 

三.互测攻略

        这三次作业,我每一次都是将每个人的src放在一个src不同的包中,先大致浏览一下代码,然后一个一个进行手动测试,测试的数据是自己课下以及在互测阶段出过bug的数据、自己构想的一些边界数据和室友大佬提供的一些测试样例。虽然效率较低,但是也还是成功地hack到了一些同学(抱歉)

 

四.反思与总结

  1.第三次作业中我并没有处理好sin(--1)或者sin(---1)此类数据,因为我在简化字符串的时候把多个符号合并为了一个,导致不能检测到此类错误,当互测时候意识到这一点的时候,发现想更正已经是难上加难,这说明我的架构还有待优化。

  2.通过第一单元,我主要学习到了方法和类的灵活运用、数据的管理与交互以及复习了C语言的面向过程方法(微笑),但是对于面向对象的思想还不是很能理解透彻,甚至在写作业的时候,不太明白自己这样写到底是面向对象的写法还是面向过程的写法,反正只想着能AC就行了,希望以后自己能改善一下这种做作业的态度。此外,我仅仅只在第三次作业中引入了一个求导的接口,然后在因子类里面进行的接口的引用,对于继承、多态和接口,并没有能理解透彻其用法和意义所在,也不太能充分运用,我会尽力在以后的作业多注意架构的思考。

猜你喜欢

转载自www.cnblogs.com/qmxdzy/p/10599590.html