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]第一次博客作业
第一次作业 第一次进行面向对象的编程,不论是针对数据设计类还是对方法进行合适的归于不同类中,都不是很熟悉.所写出来的程序还是面向过程+有函数的类(虽然现在很大程度上感觉起来也是这样).索性作业难度并不 ...
随机推荐
- kuangbin带你飞dp专题-基础dp
dp HDU - 1257 最少拦截系统 最长递增子序列 #include<iostream> using namespace std; const int maxn=1e7; int a ...
- 利用yarn capacity scheduler在EMR集群上实现大集群的多租户的集群资源隔离和quota限制
转自:https://m.aliyun.com/yunqi/articles/79700 背景 使用过hadoop的人基本都会考虑集群里面资源的调度和优先级的问题,假设你现在所在的公司有一个大hado ...
- 牛顿二项式与 e 级数
复习一下数学, 找一下回忆. 先是从二项式平方开始: 其实展开是这样的: 再看立方: 通过排列组合的方式标记, 于是: 通过数学归纳法可以拓展: 使用求和简写可得: e 级数 数学常数 e (The ...
- Moonlight Shadow
歌词 Moonlight Shadow 月光幽灵 -- Dana Winner 1. The last that ever she saw him 那是她今生最后一次见到他 2. carried aw ...
- DWM1000 收发RXLED TXLED控制代码修改
DWM1000 模块一共可以最多外接4个LED,但是API默认只会只用到两个LED,分别是RXLED.TX LED. 特别注意:RXLED 是模块在RX 状态,而不是接收到数据. 修改代码,使得4个L ...
- ZooKeeper Getting Started Guide
http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html What is ZooKeeper? ZooKeeper is a centra ...
- Java 获取当前日期的几种方法
import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import ja ...
- 编写程序,将来自文件中的行保存在一个vector<string>,然后使用一个istringstream 从vector中读取数据,每次读一个单词
#include<fstream> #include <vector> #include<string> #include<iostream> #inc ...
- [LeetCode] Random Pick with Weight 根据权重随机取点
Given an array w of positive integers, where w[i] describes the weight of index i, write a function ...
- ajax 传递中文字符参数 问题
使用ajax 传递中文字符串时, 服务端会接收不到预期的 中文字符. 此时,需要对 js中的中文字符参数进行 编码, 到达服务端后, 再为其解码 即可. 前端: var url = '....'; ...