OO第一单元作业总结

OO第一单元作业总结

这是自己第一次尝试从面向对象的角度编写代码,由于不同于之前面向过程的编写思路,最终的作业仍然存在很多的缺陷,有许多值得改进的地方。留下这篇总结,便于日后的进步。

一、第一次作业

思路:第一次作业的目标是实现一个简单的多项式求导器,这个多项式仅包含x的幂形式和常数。整个程序的处理过程应分为以下几个部分:多项式的输入和处理(多项式以字符串形式输入)、多项式的存储方式、多项式的求导、多项式的输出。

1.1多项式的输入和处理

使用正则表达式来进行简化。首要目标就是构造这样的一个表达式来作为模式串。容易想到,一个多项式是由若干个项构成的,那么只需要构造一个项的表达式并重复匹配即可。而对于项的正则表达式,由于仅有x的幂形式和常数项,因此也很容易即可得到。在对表达式进行处理时,将多项式以项为单位拆分开,并进行相应的操作即可。

1.2多项式的存储方式

在poly项中,使用一个map来存储多项式中项的信息,以x的指数作为key值,其对应的系数作为value值,可以很方便的实现映射关系。

1.3多项式的求导

对于一个多项式而言,其求导的结果就是其若干个项的求导结果的和,而在本次作业中,所有的项的求导都有如下形式:

$\left( {a*{x^b}} \right)' = a*b*{x^{b - 1}}$

1.4多项式的输出

在对多项式进行输出时,只需将map中的所有key和value对应输出即可。

1.5程序结构分析

Poly.addterm(String,String) 1.0 2.0 2.0
Poly.derivation() 1.0 3.0 3.0
Poly.Poly() 1.0 1.0 1.0
Poly.Poly(String) 7.0 17.0 19.0
Poly.write() 3.0 6.0 10.0
PolyCal.main(String[]) 1.0 6.0 7.0
Total 14.0 35.0 42.0
Average 2.33 5.83 7.0

1.6bug分析

在这次的公测中,发现了在x的指数包含前导0的情况下,会导致合并同类项出现异常的情况,经过对前导0进行删除得到修正。

二、第二次作业

思路:这次的作业其实是第一次作业的加强版,在幂函数的基础上增加了三角函数以及多个因子的情况。因此,也可以分为以下几个部分进行:多项式的输入和处理(多项式以字符串形式输入)、多项式的存储方式、多项式的求导、多项式的输出。由于和第一次作业相似度很高,因此只讲述进行了修改的地方,即多项式的存储方式和多项式的求导。

2.1多项式的存储方式

多项式仍然是由项构成,虽然存在多个因子相乘的情况,但是在将相同底数的因子合并后,所有的项都可以表示成$a*{x^b}*\sin {\left( x \right)^c}*\cos {\left( x \right)^d}$。即可以使用四元式$\left( {a,b,c,d} \right)$来描述一个项,于是采用了多个map嵌套来存储一个多项式。

2.2多项式的求导

在本次作业中,多项式的项的求导可以表示成如下形式:

$\left(a*{x^b}*\sin {\left( x \right)^c}*\cos {\left( x \right)^d}\right)'$

$= a*b*{x^{b - 1}}*\sin {\left( x \right)^c}*\cos {\left( x \right)^d} + a*c*{x^b}*\sin {\left( x \right)^{c - 1}}*\cos {\left( x \right)^{d + 1}} - a*d*{x^b}*\sin {\left( x \right)^{c + 1}}*\cos {\left( x \right)^{d - 1}}$

2.3程序结构分析

poly.Poly.addterm(HashMap<biginteger, hashmap<biginteger,="" biginteger="">>>,BigInteger,BigInteger,BigInteger,BigInteger) 4.0 12.0 13.0
poly.Poly.derivation() 1.0 4.0 4.0
poly.Poly.Poly() 1.0 1.0 1.0
poly.Poly.Poly(String) 1.0 13.0 13.0
poly.Poly.write() 1.0 11.0 11.0
poly.Poly.writeTerm(String,String,String,String) 1.0 11.0 16.0
poly.PolyCal.main(String[]) 1.0 21.0 22.0
Total 10.0 73.0 80.0
Average 1.43 10.43 11.43

