BUAA_OO_第一单元总结

BUAA_OO_第一单元总结与反思

摘要

本单元作业分为3次,主要是考察对表达式括号的展开和符号的处理。
Homework1:本次作业,难点只是预处理符号和合并同类项,优化性能。当然,从面向过程的思维转向面向对象是最痛苦的。
Homework2:本次作业在第一次作业基础上加上了函数表达式,但函数表达式的形参实参代换并不难,这次的作业对实参有严格要求,然后加上了sin和cos函数,总的来说只是因子更复杂了,合并同类项的难度更大了。因此诞生了性能分卷怪
Homework3:本次作业就是放宽了形参的限制,可以让函数之间调用函数,只是增加了表达式复杂度,其实不需要怎么增量开发,只用了一小时不到就改完了。

第一次作业

简介

没有一点点防备,也没有一丝顾虑,第一次作业就出现了
第一次作业本身其实难度不大,但我思考了很久才开始写代码,为了偷懒采用了逆波兰表达式中缀转后缀(咱对递归下降不熟悉啊)。
本次作业第一个难点:多余的加号和减号和带符号的整数。这里思考一会儿,我发现多余的加号本身没有影响,减号的影响只跟减号个数的奇偶性有关,奇数个减号就是减,偶数个减号就是加。然后就处理完了,over。
第二个难点也是重中之重:合并同类项,当然要用我们的HashMap啦,把指数作为key,常数项系数就是0次,value就是系数啦(当然要把符号带上),然后就可以用迭代器合并了。

性能分策略

本次作业性能分仅取决于输出的正确字符串的长度,因此必须关注以下几点:

  • 合并同类项
  • 系数1不输出,\(-1*\)仅保留-号
  • 0项直接跳过
  • 正项先输出(毕竟负项会在最开始多个负号)
  • \(x**2\)写成\(x*x\)

Bug解析

本次作业bug几乎就跟性能优化相关:

  • 不少人用的正则表达式(包括我)去消除的1,结果导致\(21*x\)这种数据输出的\(2*x\)
  • 合并同类项时忽略了单个x这种因子,HashMap里存的时候系数存成0了。
  • 对于输出0的结果没有任何输出,没有检查答案字符串的长度。

性能分:犹豫就会败北,果断就会白给

本次作业UML图

avatar

架构分析

  • 第一步:预处理得到的字符串,首先用正则表达式消去所有的空白符,再将多余的运算符消滅する。
  • 第二步:将处理后的字符串转为后缀表达式,数据结构大法牛逼
  • 第三步:开始计算,加法能系数相加的系数相加,不能就不管,丢到项里去,乘方多次调用乘法,乘法就不断生成新的项,减法就把被减数系数改成负的,继续丢,这样我们就得到了多个项。
  • 第四步:合并同类项over,我的常数处理单独写了个类,因为当时思路下先写了合并常数,后来发现其实不用单独写。

度量分析

avatar

中缀转后缀用栈实现导致用了大量的if-else语句,复杂度过高,这的确没法优化,但是稳定的,另外,getFactor方法的复杂度也过高,其实可以优化。

avatar

可以看到我的LCOM值还是很小的,说明我的内聚度较高,耦合度较低。

Hack策略

没hack过。

心得体会

随机测试!随机测试!随机测试!
不要自己想几个测试点测了就结束了。

第二次作业

简介

第二次作业引入了函数表达式和三角函数,这次作业对实参和三角函数里的因子限制很多,估计是为了方便大家进行增量开发,因为要加更多的方法和类。难度上了一个档次,要注意的细节就很多了。

性能分策略

  • \(sin(0)\)替换成0,\(cos(0)\)替换成1
  • 项里能合并的因子合并
  • 其余优化同第一次作业

Bug分析

  • 做减法暴力变符号的时候没有注意到三角函数里因子符号不能变,导致强测因为这个炸了三个点。
  • 暴力去零的时候把三角函数里的0也去掉了,强测因为这个也炸了三个点。
  • 有些同学读题不仔细,sum的上下界相同时默认为0。

强测分:暴力出奇迹

本次作业UML图

avatar

架构分析

  • 在运算里新增加了一个SinCos类,因为我把Sin和Cos视为运算符,且是运算级别最高的运算符。
  • 增加了一个Replace类,用来实现函数表达式的替换,里面一个Summation类,用来实现sum求和函数的功能,一个function类,用来实现f,g,h函数的对应替换。
  • 有个关键的新加类是matching,它是为了正确的匹配左括号和右括号,避免替换错误。
  • 因为sin和cos的特殊性,所以专门写了个MergeSincos类来合并。

度量分析

avatar

由于是增量开发,所以作业1中留下的方法的圈复杂度没有改变,但新增的方法的圈复杂度都很低,封装度很高,用起很舒服。

avatar

LCOM值还是都比较小,耦合度低,很舒服。

Hack策略

没hack过

心得体会

没有多做测试,以至于强测bug全是第一次作业留下来的祖传bug,所以就算完成了上一次作业的测试,也不代表架构没问题,相反,可能会有一堆bug。

第三次作业

简介

第三次作业放开了数据的限制,函数之间可以调用函数,三角函数里的因子可以有表达式,第二次架构好的话其实不需要大改。

性能分策略

  • 三角函数里的括号只保留必需的,尽量化简掉表达式。
  • 其余同第二次作业。

Bug分析

  • 求和函数的上下限是大整数,没有用大整数型无法解析。
  • 三角函数里缺少必要的括号,如\(sin((-x))\),不少人缺少一对括号。

本次作业UML图

avatar
第三次作业的类与第二次基本无差别,就是重写了类里的一些方法。

架构分析

  • 对三角函数里的因子要换成表达式类型,不是原来的幂函数因子或者常数因子。所以对于三角函数合并同类项的方法要重写。
  • 其他地方与第二次作业无异。

度量分析

avatar

仍旧是老问题,没有能力对中缀转后缀的方法进行优化...

avatar

耦合度依旧较低,符合“高内聚低耦合”

心得与体会

第一单元终于结束,最后在hack和优化上都摆烂了,但还是没有深刻理解到面向对象的思维,希望第二单元多线程能登堂入室吧。

posted @ 2022-03-24 22:00  HiDen_01  阅读(76)  评论(1编辑  收藏  举报