2026面向对象设计与构造第一单元总结

杜安-24373338 2026-04-01 18:18:56

基于度量来分析自己的程序结构

类的 OO 度量

ClassOCavgOCmaxWMC
ExpandedExpr2.93744
ExprFormatter4.22938
FunctionDef1.0014
FunctionDefParser2.5045
FunctionTable1.2525
Main2.0022
MonoKey1.93427
Parser3.23642
Simplifier2.70927
Substitute6.001012
element.AddExpr1.0013
element.ConditionalExpr1.0015
element.ExpExpr1.0012
element.FunctionCallExpr1.0013
element.MulExpr1.0013
element.NumberExpr1.0012
element.PowExpr1.0013
element.VariableExpr1.0012

方法的 OO 度量

MethodCogCev(G)iv(G)v(G)
ExpandedExpr.ExpandedExpr()0111
ExpandedExpr.ExpandedExpr(HashMap<MonoKey, BigInteger>)3133
ExpandedExpr.add(ExpandedExpr)11155
ExpandedExpr.appendTerm(StringBuilder, BigInteger, MonoKey)4244
ExpandedExpr.compareMonoKey(MonoKey, MonoKey)1212
ExpandedExpr.constant(BigInteger)1122
ExpandedExpr.expAtom(String, BigInteger)2323
ExpandedExpr.isZero()0111
ExpandedExpr.multiply(ExpandedExpr)16166
ExpandedExpr.negate()1122
ExpandedExpr.one()0111
ExpandedExpr.pow(BigInteger)5345
ExpandedExpr.toCanonicalString()12547
ExpandedExpr.toString()0111
ExpandedExpr.variable()0111
ExprFormatter.ExprFormatter()0111
ExprFormatter.findMatchingRightParenthesis(String, int)9648
ExprFormatter.formatAsExpArgument(ExpandedExpr)2212
ExprFormatter.formatAsExpr(ExpandedExpr)0111
ExprFormatter.isInteger(String)7636
ExprFormatter.isPurePowerOfX(String)6626
ExprFormatter.isSimpleAtom(String)3414
ExprFormatter.isSingleExpAtom(String)9929
ExprFormatter.needsParenthesesInExpArgument(ExpandedExpr, String)2313
FunctionDef.FunctionDef(String, List, Expr)0111
FunctionDef.getBody()0111
FunctionDef.getFunctionName()0111
FunctionDef.getParameters()0111
FunctionDefParser.parse(String)4326
FunctionDefParser.removeSpaces(String)0111
FunctionTable.FunctionTable()0111
FunctionTable.addFunction(FunctionDef)0111
FunctionTable.contains(String)0111
FunctionTable.getFunction(String)1212
Main.main(String[])1122
MonoKey.MonoKey()0111
MonoKey.MonoKey(BigInteger, TreeMap<String, BigInteger>)3133
MonoKey.appendExp(StringBuilder, String, BigInteger)1122
MonoKey.appendX(StringBuilder, BigInteger)1122
MonoKey.equals(Object)3324
MonoKey.expFactor(String, BigInteger)1122
MonoKey.getExpFactors()0111
MonoKey.getXExponent()0111
MonoKey.hashCode()0111
MonoKey.isOne()1122
MonoKey.multiply(MonoKey)8144
MonoKey.one()0111
MonoKey.toFactorString()4144
MonoKey.variable()0111
Parser.Parser(String)0111
Parser.parse()1212
Parser.parseAtomicFactor()3444
Parser.parseConditionalFactor()0111
Parser.parseExpression()5444
Parser.parseFactor()7555
Parser.parseFunctionCallAfterName(String)116710
Parser.parseIdentifier()4235
Parser.parseIdentifierBasedFactor()116811
Parser.parsePower()5245
Parser.parseTerm()2133
Parser.parseUnsignedInteger()3224
Parser.skipSpaces()2123
Simplifier.Simplifier(FunctionTable)0111
Simplifier.simplify(Expr)8999
Simplifier.simplifyAdd(AddExpr)0111
Simplifier.simplifyConditional(ConditionalExpr)2222
Simplifier.simplifyExp(ExpExpr)1222
Simplifier.simplifyFunctionCall(FunctionCallExpr)2233
Simplifier.simplifyMul(MulExpr)4377
Simplifier.simplifyNumber(NumberExpr)0111
Simplifier.simplifyPow(PowExpr)4244
Simplifier.simplifyVariable(VariableExpr)1222
Substitute.substitute(Expr, Map<String, Expr>)219910
Substitute.substituteVariable(VariableExpr, Map<String, Expr>)1212
element.AddExpr.AddExpr(Expr, Expr)0111
element.AddExpr.getLeft()0111
element.AddExpr.getRight()0111
element.ConditionalExpr.ConditionalExpr(Expr, Expr, Expr, Expr)0111
element.ConditionalExpr.getFalseBranch()0111
element.ConditionalExpr.getLeftFactor()0111
element.ConditionalExpr.getRightFactor()0111
element.ConditionalExpr.getTrueBranch()0111
element.ExpExpr.ExpExpr(Expr)0111
element.ExpExpr.getArgument()0111
element.FunctionCallExpr.FunctionCallExpr(String, List)0111
element.FunctionCallExpr.getArguments()0111
element.FunctionCallExpr.getFunctionName()0111
element.MulExpr.MulExpr(Expr, Expr)0111
element.MulExpr.getLeft()0111
element.MulExpr.getRight()0111
element.NumberExpr.NumberExpr(BigInteger)0111
element.NumberExpr.getValue()0111
element.PowExpr.PowExpr(Expr, BigInteger)0111
element.PowExpr.getBase()0111
element.PowExpr.getExponent()0111
element.VariableExpr.VariableExpr(String)0111
element.VariableExpr.getName()0111

