BUAA_OO 第一单元总结

BUAA_OO 第一单元总结

在第一单元里,我们需要完成的主要任务有:通过对数学意义上的表达式结构进行建模,完成单变量多项式的括号展开,函数调用、化简,逐步体会层次化设计的思想的应用和工程实现。具体而言,第一次作业中,我们初步分析表达式,进行括号展开(不含嵌套括号),化简表达式;第二次作业中,我们需要展开嵌套括号的表达式,并引入指数函数(exp)和自定义函数(f(x)、g(x)等);第三次作业中,我们进一步引入求导因子(dx)。显而易见,每一次的作业都是在前一次作业的基础上迭代开发而来的。

一、程序结构

第一次作业类图

hw_1_uml

第一次作业复杂度分析

hw_1_class
1

第二次作业类图

1

第二次作业复杂度分析

1
1

第三次作业类图

1

第三次作业复杂度分析

1
1

二、架构设计体验

第一次作业因为较为简单,括号不会嵌套,因此我在第一次作业中没有采用过多的设计,仅仅建立了四个类:Main,Expr(表达式),Term(项),Factor(因子),解析输入时简单地从左到右扫描,虽然可以应付第一次作业要求,但显然不具有太高的扩展性(尤其是回避了嵌套括号出现的可能)。因此重构势在必行。
果然,第二次作业就出现了括号嵌套的要求,并且新增了自定义函数和指数函数。我重构的时候参考了作业公众号里的内容和课上实验的内容,建立语法树,递归下降地解析输入。具体而言,我首先建立了Token,Lexer两个个类,将输入解析为左括号"(“,右括号”)“,加号”+“(此处未来简化分析,我仅仅只把”+“作为算术符号,而把”-“作为负数符号),乘号’*”,幂的符号"^",数字,幂,指数。然后我建立Parser类建立语法树并计算。同时,我把Factor抽象为接口,下接Expr,Num,Exp,Pow几个类。这样做结构一下清晰了,逻辑上也十分自然。对于函数处理,我采用字符串替换策略。
第三次作业的难点在于求导的实现。而有了第二次重构后的架构,我仅仅在Lexer中新增了对dx的分析,以及相关类里新增求导方法即可,不必再有大的变动。

三、bug分析

在整个过程中,我遇到以下几个bug:
1.因为我把"-“作为负号而不是减号使用,所以出现了会把"x"和”-x"分析为同一个变量的情况,所以我把所有"-“替换为”-1*"来避免混淆。
2.在化简的过程中,有时可能会出现计算异常的情况。在交流群里我得知这可能是函数执行时隐含调用toString出现的bug,于是我在化简时把化简的步骤分散到每一小步,最后以牺牲执行时间的代价修复了这个bug(还好没有TLE)。

四、优化

主要集中在化简和同类项合并,解决思路较为直观,利用容器的特点,没有相关项就加入,有相关项就更新。后来又遇到了exp的指数提公因式的问题,在和同学的交流中得知可以利用BigInteger自带的gcd()方法。

五、心得体会

得益于大二上学期参加的oopre课程,我在上手阶段很快就适应了oo作业的模式,并且对于作业平台和git的使用也比较熟悉。
这一次作业让我对面向对象程序设计有了更加深刻的体会,强调将数据和处理数据的方法(即行为)打包在一起,形成一个独立的、可重用的逻辑单元——对象。对继承和多态的特点有了切实体会。学会了更加抽象更加全面看待具体问题。
面向对象的理念也带来了以下几个好处:
1.可维护性:由于封装和模块化的设计,更改一个对象不会直接影响其他对象。
2.可扩展性:通过继承和多态,容易添加新的类和功能。
3.易于理解:基于对象的视角更接近人类对现实世界的认知模型,有助于提高程序的可读性和设计的清晰度。

六、课程建议

我个人感觉第一次作业和第二次作业的难度差异有点大(相较于第二次作业和第三次作业的难度差异)。可以在第一次作业时明确提出嵌套括号的要求,引导学生在第一次作业时就尝试建立一个较好的架构,减少重构的可能性。

以上就是我对第一单元的总结。

  • 34
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值