BUAA-OO-Unit1

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

架构关系总览(直接使用的HW3)

在这里插入图片描述

总体思路为:替换函数->预处理->递归下降为基本项->分配律计算基本项->合并同类项并输出

各个类的介绍:

Operation

功能同main,总控整个程序。

FuncDefine
在这里插入图片描述

储存函数这个数据类型,成员包括参数顺序,函数表达式。

Function
在这里插入图片描述

处理函数,主要功能包括:内置一个set,收集所有函数,方法可用于expr中的函数表达式替换,而getPara用于替换时函数参数的获取。

Solve
在这里插入图片描述

核心之一,替换完函数后就变成了一般的expr,便于递归下降,其中功能包括预处理、递归下降流程控制、合并同类项,答案输出。

ParserExpr
在这里插入图片描述

十分直观,把表达式分离为一个个项,并储存。

ParserTerm
在这里插入图片描述

把项分离为一个个因子,并储存。

Cal
在这里插入图片描述

核心之一,把分离出来的因子相乘并返回基本项,此时完成了一个项的计算,再循环往复就可计算完所有属于同一个项的因子,最后得到一堆基本项,合并同类项即可。
(本次作业败笔之一,导致每次强测必错一两个,而且调试起来极为复杂,高度聚合高度耦合导致它成为一个臃肿的类,我也变成了C房的常客)

Term
在这里插入图片描述

项数据类型。

Factor
在这里插入图片描述

因子数据类型。

TermResult
在这里插入图片描述

基本项数据类型。

总体来看,没有突出对象这一关键词,Cal更是完全是一个过程编程,一个假期结束,oopre忘干净了。

架构设计体验

初次设计的时候我就是大概依从这个思路了,事实上扩展性也还不错,不过因为一个极大的问题,我在hw2进行了大范围修改(不算重构,思路框架没变)。即深浅拷贝问题。

这是血的教训,而且过程性编程也让我难以追踪对象的去处,导致到处都存在两个引用指向同一对象的问题,后来我无法再更改,只能无脑深拷贝,牺牲了速度和内存,理所应当的强测挂了。

于是hw3也就按题目要求随随便便完成作业,属实是想赶紧逃离这堆屎山。

未来可能场景,无非就是增加基础数学量,对应修改因子类型和基本项即可,而因为新增数学量导致的更多运算方式,也可以在Cal类里面添加对应的计算方法。但是如果遇到函数的递归定义,无法统一化为一个形式的sin cos,我的这个代码就大概率要重构了,毕竟我这次设计的基底就是,认为所有的算数运算最终都会得到一个拥有统一形式的因子(或许继承可以帮助我减少重构量,毕竟不可统一项可以继承一个子类,视为基础项的特殊形式)。

Bug分析

HW1

一个小小的脑残错误,导致我hw1不尽人意。我把0这个常数在预处理的时候当前导零删了,关键中测没测出来就离谱,真想......

HW2

放弃的导火索。oopre也吃过深浅拷贝的亏,但是我在写的时候完全忘了这个茬,结果到处都是共用内存,共用容器,共用对象,这个bug最后靠暴力解决,已在设计体验说过,不再赘述。解决这个bug我花了连续两天(强测出来后因为暴力超时超内存又花了四天bug修复),每天吃饭睡觉之外就是对着它,后面就丧失兴趣,草草了事,只想快点结束个单元。

HW3

又是脑残时刻,这次新增函数可以互相嵌套定义,我一拍脑门,就自作聪明把函数定义式看作一个expr,然后直接接套用hw2里面的函数替换方法,可是我没想到,这次意味着替换字符串里面会出现xyz,而hw2的传参过程中是始终只有x一个自变量的,于是强测又挂了。

Hack心得

按文法定义一步步分类测试,枚举所有文法提到的类型,个人感觉覆盖率很高,缺点是思维强度大,时间成本高。

优化

本人优化能力不是很强,每次都是卡线过,唯一值得一提的就是对单一重复单项的特殊计算(expr^8嵌套)和对有0存在的项的删除处理以及化exp指数为乘法系数的处理。
不过在优化过程中发现,BigInteger的运算速度属实太慢,我后面就极力避免对BigInteger做运算处理。

心得体会及未来方向

第一单元收获最大的是重新捡起了深浅拷贝的认识和深化了对象的概念(计组P7让我满脑子过程编程)。
另一个收获就是写复杂代码时得一边写一边调试,不能图流畅省事一口气写完,这样将面对一座烂尾楼。稳步前进也能方便及时反思修改。
下一次打算把一个个目标抽象为对象,然后在加工处理的过程中逐步变为最终需要的对象,最后输出答案。 (我还是不太理解啥叫面向对象,也不理解如何用面向对象的思路设计一个程序,要是有人读到了这儿,希望你能不吝赐教,拉一把低悟性的我)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值