OO第一次博客
过去的三周里我们完成了表达式求导的程序设计与构造。表达式求导程序,大致思路是实现一个表达式类,支持表达式的输入、求导运算和输出功能。可能的话,还可以增加表达式的化简方法,从而得到更高质量的输出结果。总的来说,输入的处理是最为繁琐,也最容易出错的;而只要表达式类的结构设计合理,求导运算和输出都不会构成太多障碍。
一.程序结构分析
1.1第一次作业


第一次作业我在Main类中写了表达式输入的部分,因此Main类非常臃肿。尤其是对于x的指数部分的处理,判断分支写的很繁琐。这个在后面的两次作业中做了改进。

如上面UML类图所示,表达式由一系列的项组成,项中包含系数和指数。Main类中实例化一个表达式对象,完成输入处理,并调用表达式类的求导方法和输出方法。表达式的求导和输出都是通过调用项的求导和输出来实现的。
1.2第二次作业


可以看到,与第一次作业相比,Main类被很好地简化了,输入的功能放在了表达式的三个类中。因子的输入方法,本事涉及复杂的判断处理;项的输出方法,我的判断逻辑写的比较随意。这两处问题在上面都体现出来了。

Main中提供了字符串处理的下标值,并配备了访问方法和修改方法。表达式类的输入、求导和输出方法都是借助项类的相应方法实现的。项包含四个成员变量,分别是常系数、幂指数、正弦指数和余弦指数。这一次作业的因子其实比较简单,我这里为了后续作业的方便,设计了一个因子类;但这里只做了因子的输入处理,每一个因子在完成输入判断以后就会被并入项中。
1.3第三次作业


可以看到,这次代码中因子类成为了核心,负担很重。与上次作业情况类似,因子的输入和项的输出依然是最大的问题所在,在目前的设计思路下无法简化。