作业类图

img

每个类的设计考虑

Parser
负责将输入字符串解析为 AST。尽管 Parser 类的 WMC 和 OCavg 都相对较高,但这是由于所有(非函数调用)语法解析逻辑都集中在该类中完成。这样的设计使解析过程统一管理,避免解析逻辑分散在多个类中,从而保证了解析模块的高内聚。同时,解析阶段仅负责构建 AST,不涉及表达式化简,从而实现了解析与语义处理的解耦。

element 包中的各类
element 包中的类用于表示 AST 的不同节点类。这些类只负责描述表达式结构,而不包含复杂的运算逻辑。Parser 在解析过程中构建这些节点对象,而后续的化简逻辑由 Simplifier 处理。

Simplifier
Simplifier 是表达式语义简化的核心类。在第一次作业中,该类主要负责对 AST 表达式进行基本的代数化简与合并同类项;在第二次作业中,其功能进一步扩展,同时负责处理新增的选择式结构以及辅助进行函数调用等。Simplifier 通过递归遍历 AST,将表达式转换为统一的规范表示。

ExpandedExpr
ExpandedExpr 用于表示化简后的表达式结构,是 Simplifier 输出结果的统一表示形式。其内部使用 HashMap<MonoKey, BigInteger> 存储表达式中的各个项,实现了同类项合并和代数运算。

FunctionDefParser
FunctionDefParser 用于解析输入中的函数定义语句。该类负责提取函数名、形参以及函数体表达式,并构造 FunctionDef 对象存储解析结果。通过将函数定义解析逻辑单独封装在该类中,可以避免函数处理逻辑混入主表达式解析流程,从而提高 OO 程度。

总体来说,就是解析与化简分开,函数解析与表达式解析分开。

架构设计体验

第一次迭代

建立了 Main -> Lexer/Parse -> (AST) -> Simplifier -> Monokey 解析/化简流程,最后输出 Monokey 的哈希表作为化简出的多项式结果。

