2026_OO_Unit1 博客作业

渠天昊-24374176 2026-03-29 12:04:49

程序结构与度量

首先来看类图,并简单介绍我的程序架构:

(红色箭头表示包含,即前类的属性包含后类的实例,黑色箭头表示继承)

 

 

作为一个想法不多的人,我几乎是照搬了指导书的内容,来设计程序的架构,以各种各样的因子作为基础元素,继承了Factor类。唯一称得上原创的是CalOfFunc接口——用于对函数调用进行统一的替换——以及Simplifiable接口,指示这个Factor还可以包含其它Factor,存在简化空间。

然后因子相乘组成TermTerm相加组成Expr

为了更好的处理函数调用,我创建了Function类。然后是文法处理的LexerParser,以及主类MainClass。架构的更多细节会在下一节讨论。

下面是程序的度量(每个方法的规模、分支数目实在是太多了,这里用平均代替了,,具体数据放在最后):

类名属性个数方法个数平均方法规模方法平均控制分支数目总代码规模内聚度LCOM耦合性指标CBO
Expr2225.821.91128111
Term73215.094.69483110
PowFunc2117.451.648239
SignNum1104.114159
NormCalOfFunc184.513656
RecCalOfFunc397.221.566557
DerFactor294.6714237
ExpFunc31611.812.88189113
ExprFactor2195.681.42108114
ChoFunc41110.912.7312017
MainClass02305.56015
Lexer3714.57610215
Parser17214.71147115
Function226112116
RecFunction274.571.1432116
    1647(Average) 2.07(Average) 10

分析:

  1. 总体代码规模过大,我看其它同学基本在1000行左右
  2. Term方法过于冗杂,内部逻辑过于复杂、特判过多,这都是因为一开始没有充分设计,后期debug的过程中不断加入补丁造成的。(几乎顶着500行的checkstyle上线,方法规模也过大)
  3. 部分类内聚度偏低,比如SignNum,两种CalOfFunction等等,当整体而言,代码的内聚度还是令人满意的。
  4. 代码耦合度过高。尤其是ExprFactor类和两种Function类,可以考虑把其中的部分逻辑干脆搬出去,让它们更加独立。且项目整体耦合度都过高,体现出设计不够清晰。

总的来说,架构的优点是相当直观,缺点则是规模较大,部分类、方法过于冗杂,类间耦合度过高等等。

架构设计体验

第一次作业,正常的递归下降解析。但在化简表达式上使用了臭名昭著的插值法。一方面导致代码在hw2完全不具备可扩展性,另一方方面也导致互测数据全部TLE。

第二次作业,添加了exp、选择式因子和自定义函数。选择将代码全部重构。

第三次作业,添加了y,自定义递推函数和求导因子。自定义递推函数,我为了能够直接用Parser解析其定义,为RecFunction写了一个属性,让它在定义中的状态,和在正常表达式中的状态不一样。现在想想其实这种方法会导致类的内聚度下降,不如另开一个新的类会好一点。

如果后续进行进一步迭代,比如加入三角因子,只需要添加对应的因子类,修改对应的zip方法和合并同类项方法即可。

程序Bug分析:

一部分Bug集中在term项的print部分,关于系数为0时是否只有一项判断是否输出0,系数为1的输出、exp(0)的删除等等,涉及到大量的逻辑判断,不清楚是否存在更高效的输出优化方法。

还有一个看上去很“诡异”的Bug,首先这个bug在非调试模式下正常出现,因此我一开始不认为与调试器有关。但系统在调试模式下,经过一行terms.add(term)后,factors中的内容光荣发生改变。terms作为一个ArrayList,它的add方法应该不可能出错。debug过程到这里就被卡住了。

不管这个bug以什么样的形式出现,它一定出现在exp相关的处理逻辑里,经过仔细排查,发现Term类的DeleteOne方法写的有问题,原本应该删除次数为BigInteger.ZEROexpFactor,结果在tab之力的作用下写成了BigInteger.ONE……

然后,在调试过程中,编译器在add后,自动重新调用了Term的toString方法,而在这个方法的开头,调用了deleteOne…….

 

那为什么不在调试模式下也会出错呢?因为在其它地方也会调用deleteOne方法,这里错了就是错了……

另外还有对比两个数是否相等时我采用的是计算值的方法,这个想法的根源在于hw1我就实现了cal方法,但是这在hw3带来一个大问题,我直接把x的传入参数复制了一份给y,这导致x-y恒等于0,因此导致了一份bug。