2.4bug分析

在这次的公测中,未发现bug,且由于未进行互测,没有发现结构上的bug,但不排除存在bug的可能,不过已经进行了充分测试,尽量避免了bug的出现。

三、第三次作业

本次作业与前两次作业最大的不同之处就是表达式可以作为因子出现在表达式中,也就出现了递归的情况,于是在多项式的输入和处理上就不得不放弃了利用正则表达式进行匹配的方案,采用了词法分析的方式进行识别,并生成相应的结构。

3.1多项式的输入和处理

对于已经输入的多项式,首先判断有无非法字符,如果存在则报结构错误。接着合并连续的空字符,将多个连续的空字符合并为一个,并查看是否存在非法情况(是否在有符号整数内出现了空字符等)。接着去除字符串中的空字符,利用已经处理后的字符串构建多项式。在构建多项式时,首先判断项的位置,对项进行处理。在构建项时,以因子为单位进行创建,这样从上到下实现整个多项式的构建过程。在这个过程中,会因为表达式因子的存在造成递归调用,但最终都以因子为叶子节点。

3.2多项式的存储

由于本次作业的复杂性,无法再次简单的用n元式来表示,所以构建了多个类,通过类之间的包含来实现多项式的存储。在Poly类下,主要包含了对Term类的调用。在Term类中,涉及到对Factor类的调用。而在Factor类中,通过不同的标识符来识别因子类型并完成构建。

3.3多项式的求导

由于这次的作业中,项的形式更加复杂,所以基本是在因子的层面上进行求导,并在项的层面进行合并。对于一个给定的项,其求导的结果应该为对每一个因子求导,并将该求导的因子和其他未求导的因子相乘组成新的项后,重新组合而成的新多项式。

3.4程序结构分析

poly.Factor.cosDev() 2.0 3.0 4.0
poly.Factor.cosString() 2.0 4.0 5.0
poly.Factor.Derivation() 2.0 11.0 12.0
poly.Factor.Factor(String) 23.0 60.0 69.0
poly.Factor.IsConst() 1.0 1.0 1.0
poly.Factor.MergeConst(Factor) 1.0 1.0 1.0
poly.Factor.sinDev() 2.0 3.0 4.0
poly.Factor.sinString() 2.0 4.0 5.0
poly.Factor.ToString() 2.0 12.0 12.0
poly.Poly.Derivation() 1.0 4.0 5.0
poly.Poly.Poly() 1.0 1.0 1.0
poly.Poly.Poly(String) 5.0 14.0 19.0
poly.Poly.ToString() 1.0 5.0 6.0
poly.PolyCal.Judgespace(String) 1.0 27.0 27.0
poly.PolyCal.main(String[]) 1.0 32.0 32.0
poly.Term.Derivation() 1.0 4.0 5.0
poly.Term.Term() 1.0 1.0 1.0
poly.Term.Term(String) 11.0 19.0 26.0
poly.Term.ToString() 1.0 2.0 2.0
Total 61.0 208.0 237.0
Average 3.21 10.95 12.47

3.5bug分析

公测中暴露出来的一个bug就是,在处理空表达式的时候不到位,说明在结构设计上存在很大的问题(事实上,如果引进继承或接口会极大地提升程序的可行性和可维护性)。

四、总结

经过这次的作业暴露出来了一些在结构设计时存在的问题,例如代码可扩展性差,每次在作业更新后,上次的代码可利用价值偏低,基本需要完全重新设计,这浪费了很多时间,同时也使得设计思路不够清晰,给具体实现时留下了很多麻烦;依然存在些面向过程的观点,使得某些对象独立性差,可维护和可优化性降低;在测试时,对某些极端样例考虑不充分等;优化程度不够,导致最终的结果仍存在很大冗余。

不得不说,OO的整个设计过程,非常考验自己对架构的把握能力,而自己的相关能力仍有所欠缺,接下来的路还很长。ORZ~

 

posted @ 2019-03-27 16:46  时过境迁~  阅读(125)  评论(0编辑  收藏  举报