整体的结构与第二次作业非常相近,只是因子类变得更加复杂,并加入了单独的求导方法和输出方法。综观三次作业,主要的改变就是因子类。第一次作业是纯多项式,几乎可以不需要因子的概念;第二次作业可以提出因子的概念,但本身结构简单,可以轻易化简到项中;第三次作业里因子可以包含表达式,不再能轻易化简,而是成为了表达式结构中核心的一环。
二.bug分析
这三次作业我并没有在公测中被查出bug,只是在一些测试点扣了性能分。我第一次作业的nextLine方法没有做异常处理,如果输入为空会导致crash,后两次作业改正了这个问题。还有没有其它bug我就不知道了。
三.bug检测
高工16级没有安排互测,所以我就说下我是如何检测自己程序的bug的。
首先,如我刚才提到,表达式类总共是支持三项功能,我会先单独检查各项功能。先看输入处理能否准确剔除错误格式,提取正确信息,再检查正确的表达式能否顺利输出,最后调用求导方法,检查计算结果是否正确。
各部分检查通过后,再整体做测试。对出现问题的测试数据,再进一步检查,是输入bug还是求导bug等。
我个人的经历来说,前两次作业都在输入这一块出现问题,尤其是第一次作业的时候,感觉很迷茫;而第三次作业的输入处理已经比较熟练了,倒是求导时出现了些疏忽。
四.Applying Creational Pattern
表达式是一个很具体的东西,设计一个功能强大的表达式类,并创建一个表达式对象,是很自然的一种思路。至于求导方法,比起直接写死在表达式类里,如果写成一个接口,感觉结构上更加合理一些。具体的改动不会太大。
五.总结
OO的三次作业做完,我感觉是很有收获的。尤其是当我比较顺利地由第二次作业的代码改出第三次作业的代码时,很深刻地意识到良好的架构在面对需求更改时显现的巨大优势。另外,面向对象的程序,在检查bug方面,相比面向过程的程序要方便一些,但是完备的检查仍然非常困难,我现在也不确定我这三次作业还有多少bug,只能说试着测了我能想到的各种问题,每次交作业的时候其实心里都没什么底。后面的挑战会更加困难,我还需要好好准备。
OO第一次博客的更多相关文章
- OO第一次博客作业
OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...
- oo 第一次博客作业
oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...
- OO第一次博客总结
虽然早在开学之前就已耳闻过OO这门课的威力,也在寒假自学了一些java的语法,但在真正面对OO这样的工程训练时才发现寒假所学的那点语法简直不值一提,也深刻的感受到在这个过程中自己的提升确实很快,毕竟d ...
- OO第一次博客作业--第一单元总结
OO第一单元总结 面向对象设计与构造的第一单元,对“面向对象”的概念还根本不理解不熟悉,只觉得需要“分模块”,但不知道怎么分,分多少模块,怎么根据需要的模块的功能建立类.学习的进度又太慢,根本跟不上出 ...
- 2019年北航OO第一次博客总结
一.基于度量对程序结构的分析 1. 第一次作业 1.1 基于类的分析的度量 首先,基于类的属性个数,方法个数,每个方法的规模,每个方法的控制分支数目,类总代码规模等特征对本次作业的结构进行分析. 1. ...
- OO第一次博客作业总结反思
使用了masteruml插件来生成类图和metrics插件分析代码 第一次作业 1.UML类图 >在第一次作业中,使用了两个类,代码中有没有使用的变量与函数,为平衡两个类的内容,我将输出函数放在 ...
- 始入OO课程的殿堂,初识面向对象的奥妙——OO第一次博客总结
当我满怀期待叩开OO的大门,却发现宝藏藏在层层阻难之后 第一次作业 1.度量分析 >关于第一次作业的metrics图分析没有出现标红的McCabe Cyclomatic Complexity或者 ...
- OO第一次博客作业(第一单元总结)
Q:菜是绿的,鸡是黄的,那菜鸡是什么颜色的? A:红的,强测全WA了,能不红么. 菜不菜的问题先不说了,认真研究一下这次的题目,以及WA的原因吧. 程序结构简析 三次实验的核心结构都是差不多 第一次的 ...
- [BUAA OO]第一次博客作业
第一次作业 第一次进行面向对象的编程,不论是针对数据设计类还是对方法进行合适的归于不同类中,都不是很熟悉.所写出来的程序还是面向过程+有函数的类(虽然现在很大程度上感觉起来也是这样).索性作业难度并不 ...
随机推荐
- Linux history显示时间/用户/ip的设置
在使用linux服务器的时候发生一些不知道谁操作的问题,google一下说history命令可以查看到历史记录,用过之后发现还是不够详细,再google,原来可以自己设置history的显示. 记录设 ...
- ssl证书专题(2):自签名ssl 证书生成
参考: https://www.cnblogs.com/littleatp/p/5878763.html https://www.cnblogs.com/hnxxcxg/p/7610582.html
- Java设计模式之建造者模式(生成器模式)
建造者模式: 也叫生成器模式.用来隐藏复合对象的创建过程,他把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象. 总结一句就是封装一个对象的构造过程,并允许按步骤构造 ...
- websocket-heartbeat-js心跳检测库正式发布
前言: 两年前写了一篇websocket心跳的博客——初探和实现websocket心跳重连. 阅读量一直比较大,加上最近考虑写一个自己的npm包,因此就完成了一个websocket心跳的检测库.在这 ...
- docker+fastdfs+nginx 实现分布式大文件存储系统以及视频缓存播放
废话不多说,直接开撸 首先是一些准备工作: 1.关闭防火墙 service iptables stop --- fastdfs虽然在docker部署,但是使用的是主机网络,所以关闭防火墙. 2 下载 ...
- PBRT笔记(2)——BVH
BVH 构建BVH树分三步: 计算每个图元的边界信息并且存储在数组中 使用指定的方法构建树 优化树,使得树更加紧凑 //BVH边界信息,存储了图元号,包围盒以及中心点 struct BVHPrimit ...
- [Python]Python中的浅复制与深复制
看python的文档,发现list有copy方法,描述说效果同a[:]. 感觉有点惊讶,之前一直以为a[:]执行的是深复制. test了一下,发现确实如果a中存在可变对象,如list/set/dict ...
- SDOI2019 省选前模板整理
目录 计算几何✔ DP 斜率优化✔ 四边形不等式✔ 轮廓线DP✘ 各种分治 CDQ分治✔ 点分治✔ 整体二分✔ 数据结构 线段树合并✔ 分块✔ K-D Tree LCT 可持久化Trie✔ Splay ...
- Object类的方法
一 Object:类Object是类层次结构的跟类,每个类都使用Object作为超类,每个类都是直接或者间接的继承自Object类. Object类的方法: ①public int hashCode( ...
- python学习:删除空白
删除空白 删除尾部空白 确保字符串尾部没有空白,使用rstrip(); 删除字符串开头的空白,使用lstrip(); 同时删除字符串两端的空白,使用strip() 代码: >>> ...