总结来说,第一是,一个方法里不应该写太多逻辑判断,尤其是复杂的逻辑判断。逻辑判断多的地方一定要单独充分测试

第二是,不要贸然在方法里改变一个类,尽量让一个类只有一种被改变的方式,即遵守SRP原则。

最大的问题就这两点吧,复杂逻辑容易出错,多次改变类属性容易出错,其它bug多半也是这一类,别的就没有什么了。

互测茶人策略分析:

一种是自己直接构造邪门的数据,广撒网的叉人,效率较低,而且到了hw3极易爆cost。

一种是搓出来评测机,把大家的代码放在一起跑,至少在c房这种叉人效率还是很高的。

最后一种是,我水平达不到的,看别人代码,发现潜在逻辑问题,构造针对性的数据叉人。我是昨天讨论课上才知道这种方法能够如此强大。大概在A房也能有很好的作用,但我水平还达不到就是了。

优化分析

优化集中在Termprint方法,包括系数1的优化(通过一个复杂的逻辑判断1是否输出)、exp(0)的删除等等。昨天研讨课上提到的exp的优化给我看傻了,我是完全没有想到这么深。只考虑过exp系数提取和不提取的优化,但最后也没有实现……

此外,在expr的print方法里也执行了一些优化,比如将负数后置等等。

Term的print里出现了很多bug,看来我是不能保证我代码的简洁性与正确性了,或许可以考虑拆分出来更多的方法,比如写一个专门的判断1方法,然后让逻辑判断分步骤有序进行,甚至拆分出更多的方法,尽量让每一个方法都更清晰……

大模型相关使用

第一次作业牛顿迭代逻辑使用AI写的,一开始自己写的拉格朗日,但时间复杂度太低,就把原方法传给ai,让它在保留原接口不变的情况下,将计算方法重写为牛顿迭代法。效果出奇的好。大概ai写这种纯数学代码准确度还是很高的。

前两次作业用大模型辅助搭建了数据生成器,效果还是不错的,正比于你给它提示词的清晰度与复杂度。

心得体会

代码重构真是太累了!我再也不自己瞎想架构了,hw2我将直接参考学长经过验证的稳健架构……

但说到底,架构设计也是面向对象课程的核心能力,我大概会先自己设计,然后参考学长的架构进行修改和优化吧……

以及一个很大的感受:架构大于逻辑,一个好的架构可以让逻辑更加清晰,当你遇到逻辑不清晰的地方时,不妨想想怎么调整架构来解决,比起速度,在绝大多数情况下,正确性可能来的更重要一些。

未来方向

希望可以对一些非常数学的问题,提供一些指导,比如exp的优化部分,选择表达式的相等判断方法,再比如对多项式进行展开的方法。让同学们可以把精力集中在代码本身上。

 

 

 

 

 

 

 

