buaaoo第一次博客作业
经历了四周的oo课程学习,对本单元进行一个总结。
因为前三次的作业对类的划分提醒的都很明确,所以在总体设计上并没有遇到太大的困难,不过由于自身把握的不到位,老是想着一个类的目的,所以导致一个类里面的属性和方法都很单一,类之间的交互也极其少,说直接点就是更像是写得一个函数,看不出什么面向对象的思想,所以就导致我的类图大概是长这个样子。。。



关于我的设计思路
前两次作业相对来说很容易取巧,我也是这样做的。。就拿第二次作业来说,出现的函数只有三种类型:sin(x),cos(x),x;所以我只需要统计这三种函数最终的指数,化简成x^a*sin(x)^b*cos(x)^c这种形式,输出要是不考虑化简的话甚至可以一步得出(a * x ^ (a - 1) * sin(x) ^ b + x ^ a * b * cos(x) * sin(x) ^ (b - 1)) * cos(x) ^ c - sin(x) ^ (b + 1) * x ^ a * c * cos(x) ^ (c - 1)这种统一的形式,这样一看好像第二次作业不考虑化简的问题可以说需要做的只有判断正则形式+统计各个函数的次数,而且因子的正则表达式相对第三次作业而言也比较简单,三种因子的正则表达式如下:

而第三次作业就没有什么取巧的方法了,必须要老老实实构造各种因子的类,其中由于嵌套因子和表达式因子的缘故导致一个因子的嵌套法则和表达式作因子的法则可以各种交织导致单是一个因子看上去就十分复杂,但是仔细思考过后只要将各个类构建好然后采用递归向下分析方式来处理一个表达式其实也没有咋一看那么复杂,比如三角函数类和幂函数类就处理他们特定的sin(x)^a,x^a这种函数,这里要注意一下b^a的形式是不允许出现的,但是sin(b)^a这种形式却是允许的(当时我也没有注意到这一点导致互测的时候这里被hack了5次、。。),然后嵌套类是负责处理嵌套类型的因子,这里的三角函数类,幂函数类和嵌套类可以统称为因子类,因为他们都是用于处理单个因子的类,然后项类负责处理一个项,处理的时候肯定设计到递归调用自身以及各类型的因子类,这个类也就是指导书上面所提及到的乘法规则类,对于它我的设计思路是将一个项第一个因子当作是一个单独的函数,后面所有因子相乘当作一个函数,这样根据乘法规则再调用因子类进行求导就直接将第一个因子处理掉了,然后就是递归调用项类的方法处理剩下的2-最后一个因子,然后肯定也有表达式类,也就是加法规则类,在这个类中也涉及到递归调用自身以及调用项类,同时它也被因子类来调用(因为嵌套法则的缘故),然后开始就是从表达式类进行的递归向下分析,只要每个类把自己的事情干好就可以了(这里强烈建议对每个类进行完整的单元测试,不然最后就会发现全部写出来后bug实!在!是!太!多!了!而且de完过后过了公测还完全不知道有多少bug剩余的那种),这里涉及到非常多具体的细节,比如说sin(x)后有没有^a这种次方形式,然后递归的时候return 是否需要在被递归的式子两边分别加上"("和")",对于指数和常数有没有“+“和”-”啊,进行字符串具体if判断的时候前面一定要加上.length大于多少不然就会有一万种方式造成越界一系列的问题。所以再建议一遍每个类都要写单元测试。
bug相关
前两次作业几乎没有遇到什么bug,最大的bug的话大概就是来自于long型数据所能提供的位数不够导致的,为了处理这个bug直接引入BigInteger的包保证位数的充足,但是BigInteger类型的交互方式及其不方便,只能和同类型的数据进行交互并且加减法都要用包所提供的特定的方法进行计算,所以直接导致了我大面积的修改代码,这算是比较麻烦的一个bug了,除此之外就是一些小bug,我自己互测的时候也测过,比说说+++6允许,+++ 6不允许,+++x不允许,++x和++ x均允许之类的。
然后第三次作业我第一回写出来后bug就太多了,以致于经常自己测试一个测试样例都出两个bug,都是各个类的细节问题,而且能出bug的地方也太多了,感觉非常依赖逻辑的严谨,建议写之前花大量的时间总结各种各样的例子,比如公测虽然强测都过了,但是互测还是成了别人的大礼包,被hack的bug我总结了一下,大概是:1:在表达式中调用项的时候对每一项的划分产生错误,我对项的划分的方法是从第一个字符到左右括号要能相互抵消并且下一次字符是“+”或者“-”为止,现在一看就有很大的错误,比如说x^+3和x*-3*x这一类简单的形式都会错误划分,当然修复这个bug也很简单,就要求“+”和“-”前不能是“^”或者“*”,2:没有考虑指数带“+”和“-”的情况,3:任务sin(2)^3这种形式是错误的,4:在项类中递归调用自身时对“(”和“)”应添加的情况没有充分考虑。当然这些bug都不算是太麻烦的bug,但是在做的时候真的很难时时刻刻都考虑到所有的情况。
第一单元的oo作业已经过去,希望接下来能继续加油,对面向对象编程有一个更深入的理解。
浙公网安备 33010602011771号