OO第一单元的总结与感受

周运贵-22371276 学生 2024-03-22 16:19:35
  • 基于度量来分析自己的程序结构

    • 画出自己作业的类图

       

      • 每个类的设计考虑:
      1. 在第一次作业中,我利用了训练中提供的代码进行表达式的解析,也就是使用了稍作修改的Parser类和Lexer类进行表达式拆分成项,项拆分成因子,最终将输入表达式存储到一个Expr中。同时,考虑到最后的要求是拆开括号,还新增Poly类和Minomial类,分别表示多项式和单项式。其中Poly类中的成员是一个key为单项式的x指数,value为Minomial的HashMap,使用HashMap使得单项式加入多项式更加方便(只需要实现Poly的addMinomial方法即可,利用HashMap的特性实现合并同类项)。这样我只要实现Expr到Poly的转换就好了,也就是把Expr的每一个Term都乘开,合并到输出的Poly即可。
      2. 在第二次作业中,如果要实现合并同类项,key为单项式的x指数,value为Minomial的HashMap不能满足要求,因为单项式可以含有exp,exp上是一个多项式。因此为了实现合并同类项,我将HashMap改成TreeMap,并将x指数和exp指数封装成Mino类,作为单项(不含单项式的系数)成为Poly的TreeMap的key。为此,我实现了Mino,Poly,Minomial的Compareto方法,使得exp指数的比较能够正常进行。(在这个过程中我没有意识到x指数已经可以超过int的限制,因此在强测挂了一个点,其实那个点我的代码性能也不够,CPUtle了);与此同时还需要实现函数调用,我使用的是字符串替换方法,为此建立了Func类存储每个函数,Allf类管理所有函数,在输入表达式的预处理中递归替换每个自定义函数。
      3. 在第三次作业中,在我的代码架构下,只需要实现dx的正确读取,将dx内部的表达式先展开成Poly再实现Poly的求导即可(事实上就是实现Minomial的求导),代码比较简单。
    • 以下是我代码中所有方法的一些度量,可以看出实际上在函数调用的处理上很明显由于分配时间较少写得很臃肿,是非常面向过程的写法:
    • 架构设计体验

      • 第一次迭代中新增Poly类和Minomial类,并在Poly使用HashMap(后面换为TreeMap)就是认为合并同类项是最重要的一点。
      • 第二次新增Func类和Allf类管理函数调用,使用字符串替换的方法解决函数调用;新增封装类Mino并实现Compareto方法,是为了实现exp的比较和合并。但是这个设计很明显是不如直接解析函数定义式再处理输入表达式的,如果能分配更多时间扩展表达式解析会更好。
      • 第三次只是新增Poly和Minomial的求导方法并优化了字符串替换逻辑就提交了。
    • 分析自己程序的bug

      • 分析未通过的公测用例和被互测发现的bug:
      1. hw2的强测中第二个点挂了,不仅没有在x指数使用BigInteger存储,多层括号高次幂的展开也效率不足。对于程序性能的bug,我的找到的核心问题在于在读入解析时,每次读到左括号便会创建Expr对象再深一层解析,但是读入完毕后才会执行Expr转换成Poly,这种从最外层转换的方法会遍历到本不需要遍历的许多对象,因此在每次parseExpr方法我都加了一步对得到的expr先进行Poly的转换在作为返回参数,实现了内层展开括号,加快了多层括号高次方的展开效率提升。
      2. 然后就是BigInteger的bug,这个把Mino封装的x指数的类型改成BigInteger即可
      3. 在hw3互测被hack了,目前找到的问题应该是exp指数的解析效率过慢,单层exp的解析效率远远不如单层括号的展开效率。
      • 对比分析出现了bug的方法未出现bug的方法代码行和圈复杂度上的差异,并思考可以通过怎样的方式来降低方法的复杂度:
      1. 出bug的方法(效率过低),主要是parseExpr方法,圈复杂度较高,代码行数也不少,而一般实现简单,圈复杂度低的方法不容易出bug,出了bug也很容易定位;
      2. 要想降低方法的复杂度,我认为需要合理地细分方法的职责,尽量实现一个方法的单一职责,不要想着让方法都尽量地通用而写得过长吗,细分职责不仅能降低方法行数和复杂度,还能更好的定位bug。
    • 分析自己发现别人程序bug所采用的策略

      • 很遗憾我在三次作业中并没有hack成功过,事实上前两次作业我的房间里都非常和平,没有人被hack,另外我也没有搭建评测机,只是手动构造一些数据。
      • 观察房友的代码架构和设计并在两天时间内找到可能出现的bug对我来说还是过于耗费精力而无用了(看半天不一定看得懂不说,还可能别人的代码没有bug)
    • 分析自己进行的优化

      • 这个单元我只在第一次作业实现正项提前,第二次作业不输出不必要的exp括号,以及实现了合并同类项,没有更多优化了(比如提取公因数),也因此没有遇到很多人遇到的公因数为负数的bug(但是我互测房间也没有人有这个bug)。
    • 心得体会

      • 学习了递归下降的分析方法,让我感觉收获很大;另外进一步认识到类、方法等在职责划分、减少耦合方面的重要性,这样才能在迭代的过程中少修改。
    • 未来方向

      • 工作量分配可以优化一下,hw2的工作量明显高于另外两次作业。
    ...全文
    37 回复 打赏 收藏 转发到动态 举报
    写回复
    用AI写文章
    回复
    切换为时间正序
    请发表友善的回复…
    发表回复

    301

    社区成员

    发帖
    与我相关
    我的任务
    社区描述
    2023年北航面向对象设计与构造
    学习 高校
    社区管理员
    • YannaZhang
    • CajZella
    • C_ecelia
    加入社区
    • 近7日
    • 近30日
    • 至今
    社区公告
    暂无公告

    试试用AI创作助手写篇文章吧