BUAA_OO_第一单元
BUAA_OO_2020_UNIT1
一、程序结构分析
第一次作业
UML & Mertrics
由于数据处理简单,第一次作业中笔者发挥了面向过程的思想,将项转换成Biginteger, Biginteger
的字典逐项输出就行了,导致类复杂度、方法复杂度耦合度都很高,后面只能重写。笔者在后面作业意识到这种面向过程式程序不利于迭代开发。
第二次作业
UML & Mertrics
笔者在第二次作业中建立了项-表达式的层次,建立了合并类与输入处理类,但没有将因子也建立类,导致第三次作业无法处理嵌套再次重构,Parse
类与项Term
类较臃肿,因为笔者将四元组作为项的数据结构。
第三次作业
UML & Mertrics
笔者在第三次作业根据表达式-项-因子的层次建立类,Term
类与Parse
类仍然复杂,因为笔者在此次作业中,把输入输出处理聚集在Parse
,把化简方法分散到Term
,Fact
类中,导致耦合度较高。
二、Bug分析
- 笔者两处Bug都在输出化简上
- 第二次作业中,笔者没有在正常数
Term
前打印'+'
,因为Term
输出函数内if-else
太多了,也很难看,笔者随后想到打印Term
时正项一定打印'+'
,并优先输出常数的方法,对于表达式Expr
中多符号直接换成单符号,"+1*"
直接换成"+"
就完事了,然而, - 第三次作业中,笔者逻辑错误,对于
Term
,先合并Term
中的因子Fact
,再把Term
中实例为复合因子Complex
且只含一个Term
的拆成ArrayList<Fact>
加入Term
中;显然这两次处理顺序反了,于是可能输出一个以上连续的常数因子Constal
(+5*+1*....
),超出了笔者的设想,化简方法于是造成了错误。
- 第二次作业中,笔者没有在正常数
三、互测策略
仔细看别人的代码,我从一些结构清晰的同学的代码收获很多,对于结构混乱没有注释的还是放弃阅读吧
一个一个运行其他人
Project
太慢了,可以写程序输入一组数据然后让其他人程序同时运行得到多人的输出,提高效率构造边界数据,可惜这次不能输入非法数据
四、对象创建模式
- 第一次作业是淳朴的面向过程思想,只有一个
Expr
类,没有体现出层次化的设计模式,第一次作业,我学会了对象构造方法,把解析的数据传入Expr
,再调用Expr
中的deriv()
进行输出。 - 第二次作业在输入处理上放弃了一个正则表达式到位的思想,改成了分层次处理,先把表达式分割成项,处理项,
Wrong Format
的处理也分层处理,表达式只管是不是合法的表达式,项只管是不是合法的项,在第三次作业中沿用了这种方法,处理很顺利。为方便求导没有体现出因子的层次,导致第三次重构,合并仍然采用Hashmap<>
。 - 第三次作业相比于第二次构建了因子类
Fact
,我把表达式Expr
继承于复合因子Complex
,感觉还是有点奇怪的,但他们的数据结构是一样的,不同的是输出方式。输入还是分层处理,求导方面,笔者思维有限,不太理解深浅拷贝的效果,在求导时尽量深拷贝以防意想不到的错误。输出的关键是化简。笔者理应该构建化简类来解耦的,笔者通过递归式的化简-合并完成整个表达式的化简,当然有些地方没化简比如sin(0)
,cos(0)
笔者没有进行幂函数的合并,在笔者的结构中,最好在Term
下继承一个类来表示幂函数方便化简。 - 三次作业中没有明确的设计模式,随遇而安,不利于构造清晰的程序结构。
五、心得体会
经过第一单元的学习,我意识到面向对象思想的重要性,因为单纯的面向过程编程可维护性低,难以迭代式开发,导致我重写了2次;其次就是在写程序时必须要注意程序的鲁棒性,对异常输入有识别与处理机制;还有就是不要盲目开写,良好的构思可以效果拔群。
BUAA_OO_第一单元的更多相关文章
- OO第一单元作业小结
前言 第一单元的主题是表达式求导,第一次作业是只带有常数和幂函数的求导,第二次作业加入了正余弦函数,第三次作业又加入了表达式嵌套,难度逐渐提升.总体来说前两次作业还易于应对,而第三次作业做得相对有些艰 ...
- BUAA面向对象设计与构造——第一单元总结
BUAA面向对象设计与构造——第一单元总结 第一阶段:只支持一元多项式的表达式求导 1. 程序结构 由于是第一次接触面向对象的编程,加之题目要求不算复杂,我在第一次作业中并没有很好利用面向对象的特点, ...
- 2019_BUAAOO_第一单元总结
前言 OO第一单元共有三次作业,分别为多项式求导.带有三角函数与幂函数的表达式求导.带有嵌套表达式因子的表达式求导.虽然这三次作业都离不开求导,可是每次作业的复杂度都是大大递增的.对于习惯于面向过程编 ...
- OO第一单元作业总结
oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...
- OO第一单元总结
OO第一单元作业总结 一.前言 开学四周,不知不觉已经做了三次OO作业.事实上,每一次作业对我来说都是很大的挑战,需要花费大量的时间和精力来学习. 虽然学得很艰苦,但最后还是连滚带爬地完成了.(好惨一 ...
- OO第一次博客作业--第一单元总结
OO第一单元总结 面向对象设计与构造的第一单元,对“面向对象”的概念还根本不理解不熟悉,只觉得需要“分模块”,但不知道怎么分,分多少模块,怎么根据需要的模块的功能建立类.学习的进度又太慢,根本跟不上出 ...
- OO第一单元总结(表达式求导)
写在前边:第一次接触面向对象语言,编程思想仍然不可避免的有以前面向过程的影子.从第一次作业的完全面向过程,到第二次学会剥离各个类互不影响到第三次作业的先构思面向对象的基本程序架构再编程.虽然程序有些地 ...
- OO第一单元优化博客
OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)\)和\(cos(x)\)的指数作为坐标,在图上画出来就可 ...
- 【BUAA-OO】第一单元作业总结
#OO第一单元作业总结 #确认存活,爱学习,爱北航,爱OO 一.三次作业分析 1.第一次作业 1.1 程序结构 对方法的度量: 类的内聚和相互间的耦合情况: 类图: 优缺点: 优点大概没什么优点,毕竟 ...
随机推荐
- Error Code: 1452 Cannot add or update a child row: a foreign key constraint fails
错误: Error Code: 1452 Cannot add or update a child row: a foreign key constraint fails 错误产生情景:我向一张带外键 ...
- JavaScript数据类型判断的四种方法
码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14416375.html 本文分享了JavaScript类型判断的四种方法:typeo ...
- K8s炼气期(一)| minikube安装本地Kubenetes环境
前言 根据Kubenetes学习路径的七大阶段,炼气期.筑基期.金丹期.元婴期.化神期.炼虚期.大乘期:开始炼气期的第一个小阶段,安装Kubenetes环境. 目录 1.安装kubectl 2.安装m ...
- UDP编程详解
目录 报文格式 通信过程 UDP客户端流程 UDP客户端编码 UDP服务器流程 UDP服务器编码 参考文献 UDP与TCP的不同之处是:他的通信不需要建立连接的过程.中文名称用户数据报协议.时OSI参 ...
- 无情面试官之包含min函数的栈
0 我是一个无情的面试官. 面人无数,挂人无数. 若想过我的面试,标准只有一个,那就是公司很缺人. 招新人,填旧坑. 1 今天是我的第1001次当面试官,要求却不是千里挑一,而是一击必中. 因为我招聘 ...
- 重量级锁synchronized的优化----自旋锁、自适应自旋锁、锁消除、锁粗化
synchronized是重量级锁,效率不高.但在jdk 1.6中对synchronize的实现进行了各种优化,使得它显得不是那么重了.jdk1.6对锁的实现引入了大量的优化,如自旋锁.自适应自旋锁. ...
- linux之安装nginx
nginx官网:http://nginx.org/en/download.html 1.安装nginx所需环境 a) PCRE pcre-devel 安装 # yum install -y pcre ...
- 如何使用 Github Actions 自动抓取每日必应壁纸?
如何白嫖 Github 服务器自动抓取必应搜索的每日壁纸呢? 如果你访问过必应搜索网站,那么你一定会被搜索页面的壁纸吸引,必应搜索的壁纸每日不同,自动更换,十分精美.这篇文章会介绍如何一步步分析出必应 ...
- 在 .NET Core 中应用六边形架构
在本文中,您会看到一个Web API应用的模板,在.NET Core 中应用了六边形架构,并且里面包含了一些基础功能. 介绍 这是一个模板项目,里面集成了一些必备的基础功能,当我们需要开发一个新项目时 ...
- pytorch(11)模型创建步骤与nn.Module
模型创建与nn.Module 网络模型创建步骤 nn.Module graph LR 模型 --> 模型创建 模型创建 --> 构建网络层 构建网络层 --> id[卷积层,池化层, ...