OO第一单元总结
作者:互联网
2022北航OO第一单元总结
第一次作业
第一次作业因子仅包含常数(带符号及前导0),幂函数(指数非负,包含省略形式)和表达式因子;项由乘号连接的若干因子组成(第一个因子前可带一个符号);表达式由加号或减号连接的若干项组成(第一项前可带一个符号)。同时声明了如空白字符等输入表达式的形式限制及如指数范围等数据限制。
程序结构分析
-
类的属性个数、方法个数、类总代码规模
类名 属性 方法个数 MainClass 0 6 Poly 1 9 Term 3 10
-
方法复杂度
- main()方法的耦合度和复杂程度较高;Term类中printFirst()方法耦合度略高。main方法中为判断运算类别使用了过多的分支语句,printTerm()方法中分支语句的嵌套深度过多。
-
类图
classDiagram class MainClass MainClass: +main(String[] args)void MainClass: +getSymbol(String str)String MainClass: +getCoef(String str)BigInteger MainClass: +getindex(String str)BigInteger MainClass: +getTerm(String str)Term MainClass: +getPoly(String str, ArrayList<Term> tempTerms, ArrayList<Poly> polys)Poly class Poly Poly: -ArrayList<Term> terms Poly: +Poly(ArrayList<Term> terms) Poly: +addPoly(Poly poly1, Poly poly2)Poly Poly: +subPoly(Poly poly1, Poly poly2)Poly Poly: +mulPoly(Poly poly1, Poly poly2)Poly Poly: +powPoly(Poly poly1, Poly poly2)Poly Poly: +posPoly(Poly poly1)Poly Poly: +negPoly(Poly poly1)Poly Poly: +mergeTerm(Poly lastPoly)Poly class Term Term: -String symbol Term: -BigInteger coef Term: -BigInteger index Term: Term(BigInteger index, BigInteger coef, String symbol) Term: mulTerm(Term term1, Term term2)Term Term: print(Term term)void Term: printFirst(Term term)void Term: compareTo(Term other)int- MainClass类用来识别并提取出输入语句中的符号,系数与指数(将每个操作数当作一个多项式),并调用Poly类中的相应运算方法(将每个运算看作两个多项式进行运算),并将运算结果得到的多项式返回作为之后运算的操作数。同时Term类中包含优化合并方法及输出方法,其中输出方法为依次输出最终表达式中的每一项;合并算法针对一个多项表达式,将多项式中指数相同的项进行合并。
- 各类间功能混杂,例如Term类中存在打印功能,Poly类中存在合并功能,Term类中存在乘法功能等
程序bug分析
- 本次作业在公测及互测中均为出现bug;强测的1至3及7至9性能分未满,大概是因为没有进行将正向作为首项输出的优化
- 本次作业互测中未发现他人bug
第二次作业
第二次作业在因子中增添了三角函数因子,自定义函数及求和函数。
程序结构分析
-
类的属性个数、方法个数、类总代码规模
类名 属性 方法个数 MainClass 0 16 Poly 1 2 Term 5 14 TriFactor 4 7 AddPoly 2 4 SubPoly 2 4 MulPoly 2 3 Output 1 8
-
方法复杂度(截取复杂度较高的方法)
- main函数与第一次作业存在相同问题;Output类中的几个打印输出方法耦合度和复杂程度较高,整个输出逻辑复杂,在输出时对函数的分解没有进行合理的规划,导致输出逻辑较混乱。
-
类图
classDiagram class MainClass MainClass: +main(String[] args)void MainClass: +getSymbol(String str)String MainClass: +getCoef(String str)BigInteger MainClass: +getindex(String str)BigInteger MainClass: +getTerm(String str)Term MainClass: +getPoly(String str, ArrayList<Term> tempTerms, ArrayList<Poly> polys)Poly MainClass: +getTriFactor(String str, ArrayList<Poly> polys)TriFactor MainClass: +printFirst(Poly ansPoly, Output output)void MainClass: +addOp(ArrayList<Poly> polys, String[] details)void MainClass: +posOp(ArrayList<Poly> polys, String[] details)void MainClass: +sinOp(ArrayList<Poly> polys, String[] details)void Output <.. MainClass Poly <.. MainClass class Poly Poly: -ArrayList<Term> terms Poly: +getFirstTerm()Term class Term Term: -String symbolTerm Term: -BigInteger coefTerm Term: -BigInteger indexTerm Term: -ArrayList<TriFactor> sinArray Term: -ArrayList<TriFactor> cosArray Term: +mulTerm(Term term1, Term term2)Term Term: +addSin(ArrayList<TriFactor> termSinArray, ArrayList<TriFactor> sinArray) Term: +compareTo(Term other)int class Output Output: -Poly poly Output: +mergePoly(Poly poly)Poly Output: +merge(ArrayList<Term> sorted, int i)void Output: +returnPoly(ArrayList<Term> sorted)Poly Output: +printFirstTerm(Term term)void Output: +print(Term term)void Output: +printSin(Term term, int flag)void Term <.. Output class AddPoly AddPoly: +add(Poly poly1, Poly poly2)Poly AddPoly: +pos(Poly poly1)Poly Poly <.. AddPoly class SubPoly SubPoly: +sub(Poly poly1, Poly poly2)Poly SubPoly: +neg(Poly poly1)Poly Poly <.. SubPoly class MulPoly MulPoly: +mul(Poly poly1, Poly poly2)Poly MulPoly: +pow(Poly poly1, Poly poly2)Poly Poly <.. MulPoly class TriFactor TriFactor: -BigInteger indexTri TriFactor: -BigInteger coefTri TriFactor: -String symbolTri TriFactor: -BigInteger isIndex TriFactor: +compareTo(TriFactor other)int- 相比第一次作业,新建三角函数类作为新的层次,并在Term类中增加sin和cos集合完成项的构建;根据不同类别的运算增加相应的运算类,减少Poly类的复杂度与耦合度;同时增加输出类,处理合并优化及打印输出(可以将优化与输出进一步解耦)
- 类之间的依赖关系较多导致耦合度高且功能不独立,例如主类中存在输出功能及各类运算功能,Term类中存在乘法功能相关的三个方法,输出类中存在优化方法(可多建一个优化相关的类)
程序bug分析
- 本次作业在公测中错了一个点,错误原因是在处理三角函数cos(0)的输出优化时对前后连接的符号*的输出出现了逻辑上的混乱;问题所在的类和方法是Output类中printSin()及printCos()中,出现问题的方法比在模块设计复杂度及圈复杂度上明显高于未出现问题的方法。
- 本次作业在互测中被check出5个bug,都是同质错误,在三角函数化简的时候将括号内的常数当成了角度,导致把sin(90)和cos(90)化成了1和0;问题所在的类和方法是也Output类中的printSin()及printCos()中,出现问题的方法比在模块设计复杂度及圈复杂度上明显高于未出现问题的方法。
- 本次作业互测中未发现他人bug
第三次作业
第三次作业增添了表达式中嵌套的定义,包括三角函数括号内的因子嵌套及自定义函数定义中的括号嵌套及自定义函数调用中的对表达式银子、求和函数和自定义函数本身的调用。
程序结构分析
-
类的属性个数、方法个数、类总代码规模
类名 属性 方法个数 MainClass 0 17 Poly 1 4 Term 5 16 TriFactor 2 5 AddPoly 2 4 SubPoly 2 4 MulPoly 2 3 Output 1 8
-
方法复杂度(截取复杂度较高的方法)
- 除去与第二次作业存在相同问题方法,本次作业中,首先,Term类尤其是Poly类中的compare方法复杂度高且不利于维护与修改,原因是在此方法中多次进行了调用了sort方法且多次循环嵌套;其次,Poly类中的polyEquals()方法完成的不好,出现了for循环和分支判断的多层嵌套以及与compare函数相关的排序算法;最后,Output类中的mregePoly算法完成的不好,主要原因是其中多次调用了sort算法和polyEquals()算法。
-
类图
classDiagram class MainClass MainClass: +main(String[] args)void MainClass: +getSymbol(String str)String MainClass: +getCoef(String str)BigInteger MainClass: +getindex(String str)BigInteger MainClass: +getTerm(String str)Term MainClass: +getPoly(String str, ArrayList<Term> tempTerms, ArrayList<Poly> polys)Poly MainClass: +getTriFactor(String str, ArrayList<Poly> polys)TriFactor MainClass: +printFirst(Poly ansPoly)void MainClass: +addOp(ArrayList<Poly> polys, String[] details)void MainClass: +posOp(ArrayList<Poly> polys, String[] details)void MainClass: +sinOp(ArrayList<Poly> polys, String[] details)void Poly <.. MainClass class Poly Poly: -ArrayList<Term> terms Poly: +polyEquals(Poly poly1, Poly poly2)boolean class Term Term: -String symbolTerm Term: -BigInteger coefTerm Term: -BigInteger indexTerm Term: -ArrayList<TriFactor> sinArray Term: -ArrayList<TriFactor> cosArray Term: +mulTerm(Term term1, Term term2)Term Term: +addSin(ArrayList<TriFactor> termSinArray, ArrayList<TriFactor> sinArray) Term: +compareTo(Term other)int Term: +comparePoly(Poly poly1, Poly poly2)int class Output Output: -Poly poly Output: +mergePoly(Poly poly)Poly Output: +merge(ArrayList<Term> sorted, int i)void Output: +returnPoly(ArrayList<Term> sorted)Poly Output: +printFirstTerm(Term term)void Output: +print(Term term)void Output: +printSin(Term term, int flag)void Term <.. Output class AddPoly AddPoly: +add(Poly poly1, Poly poly2)Poly AddPoly: +pos(Poly poly1)Poly Poly <.. AddPoly class SubPoly SubPoly: +sub(Poly poly1, Poly poly2)Poly SubPoly: +neg(Poly poly1)Poly Poly <.. SubPoly class MulPoly MulPoly: +mul(Poly poly1, Poly poly2)Poly MulPoly: +pow(Poly poly1, Poly poly2)Poly Poly <.. MulPoly class TriFactor TriFactor: -Poly triFactorPoly TriFactor: -BigInteger isIndex TriFactor: +compareTo(TriFactor other)int- 相比第二次作业,修改三角函数类中的属性,满足三角函数括号内的因子多层嵌套;同时妥善修改三角函数的输出方法。
- 本次作业依旧与第二次作业存在同类的问题,即各类的功能不独立,应适当多建新类来减小类之间的耦合度及模块复杂度。
程序bug分析
-
本次作业公测错的一塌糊涂,关键问题是在第三次作业修改三角函数嵌套输出的时候因为粗心没有把上一次作业的输出完全复制,导致在某项有sin输出时再输出第一个cos前没有*;问题所在类和方法是Output类中的printCos()方法,出现问题的方法比在模块设计复杂度及圈复杂度上明显高于未出现问题的方法。
-
本次作业在互测中被check出4个bug,都是同质错误,在三角函数输出时未考虑到括号内部符号为
-
且只存在一个不为常数的单因子的情况,此时括号内并非因子,故应输出多层括号而非一层;问题所在的类和方法是Term类中的isFactor(),出现问题的方法比在模块设计复杂度及圈复杂度上明显高于未出现问题的方法。
他人bug分析
- 本次作业互测中共找出5个bug,总结下来为两类错误;一类为本人在互测中被check出的bug,另一类为sum函数上下限数据溢出问题
架构设计体验
- 第一次作业仅包含三个类,其中不同类的计算包含在Poly类中,表达式的优化及输出包含在Term类中,完全不足以支撑后两次作业的迭代,在第二次作业中将表达式最后的优化合并及输出放到输出类Output中,并针对不同类型运算构建运算类,三角函数类作为新的层次加入表达式,第三次作业主要修改此三角函数类及合并和三角函数内因子嵌套的输出算法
- 最后的架构仍然存在大问题,尤其是主类及main函数应只包含大致的流程调用而非现在架构中包含各种处理造成的冗长,例如应建立输入处理类将主类中的全部处理方法放入此类来对输入进行处理,主类中只包含简单的main函数负责调用方法;同时各类之间的功能并不独立而是互相掺杂,在完成时也没有仔细思考而是草草写完;往往在某个方法达到行数限制后就直接在本类中新建一个方法来调用,造成结构及方法功能的混乱,希望下次能多改进。
心得体会
- 本次作业中对于形式化表述理解及细节关注十分重要。初次接触这种形式化表述,一开始还是更习惯读文字表述的题目要求,但对于形式化表述的理解更有助于完成作业,同时关注到更多格式上易错的细节,例如第三次作业中三角函数缺少括号层输出的错误。
- 第一单元作业作为接触面向对象的第一次作业,虽然完成了寒假的pre,但仍然觉得难度很大,尤其是不熟悉java的语法以及从面向过程向面向对象的思维转变。在思维方面,第一单元作业虽然完成,但还是残留着很深的面向过程的思维。在架构设计考量方面,在第一次作业中如果能够完成较好的整体架构,后两次作业或许可以省去很多麻烦。但本单元作业的架构完成的并不好,一方面是自己没有深入的去思考,在畏难情绪下以得过且过的心态面对作业,希望下一单元的作业可以调整好自己的心态。在java语法方面,对于继承和接口的使用还是不够熟练,不能很好的捋清思路,往往导致类和方法的复杂性及耦合度较高。
- 实际上在第一次作业的时候也完成了递归下降生成后缀表达式的自解析方式,但没能赶在截止时间前提交。所以在难度增加较大的第二次作业和第三次作业中也没能完成自解析,有些遗憾。希望下次作业能够从开始就打好基础,更好的完成全部作业。
标签:OO,总结,Term,String,ArrayList,作业,Poly,MainClass,单元 来源: https://www.cnblogs.com/Realgyyyyy/p/16053763.html