301
社区成员
发帖
与我相关
我的任务
分享本单元实验总代码规模如下:

可以看出,代码的主要部分为:
对代码进行oo度量复杂度计算后,分别有主要复杂度如下:

Mainclass、Term、FuncProcess、Expr等主要功能的类复杂度较高,其它类复杂度可以接受。

MyResult中输出结果、Func模块进行字符串替换的部分方法复杂度较高,这体现了部分功能无法太好地解耦,只能集中处理。
三次作业的类图架构均如下图所示,语法树最后得到的统一格式是myResult,而myResult是HashMap<Unit, Biginteger>,区别是:
第一次作业中:Unit是单一的index,表示x的多少次方
第二次作业中:Unit是index和exp,表示x^index*exp(myResult),新增函数处理模块
第三次作业中,在myResult和Unit中新增derive功能
我认为我的类的设计结构较为清晰,各部分之间协作的关系也很明确,缺点是函数处理部分复杂度偏高,可以优化。

结合类图基本结构,给出三次作业依次迭代的设计体验:
第一次作业中:考虑到未来的可扩展性,将语法树的计算结果统一成myResult,方便之后进行扩充
第二次作业中:由于第一次作业留出了myResult的扩展空间,面对exp指数时便在里面进行操作,添加了Unit单元。同时,由于之前功能没有什么bug,在函数处理部分将原来的所有功能包装起来,使用字符串替换的方法而非语义计算的方法进行函数的处理,这样方便debug,也有较好的解耦效果。
第三次作业中,由于myResult中支持求导,于是在myResult中加入了求导模块
如果增加x、y、z等多变量,在Unit中添加对应的变量表即可;如果出现三角函数,也可在Unit部分新增处理。
第一次和第三次作业均无bug,但第二次作业在处理函数时忘处理空字符了产生bug,bug修复时处理掉空字符便可以解决问题、在互测时未发现别人bug。
第一次作业中,将所有输出体现为sigma(coe*x^index)的形式,特判coe=-1和coe=1、index = 0、index = 1等情形即可,在第二和第三次作业中,将exp()中的内容提取了最大公因数,如exp((1000*x+1000)) = exp((x + 1)) ^ 1000。
本单元的学习体会不错,难度适中,相关知识的提前教学也很充分,点赞!未来保持这种势头就很好了。