第二次迭代

因为最后输出的项变得更复杂了,还要考虑提 gcd,所以在 Simplifier -> Monokey 的化简流程中加了 ExpandedExpr,ExpandedExpr 类在内部实现了提形如 exp((...)) 因子的 gcd。

同时,为支持函数调用,在表达式解析流程之外加了函数解析类 FunctionDefParser 和形参替换类 Substitute,处理表达式解析类 Parser 输出的 AST。

第三次迭代

没做出来。

重构

没有进行重构

分析自己程序的bug

公测

幂次爆 int

错误原因:幂次没有范围

解决方法:全开 BigInteger

互测

不能识别形如 -+<数字> 的格式

错误原因:解析具有连续 +/- 时 Parse 遇到困难

解决方法:首先扫描一遍输入表达式字符串,遇到连续 +/- 只保留一个

遇到形如 x^+<数字> 格式报错

错误原因;第二次作业重写了解析幂次的 Parse 方法,改错了

解决方法:首先扫描一遍输入表达式字符串,不必要的 + 号删掉

分析自己发现别人程序bug所采用的策略

  1. 利用选择式的 Cost 规则,在未选择的的选择式分支插大量的递归,引起 TLE。

  2. 用上次作业的 bug 构造测试案例,先在本地对别人的代码跑一遍,如果依然出现 bug 则提交。

  3. 结合被测程序的代码设计结构来设计测试用例,特别寻找可以构建 TLE 的代码结构。

分析自己进行的优化

做了提 gcd 优化,可以保证代码的简洁性与正确性。首先,耗时不长,不会 TLE。其次,由于表达式解析和化简在一个流程中解耦进行,所以可以直接在 Simplifier 类和 Monokey 类中插入一个专门类负责提 gcd 等。

大模型相关使用

使用了大模型提供提 gcd 优化思路,完成效果很好。

心得体会

第一次作业到第二次作业难度跨度太大。

未来方向

第二次作业可以像第一次/第三次作业那样,有类似实验课提供思路。

