OOUnit1总结

OO第一单元作业总结


类图

在这里插入图片描述

Depremover
  • 用于移除一组函数定义中的依赖关系
Define
  • 表示函数定义
DeriExp
  • 解析并处理输入中的求导因子
Caller
  • 将输入中的函数调用实例化
Lexer
  • 将输入解析为Token流
Parser
  • 将输入解析为表达式的内部表示
Factor
  • 接口,约定因子类所共同需要的方法
Expr/Term/Cos/Sin/Number/Var
  • 因子的内部表示

度量分析

Complexity metrics
MethodCogCev(G)iv(G)v(G)
Factor.Cos.Cos(Expr)0111
Factor.Cos.clone()0111
Factor.Cos.derive(String)0111
Factor.Cos.expand()0111
Factor.Cos.toSin()0111
Factor.Cos.toString()5455
Factor.Expr.Expr()0111
Factor.Expr.addTerm(Term)0111
Factor.Expr.clone()1122
Factor.Expr.derive(String)3133
Factor.Expr.expand()3133
Factor.Expr.getTerms()0111
“Factor.Expr.mergeExpr(Expr, Expr)”2313
Factor.Expr.toString()3133
Factor.Number.Number(String)0111
Factor.Number.clone()0111
Factor.Number.derive(String)0111
Factor.Number.toString()0111
Factor.Sin.Sin(Expr)0111
Factor.Sin.clone()0111
Factor.Sin.derive(String)0111
Factor.Sin.expand()0111
Factor.Sin.toCos()0111
Factor.Sin.toString()5455
Factor.Term.Term()0111
Factor.Term.addFactor(Factor)0111
Factor.Term.clone()1122
Factor.Term.derive(String)6144
Factor.Term.expand()19499
Factor.Term.getFactors()0111
“Factor.Term.mergeTerm(Term, Term)”2313
Factor.Term.toString()3133
Factor.Var.Var(String)0111
Factor.Var.clone()0111
Factor.Var.derive(String)2122
Factor.Var.toString()0111
Func.Caller.changeName(Define)2133
“Func.Caller.expand(Define, Define)”11136
“Func.Caller.instantiate(String, Define)”103810
“Func.Define.Define(String, ArrayList, String)”0111
Mid.Lexer.Lexer()0111
Mid.Lexer.lekse(String)47151825
Mid.Parser.Parser(ArrayList)0111
Mid.Parser.checkPos()2323
“Mid.Parser.expandPower(Term, Factor)”3134
Mid.Parser.parseExpr()4144
Mid.Parser.parseFactor()151512
Mid.Parser.parseTerm()6134
Mid.Parser.peek()2222
“Mid.Token.Token(TokenType, String)”0111
Mid.Token.getName()0111
Mid.Token.getValue()0111
Pre.DepRemover.DepRemover()3113
Pre.DepRemover.analyDep()6134
Pre.DepRemover.catDep()6444
“Pre.DepRemover.expand(String, String)”0111
Pre.DepRemover.getDep(String)3333
Pre.DepRemover.getIndex(String)3313
Pre.DepRemover.indep(String)3313
Pre.DepRemover.peek()0111
Pre.DepRemover.pop()0111
Pre.DepRemover.push(String)0111
Pre.DepRemover.removeDep(ArrayList)0111
“Pre.DepRemover.removeDep(ArrayList, boolean)”15467
“Pre.DeriExp.DeriExp(ArrayList, String)”1212
Pre.DeriExp.expandDeriExp()1122
Pre.DeriExp.getD_()0111
Pre.DeriExp.getDefines()0111
Pre.DeriExp.getDeriExp()0111
Pre.DeriExp.getExp()0111
Pre.DeriExp.getPos()0111
Pre.DeriExp.initExp()8157
Pre.DeriExp.initPos()8435
Pre.DeriExp.insertDeriExp(String)8148
Sensor.Sensor.Sensor()2133
Sensor.Sensor.getDefines()0111
Sensor.Sensor.getExp()0111
Sensor.Sensor.interpret(String)5135
Sensor.Sensor.rmBlank(String)5314
Sensor.exAddRemover.exAddRemove(String)17378
Shell.main(String[])5144
ClassOCavgOCmaxWMC
Factor.Cos1.5049
Factor.Expr2.12317
Factor.Number1.0014
Factor.Sin1.5049
Factor.Term3.00924
Factor.Var1.2525
Func.Caller5.67817
Func.Define1.0011
Mid.Lexer9.001718
Mid.Parser3.861027
Mid.Token1.0013
Mid.TokenTypen/an/a0
Pre.DepRemover2.67732
Pre.DeriExp2.90929
Sensor.Sensor2.60513
Sensor.exAddRemover8.0088
Shell4.0044
Packagev(G)avgv(G)tot
4.004
Factor1.9470
Func5.0020
Mid4.9259
Pre2.7761
Sensor3.6722
Modulev(G)avgv(G)tot
oohomework_2023_18231205_hw_32.91236
Projectv(G)avgv(G)tot
project2.91236
方法
  • 可以看到在所有方法中 Mid.Lexer.lekse(String) 方法在四个度量上都是第一。这是由于对Token的表示设计不当导致的。在程序内部,Token采用键值对表示,导致对于每一个类别的Token都需要一个分支,假如仅使用一个字符串数据表示Token可节约许多分支。
  • 可以看到大部分高复杂度方法都是字符串解析方法。这是由于对正则表达式使用的不熟练,导致不得不使用分支结构来解析字符串。

架构设计体验

  • 前两次作业由于自己设计架构并未成功;第三次作业采用示例架构后快速通过。足以说明一个

3次作业发现/被发现的bug

  • 未给三角函数的展开结果加括号
  • 性能太低

发现Bug的策略

  • 采用评测机覆盖测试
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值