...全文
58 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文档是一份针对初学者的Spring框架整合学习笔记,系统介绍了Spring Framework的核心基础与Spring MVC的开发应用。内容涵盖IOC(控制反转)的基本概念、配置方式与注解使用,详细讲解了bean的生命周期、作用域、依赖注入方式及自动装配机制;深入阐述AOP(面向切面编程)的XML与注解实现,包括切点、通知、织入等核心概念;全面演示Spring MVC的环境搭建、请求处理、参数绑定、视图解析、文件上传、RESTful风格支持、JSON返回、异常处理与拦截器开发;同时包含表单验证、国际化、与Struts2对比以及Spring IOC与MVC整合等实用知识点。; 适合人群:具备Java基础和基本Web开发经验,正在学习或刚进入企业级Java开发领域的初级程序员、应届毕业生及转行人员。; 使用场景及目标:①掌握Spring核心机制如IOC、AOP的原理与实际配置;②能够独立搭建Spring MVC项目并实现常见Web功能如参数接收、响应处理、文件上传、异常统一管理等;③理解Spring生态中各注解的作用与最佳实践,为后续学习Spring Boot和微服务打下坚实基础。; 阅读建议:此资源以理论结合实操为主,建议边阅读边动手搭建项目,重点理解配置背后的运行机制,尤其是bean生命周期、AOP织入过程和MVC请求流程,配合调试加深理解。
内容概要:本文围绕2026年高教社杯全国大学生数学建模竞赛A题“药材的烘干问题”提供完整的数学建模解决方案,涵盖问题分析、模型构建、算法实现与论文撰写等全套资源。文档不仅深入解析药材烘干过程中的传热传质机理,建立优化模型以提升干燥效率与品质,还系统整合了Matlab、Python等多种编程语言的代码实现方案,并附有高质量论文模板与写作指导。此外,资源包扩展覆盖无线电干扰源定位、微网电力调控、时频冲突消解、SEM广告投放策略等多个赛题,以及信号处理、电力系统优化、车间调度、路径规划、图像处理等多领域科研技术支持,配套提供大量仿真代码、算法模型与网盘资源链接,形成面向数学建模竞赛与科研实践的一站式学习与应用平台。; 适合人群:全国大学生数学建模竞赛参赛者,具备一定数学建模、编程基础的本科及研究生层次学生,以及从事智能优化、信号处理、电力系统、路径规划等相关领域的科研人员与工程技术人员。; 使用场景及目标:①辅助完成数学建模竞赛题目,特别是药材烘干过程的建模与优化求解;②学习多领域典型问题的建模方法与算法实现技巧,如优化算法、机器学习、控制仿真等;③获取标准化论文写作框架与优秀范例,提升科研表达能力与竞赛成绩。; 阅读建议:建议结合文档中提供的代码与论文范例进行实操复现,重点掌握建模逻辑、算法选型与结果分析方法;充分利用网盘资源拓展学习广度,针对自身研究方向深入钻研相关技术细节,全面提升综合实践与创新能力。
内容概要:本文系统阐述了基于矩方法的工程不确定度快速评估策略,重点突出其在迭代设计优化中的计算效率与稳定性优势,并配套提供了完整的Matlab代码实现。该方法通过提取输入变量的高阶矩信息,结合最大熵原理进行概率分布重建,从而实现对输出响应不确定性的高效传播分析,有效克服了传统蒙特卡洛方法计算成本高昂的弊端。研究深入对比了最大熵方法与Pearson分布系统在处理单峰及多峰分布尾部估计时的性能差异,验证了前者在扩展不确定度评估中的更高精度与更强鲁棒性,尤其适用于航空航天、高端装备等对可靠性要求严苛的复杂工程系统。; 适合人群:具备概率统计、随机过程及数值计算基础,从事工程设计、可靠性分析、不确定性量化或优化研究的科研人员、工程师及高年级研究生。; 使用场景及目标:①解决复杂工程系统中因材料、制造、载荷等多源不确定性引发的性能波动评估难题;②在迭代式设计优化流程中嵌入高效的不确定度传播模块,提升优化过程的稳定性与收敛性;③替代计算耗时的抽样方法(如蒙特卡洛),实现快速风险评估与可靠性分析;④应用于高维、非线性系统的尾部风险预测与安全边界划定。; 阅读建议:建议读者结合提供的Matlab代码,重点研读高阶矩计算、矩约束构建、熵最大化优化求解及概率密度函数重建等关键模块的实现细节,通过复现文中的对比实验,深入理解不同方法在尾部估计上的差异,并尝试将其应用于自身的工程案例中以掌握其适用边界与调参技巧。
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 【JAVA 个人版电影院售票管理系统】是一项依托于NetBeans开发平台构建的应用项目,其目标在于模仿现实中的电影院售票过程,致力于提供高效且方便的票务管理解决方案。该系统全面包含了电影排期安排、座位预定管理以及购票支付处理等一连串功能,为使用者和管理者提供了直观易用的交互平台。 1. **Java编程语言**:该系统的核心构建工具是Java,它作为一种跨操作系统的面向对象编程语言,拥有丰富的类库资源和卓越的性能表现,非常适合用于开发此类桌面应用程序。 2. **NetBeans IDE**:NetBeans是一个开源性质的集成开发工具,能够支持Java、C++等多种编程语言的开发工作,提供了从代码编写、调试、测试到部署的全方位服务,有效简化了项目的构建与维护流程。 3. **MVC设计模式**:模型-视图-控制器(Model-View-Controller)的设计理念被广泛采纳于该系统中,实现了业务逻辑、数据操作和用户界面的分离处理,从而形成了条理清晰的代码架构,便于后续的维护和功能扩展。 4. **数据库管理**:系统可能运用了SQLite或MySQL这类关系型数据库来储存电影资讯、演出时间表、座位可用状态以及购票历史等数据,达成了数据的持久化保存和高效率查询的目标。 5. **用户界面**:系统需具备视觉吸引力且操作简便的用户界面,涵盖电影信息列表呈现、场次挑选、座位分布图示、订单确认及支付环节等,这些界面通常借助Java Swing或JavaFX库来实现视觉呈现。 6. **数据验证**:在用户输入信息阶段,系统将执行数据校验操作,保证输入的电影名称、演出场次、座位...

309

社区成员

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

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