其他分享
首页 > 其他分享> > BUAA OO Unit1 Summary

BUAA OO Unit1 Summary

作者:互联网

BUAA OO Unit1 Summary

一.程序结构分析

第一次作业

思路:

总结分析

  这次作业可以说是完完全全对面向过程式设计了,责任划分不明,耦合度爆炸,连表达式解析都和MainClass类混在一块儿,丝毫没有为后面的迭代开发留下任何后路,直接导致了后面痛苦的代码重构。

UML图

Metrics

  可以看出这次作业中我函数求导的方法比较复杂,主要原因是我求导和toString的过程其实杂糅在一起了,因此出现了复杂的if-else嵌套使用的情况,因此复杂度较高。

第二次作业

思路

总结分析

  在看到第二次作业的指导书之后,我明白了,如果再使用面向过程的方法,只关注本次作业的要求,那么第三次作业必然重构到死。于是我痛定思痛,开始尝试一些面向对象的方法。

UML图

Metrics

  Parser类的复杂度高在意料之中,但是Term类的复杂度也很高有点出乎我的意料,检查后发现应该是乘法求导过程中双重循环嵌套导致的。

第三次作业

思路

分析总结

  因为第二次的作业设计为第三次作业留下了一些可迭代开发的后路,所以我第三次作业的压力减轻了不少,因此留出了不少时间来思考如何进行优化。

  在优化方面,我做的最大的工作就是合并同类项,并没有针对(((x)))类似的多重括号嵌套的情况进行优化。不过在强测阶段,也仅在个别数据点被扣了很少的性能分。

UML图

Metrics

  和前两次作业的情况相比,第三次作业的复杂度情况得到了很好的改善。

二.Test & Bugs

Test

  在测试方面,我采用了手写极端小数据集和评测机覆盖性测试相结合的方式。

手写极端数据

  这一部分主要是积累自己测试过程中的一些极端样例,例如第三次作业中多嵌套的情况。

对拍器

  我在第一次作业的时候就尝试搭建了一个评测机,刚开始是参照讨论区大佬shell+xeger+sympy的评测机搭建方式,但是感觉并不是很好用(主要是因为我写得太菜)。

  后来在一个大佬的帮助下,get到利用subprocess.Popen()直接在python中用命令行调用.class文件的方法,使用更加方便。并且直接按指导书形式化表述生成表达式,可以解决Xeger生成字符串依赖于正则表达式的正确性的问题。

  利用形式化表述生成表达式的部分代码如下:

def generate_pow_function():
    if let_god_decide(0.3):
        return 'x'
    else:
        return 'x' + generate_whitespace() + generate_index()
      
def genetate_tri_function():
    trif = ''
    if let_god_decide(0.3):
        if let_god_decide(0.5):
            trif = "sin(" + generate_factor() + ")"
        else:
            trif = "cos(" + generate_factor() + ")"
        return trif
    else:
        if let_god_decide(0.5):
            trif = "sin(" + generate_factor() + ")"
        else:
            trif = "cos(" + generate_factor() + ")"
        return trif + generate_whitespace() + generate_index()

def generate_constant_item():
    return generate_integer()

def generate_expression_factor():
    return "(" + generate_expression() + ")"
  
def generate_factor():
    if let_god_decide(0.15):
        return generate_constant_item()
    elif let_god_decide(0.3):
        return generate_pow_function()
    elif let_god_decide(0.5):
        return generate_expression_factor()
    else:
        return genetate_tri_function()

def generate_item():
    if let_god_decide(0.3):
        return generate_item() + generate_whitespace() + "*" + generate_whitespace() + generate_factor()
    else:
        ifx = ''
        if let_god_decide(0.4):
            ifx = generate_minusplus() + generate_whitespace()
        return ifx + generate_factor()

def generate_expression():
    if let_god_decide(0.3):
        return generate_expression() + generate_minusplus() + generate_whitespace() + generate_item() + generate_whitespace()
    else:
        ifx = ''
        if let_god_decide(0.4):
            ifx = generate_minusplus() + generate_whitespace()
        return generate_whitespace() + ifx + generate_item() + generate_whitespace()

bugs

强测

  三次作业强测中都未测出bug,但是第二次作业因为没有优化的问题,性能分不高。

hacked

  第一,二次作业在互测中均未测出bug。

  第三次作业互测中被测出了一个bug。该次bug是因为我过度优化了,把多个相同表达式相乘的情况化简成了表达式的幂次,造成了format error (例如(x)*(x)*(x)我会输出为(x)**3)。而(expression)**index的形式在sympy里是合法的,所以我的评测机无法测出这种bug。这次bug的主要原因还是没有好好阅读指导书,以及自己偷懒没去手写测试样例,过度依赖评测机。

hack

  第一次作业中,大家的错误主要集中在-x**-1这个数据点上,大部分是因为优化的过程考虑不周中导致的format error。

  第二次作业中,有三个同学是因为x**-1*-1类似乘以负常数因子时,符号处理不当造成的bug。还有部分同学因为优化失误,造成了format error。

  第三次作业中,部分同学是采用了大正则导致了TLE,还有部分同学在求导过程中出现了一些失误。

三.设计模式

四.对比与心得体会

标签:OO,return,作业,BUAA,因子,Unit1,解析,generate,表达式
来源: https://www.cnblogs.com/liujiahe0v0/p/ljh_BUAA_OO_Unit1_Summary.html