BUAA OO homework Unit1 总结与反思

第一次作业

程序结构分析

第一次作业由于只要求了幂函数和常数的求导,并且组合规则只有相加,我只设置了项类和多项式类,多项式类用于解析输入信息和求导,而项类主要用于输出,其类图如下。

![](https://img2020.cnblogs.com/blog/1951834/202003/1951834-20200317200544241-1593934522.png)
完成了第三次作业再回过头来看第一次作业的对象和方法设计都有很大的不足,职责划分不明,耦合度过高,而且只关注了本次作业的要求,没有为后续的开发留下空间,导致第二次作业的扩展工作进行的十分艰难。 第一次作业的代码复杂度分析如下
![](https://img2020.cnblogs.com/blog/1951834/202003/1951834-20200317201026520-1582538058.png)
我们可以看到其中的比较函数和输出函数的基本复杂度较高,但是项的输出较为复杂,所以输出函数的基本复杂度较高可以理解。而比较函数的复杂度较高说明我的代码中项比较的方法较为抽象,应该加以改进。同时输出函数的模块设计复杂度和结构复杂度都比较高,需要寻求更为简洁的输出方法以避免在这一部分出现不易被发现的bug。

bug分析

本次作业在强测中获得了100分,同时在互测中也没有测出bug,但是在本地测试的过程中出现过合并同类项时在for each时对hashmap进行remove操作的错误,说明我需要进一步学习java中容器相关的操作与特性。同时在互测中我使用了对拍器,但没有发现别人的错误。

体会与反省

本次作业的完成较为顺利,但是由于没有为之后的开发预留足够的空间,导致第二次和第三次作业的扩展和编写都出现了一些困难,说明我应该进一步理解面向对象的思想,寻求结构层次合适的对象和方法的设计思路以完成作业,同时保证迭代开发的顺利。另外,第一次的互测环节让我意识到只有对拍器是远远不够的,还需要积累一些特殊的极限数据在互测的时候使用。

第二次作业

程序结构分析

第二次作业的要求在第一次作业的基础上加入了三角函数,组合的规则在相加的基础上加入了相乘,引入了因子的概念,但是因为三角函数的内部只可能为x,我就选择了使用四元组的方法表示了每个因子,同时四元组的方式也便于进行同类项合并和最后的表达式化简工作,但是这个选择直接导致了我第三次作业没有延续前两次作业的代码,而是直接重写。因此,此次作业中我设计了5个类,分别是用于存储各类正则表达式的正则表达式类expression,用于处理字符串的处理类StHandler,这个类的主要功能有合法判定,去除各类空格,以及将多个符号转化为一个和减去的项变为-1*项的转化工作等,存储并处理项的Term类,以及存储并处理表达式的Poly类,类图如下。

![](https://img2020.cnblogs.com/blog/1951834/202003/1951834-20200317202912893-11027253.png)
可以发现仍有少数的职责划分不明的问题,对幂函数和三角函数的求导方法应该放在Term内部,或者另外增加幂函数对象和三角函数对象,并把对应的求导方法放入对应类中。 下面是代码复杂度的分析,由于此次作业中方法较多,我只选取了出现问题的代码复杂度进行分析。
![](https://img2020.cnblogs.com/blog/1951834/202003/1951834-20200317203431918-977633103.png)
可以发现其中第一个问题是表达式的第二次化简的模块设计复杂度较高,这个部分是我用来化简$sin^2$与$cos^2$的,其中反复进行了调用了获取指数之后调用相等的操作,应该考虑直接在项的类中设计一个方法直接获取所有的指数。第二个问题是第二次格式检查的基本复杂度较高,此处是我用来检查幂函数的指数绝对值的方法,我在此方法中寻找指数的方法较为复杂,应该考虑化简。

自我bug分析

此次作业中我强测获得了94分,互测环节没有被别人发现bug,强测失分主要集中在性能分上,由于我只考虑了三角函数的平方的化简,没有考虑高次的三角函数可以进行递归化简,导致我在三角函数求导相关的测试点上性能失分较为严重。

他人bug分析

此次互测中我成功hack一次,吸取了上次的经验教训,没有直接使用对拍器进行测试,而是对几个易错点先进行了查看,比如对绝对值不能超过10000这个要求的理解,项的特殊形式,也就是可能存在三个加号的处理,等等,最终找到一个对绝对值不能超过10000要求理解有误的同学。

体会与反省

此次作业中的失误和第一次类似,只考虑了当下任务完成的实现,没有放眼于迭代开发,在互测中观察学习了别人的代码之后意识到了应该尽量把组合在一起的东西解耦并分别设计类和方法,比如应该设计一个因子类,然后设计幂函数和三角函数的类继承自因子,然后用项去包含因子等等。同时觉得在有优化上的思路需要更加开阔。

第三次作业

程序结构分析

此次作业的要求在原有的基础上添加了包含的组合规则,引入了新的求导规则,也改变了四元组的结构,导致我第二次作业的代码不能继续适用。此次作业一个很大的特点就是表达式的递归定义,因子可以是带符号整数,幂函数,三角函数,也可以是一组括号中包含的一个表达式,同时三角函数中的参数由只可能是x变为了可以是任意的因子。这给表达式的分析带来了很大的难度,我在网上搜索了资料,最后认为还是通过递归解决这个方法较为稳妥。
我选择方法流程大概是这样,在当前层搜索所有最外层括号,先把最外层括号中的东西留存起来,然后把内容替换成一个不影响原表达式的字符,比如一些没有定义过的符号,然后先对处理过的字符进行匹配,如果合法,再继续递归匹配括号中的内容,内容也要注意分为两种,三角函数后接括号内的东西要判断是否是因子,而其他括号内的东西要判断是否是表达式。同时要注意,如果要使用这种方法,首先要用栈来匹配一下括号结构是否正确,如果括号结构不正确就可以直接输出wrong format。

![](https://img2020.cnblogs.com/blog/1951834/202003/1951834-20200317210659450-1473688764.png)
接下来分析对象的设计,毫无疑问我们仍然需要处理字符串的StHandler类,处理表达式的Expression类,代表一个项的Term类,而此次的项尽管复杂,但在抽象后也可以用一个五元组表示,这五个元素分别是此项的系数,幂函数因子,两类三角函数因子,和表达式因子。考虑到此次三角函数内部内容可能多种多样,我考虑使用arraylist存储各类三角函数。拆解成五元组之后,我们意识到还需要系数类,幂函数类,sin函数类,cos函数类,由于表达式因子的特殊性,其可以递归使用处理表达式的Expression类。 三角函数类的设计中,以字符串的形式存储了内部的内容和三角函数的指数,在作业做完后反省,其实应该创建一个统一的因子类,五元组的每个类都继承自因子类,而后在三角函数中存储其内部的因子,这样可以使结构更加清晰。 同时我认为其实系数类是不必要的,可以直接以数字的形式存储在项的内部,因为除了相乘操作和比较操作外,这个类中没有其他的方法,而这些方法都可以直接内含在其他方法中,使用此类只会徒增结构复杂度。 接下来是代码复杂度的分析。
![](https://img2020.cnblogs.com/blog/1951834/202003/1951834-20200317210928728-1827176490.png)
可以发现表达式的构造方法和格式检查方法的模块复杂度和调用都较多,原因是这两个函数都通过了递归的方式进行。表达式递归定义自身,格式检查递归,一层一层的检查格式。可以考虑一下除了递归外的其它解决方法,此次数据量较小,如果数据量大时递归甚至有爆栈风险。
![](https://img2020.cnblogs.com/blog/1951834/202003/1951834-20200317211209749-2142972096.png)
可以发现项的求导各项复杂度都较高,反省原因是因为部分类中方法的多态不够完善,进行了很多类型转换的工作。 ### 自我bug分析 此次作业我在强测中获得了86分,在互测环节中被hack6次(其实都是一个bug,他们好狠啊嘤嘤嘤),产生问题的原因是,我对所有负号都进行了处理,将$-x$改为了$-1*x$,将-(改为了$-1*($等等,导致字符串的长度变长,而我的StHandler类中处理字符串应用了静态数组,静态数组只开了65位,事实上在经过负号处理之后字符的长度可能*1.333,所以产生了RE。另外,这个错误其实在中测中就已经初见端倪,但是我尝试了一下抛出所有错误然后输出wrong format就通过了此测试点,说明不应该只知其然,还应该知其所以然,不然会遭报应的。 ### 他人bug分析 此次互测我hack到了两个错误,此次我采用的策略主要是检查我在自行测试的时候出现过的错误点同时结合极限数据进行测试。 ### 体会与反省 此次的长进主要是学会运用多态和重载等操作了,但是在对象的结构层次设计上仍然需要加强,比如对于有共性的对象创建一个统一的父类,通过工厂模式等进行管理和操作。 ##综合总结 经过对第一单元的三次作业总结可以发现,我仍然对面向对象的一些设计思路和思想有较大的欠缺,应该重新学习对象关系的设计,对象关系的管理,应该多写代码对这些方面进行练习。同时在以后的作业中,应该先考虑程序的结构,对象的关系,职责的划分,把这一系列问题都思考明白之后再开始动手写代码,不能只考虑一次作业的要求,应该保证程序尽可能的灵活以应对下一次作业的迭代开发。
刷新评论 刷新页面 返回顶部

你可能感兴趣的:(BUAA OO homework Unit1 总结与反思)