...全文
40 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
第1章课程定位与教学案例综述. 1.1职业岗位能力需求分析 1.2课程设置和课程定位分析 1.3WebShop电子商城介绍 1.3.1电子商城需求分析 1.3.2电子商城系统设计 1.3.3电子商城数据库设计 1.4LibraryMIS图书管理系统介绍 1.4.1图书管理系统需求分析 1.4.2图书管理系统系统设计 1.4.3图书管理系统数据库设计 习题 第2章面向对象技术和建模基础 2.1面向对象方法 2.1.1面向对象方法的基本思想 2.1.2面向对象方法的发展 2.2面向对象的基本概念与特征 2.2.1面向对象的基本概念 2.2.2面向对象的主要特征 2.3面向对象分析 .2.3.1处理复杂问题的原则 2.3.200A方法的基本步骤 2.4面向对象设计 2.5面向对象实现 2.6面向对象方法的内涵 2.7软件建模概述 2.7.1软件建模的概念 2.7.2软件建模的用途 2.7.3软件建模的优点 习题 第3章UML简介 3.1UML的发展 3.1.1UML的发展历程 3.1.2理解UML建模 3.2UML的特点 3.3UML的结构 3.3.1UML的事物 3.3.2UML的关系 3.4UML的视图 3.4.1用例视图 3.4.2逻辑视图 3.4.3并发视图 3.4.4组件视图 3.4.5部署视图 3.5UML图形符号 3.5.1用例图 3.5.2类图 3.5.3对象图 3.5.4状态图 3.5.5活动图 3.5.6顺序图 3.5.7协作图 3.5.8组件图 3.5.9部署图 3.5.10UML 2.0新特性 3.6UML建模基本流程 习题 第4章UML建模工具简介 4.1常用UML建模工具 4.1.1 Rational Rose 4.1.2Enterprise Architect 4.1.3Together 4.1.4PowerDesigner 4.1.5 Visi0 4.1.6Tnffun Plat0 4.2Rational Rose安装与配置 4.2.1Rational Rose的运行环境 4.2.2Rational Rose的安装 4.2.3Rational Rose的配置 4.3使用Rational Rose建模 4.3.1Rational Rose主菜单 4.3.2Rational Rose的视图 4.3.3 Rational Rose建模的基本过程 习题 第5章需求建模 5.1用例模型概述 5.2用例图组成 5.2.1参与者 5.2.2系统 5.2.3用例 5.3识别和描述用例.. 5.3.1识别用例 5.3.2绘制WebShop电子商城用例图 5.3.3通过包对用例进行合理规划 5.3.4WebShop电子商城用例图(不含关系) 5.3.5用例描述 5.4用例间的关系 5.4.1泛化关系 5.4.2使用关系 5.4.3包含关系 5.4.4扩展关系 5.4.5关系小结 5.4.6WebShop电子商城用例图(含关系) 习题 第6章静态建模 6.1静态建模概述 6.2类图概述 6.3类图的基本组成 6.3.1类的概述 6.3.2绘制带属性的实体类 6.3.3绘制带操作的实体类 6.3.4绘制边界类图 6.3.5绘制控制类图 6.3.6UML中的类与语言中的类 6.4类之间的关系 6.4.1关联关系 6.4.2聚合关系 6.4.3组合关系 6.4.4泛化关系 6.4.5实现关系 6.4.6依赖关系 6.5对象图 6.5.1对象图概述 6.5.2对象图组成 6.5.3类图和对象图的比较 习题 第7章数据库建模 7.1PowerDesigner简介 7.2PowerDesigner安装和启动 7.2.1PowerDesigner的安装 7.2.2PowerDesigner的启动 7.3PowerDesigner概念数据模型 7.3.1概念数据模型概述 7.3.2PowerDesigner概念数据模型概述 7.4 PowerDesigner物理数据模型 习题 第8章动态建模 8.1动态建模概述 8.2状态图 8.2.1状态图概述 8.2.2状态图组成 8.2.3绘制员工下班回家状态图 8.3活动图 8.3.1活动图概述 8.3.2活动图组成 8.3.3绘制WebShop电子商城活动图 8.4活动图拾遗 8.4.1活动图与流程图的比较 8.4.2活动图与状态图的比较 8.5顺序图 8.5.1顺序图概述 8.5.2顺序图组成 8.5.3绘制WebShop电子商城顺序图 8.6协作图 8.6.1协作图概述 8.6.2协作图组成 8.6.3绘制WebShop电子商城协作图 8.7 顺序图拾遗 8.7.1 顺序图与协作图的比较 8.7.2 顺序图与协作图的互换 习题 第9章物理建模 9.1物理建模概述 9.1.1硬件 9.1.2软件 9.2组件图 9.2.1组件图概述 9.2.2组件图组成 9.2.3绘制WebShop电子商城组件图 9.3部署图 9.3.1部署图概述 9.3.2部署图组成 9.3.3绘制WebShop电子商城部署图 习题 第10章双向工程 10.1双向工程简介 10.2正向工程(生成Java代码) 10.3逆向工程 习题 第11章统一软件过程RUP 11.1RUP简介 11.2RUPT作流程 11.2.1业务建模 11.2.2需求 11.2.3分析设计 11.2.4实施 11.2.5测试 11.2.6部署 11.2.7配置与变更管理 11.2.8项目管理 11.2.9环境 11.3RUP迭代过程 11.3.1初始 11.3.2细化 11.3.3构造 11.3.4移交 11.3.5迭代计划示例(构造阶段) 习题 附录A综合实训 附录B Rational Rose2003主菜单 参考文献...

302

社区成员

发帖
与我相关
我的任务
社区描述
2026年北航面向对象设计与构造
java 高校
社区管理员
  • 孙琦航
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