OO第一次博客作业--第一单元总结
OO第一单元总结
面向对象设计与构造的第一单元,对“面向对象”的概念还根本不理解不熟悉,只觉得需要“分模块”,但不知道怎么分,分多少模块,怎么根据需要的模块的功能建立类。学习的进度又太慢,根本跟不上出作业的速度,导致三次作业的代码都写得很乱,很不面向对象。
1. 第一次作业
1.1 程序结构分析


第一次的作业比较简单,但由于刚刚接触面向对象,程序的结构仍然不太好。整个 project 只有两个类,主类和多项式处理类,且两个类的复杂度差别较大。由插件 MetricsReloaded 的分析可知,多项式处理类中的方法普遍有耦合度过高,判定结构过于复杂。主要的代码量都在输入处理部分,应该将其从多项式类中抽出来,组成一个单独的 InputHandler 类,这样能使层次结构更加清晰。
1.2 程序Bug分析
主要的BUG 集中在当结果为0时无输出和对于类似 '\f' 这样的空白字符的处理。
第一个bug 的出现是因为不细心,忘记对输出进行处理,我用的数据结构是 HashMap,理应在输出字符串为空时输出"0"。又因为写好程序后没有对程序进行测试,完全依赖于评测机,面向分数,没有发现这个简单的bug。
第二个bug 的出现是对指导书的阅读不仔细,没有注意到指导书特别规定了空白字符只有空格和tab,也没有意识到会因为多实现了功能被攻击……
1.3 互测策略
主要依赖于读代码,读代码的读出bug的大头是正则表达式。但第一次很多人用了大正则,直接匹配整个输入,正则表达式的长度常常过百,导致虽然读到bug就百发百中,但效率极低。
2. 第二次作业
2.1 程序结构分析

第二次作业在第一次作业的基础上加了三角函数 sin(x) 和 cos(x),刚开始看起来似乎复杂了很多,但其实也只是公式复杂了一些,实现方法还是比较简单。
结构上和第一次相比多写了一个 HashMap 的 Key 类,因为有三个函数,就有三个指数,需要为HashMap 的Key单独写一个类。
结构上仍然存在耦合度高和判定结构复杂的问题,特定的几个方法过于复杂,很容易出现错误。
2.2 程序Bug分析
因为第一次不细心而遍体鳞伤后,第二次作业在写代码时尽量考虑到了能在输入输出处理上避免的所有bug,但还是出现了一个bug,尽管不是结构上的大的错误,也使我收到了一定的伤害。
这个bug是将项以'*'为分割符分开后,没有完全检测每一个因子的合法性,比如 “sin(x) * ” 这样的样例竟然被放过去了…
2.3 互测策略
吸取上次作业互测吃力不讨好的现象,我在评测区认真学习了大佬们提供的互测方法,写了自己的脚本,手动构造输入,自动对Room里的其他程序测试,获取输出,并计算比对。确实很大地提高了效率,但还是没有针对性地构造样例,又因为这一次大家都认真思考了,命中率不高。(我所在的Room 内一共只出现了8个bug)
3. 第三次作业
3.1 程序结构分析


第三次作业的难度提升了一个大的台阶,前两次对结构层次的要求都不高,毕竟只有两三个函数,+-和*两种组合方式。第三次作业加入了嵌套机制,我的第一想法就是用递归。
结构上刻意根据功能划分出了相应的模块,但层次并不分明,还不是很清楚接口的用法。
总体的复杂度做得比前几次都好,但仍然在表达式类的求导方法中写得很乱,基本复杂度、模块设计复杂度和模块判定结构的复杂度都高得不行,甚至derivation 原先是一个方法,出于方法长度限制得原因我把它分成了两个方法…
3.2 程序Bug分析
主要出现了两个Bug,一是指数的格式判断错误,忘记了指数可以带符号,于是对所有带符号指数都判断为错误。这是一个由粗心引起的致命的错误。
二是处理输入,读到 ’-‘ 号时把表达式分为两部分,应该对后面部分的表达式变号,在变号的过程中没有考虑到指数带符号的情形,于是又出现了一个致命的错误。
虽然两个bug 都出于题目理解不到位,但是如果我的程序更有层次,能划分出清楚的子类父类,特别写一个指数类,就很难出现这样的错误。总的来说还是结构引发的错误。
3.3 互测策略
互测的方法跟上次一样,利用脚本自行构造输入比对结果。比上一次效果更好,因为程序更加复杂,更难考虑到每一种可能出现的错误。
个人总结
1. 正则很好用,lookahead & lookbehind 很好用。
2. 善用接口能使代码变得结构分明,具有美感。
3. 事先的设计比写代码时的思考更重要。
OO第一次博客作业--第一单元总结的更多相关文章
- oo 第一次博客作业
oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...
- OO第一次博客作业
OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...
- OO第一次博客作业(第一单元总结)
Q:菜是绿的,鸡是黄的,那菜鸡是什么颜色的? A:红的,强测全WA了,能不红么. 菜不菜的问题先不说了,认真研究一下这次的题目,以及WA的原因吧. 程序结构简析 三次实验的核心结构都是差不多 第一次的 ...
- OO第一次博客作业总结反思
使用了masteruml插件来生成类图和metrics插件分析代码 第一次作业 1.UML类图 >在第一次作业中,使用了两个类,代码中有没有使用的变量与函数,为平衡两个类的内容,我将输出函数放在 ...
- [BUAA OO]第一次博客作业
第一次作业 第一次进行面向对象的编程,不论是针对数据设计类还是对方法进行合适的归于不同类中,都不是很熟悉.所写出来的程序还是面向过程+有函数的类(虽然现在很大程度上感觉起来也是这样).索性作业难度并不 ...
- [BUAA软工]第一次博客作业---阅读《构建之法》
[BUAA软工]第一次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第1次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...
- Java第一次博客作业
第一次博客作业 目录 三次作业题目详情 作业中的错误分析 感想与心得 题目详情 题目1:第一次作业: 类图: 题目2 类图: 题目3 类图: 题目4 题目5 题目6 类图: 题目7 类图: 题目8 第 ...
- OO第二次博客作业--第二单元总结
第一次作业 1. 设计策略 第一次作业,一共三个线程,主线程.输入线程和电梯线程,有一个共享对象--调度器(队列). 调度的策略大多集中到了电梯里,调度器反而只剩下一个队列. 2. 基于度量的分析 类 ...
- OO第一次博客总结
虽然早在开学之前就已耳闻过OO这门课的威力,也在寒假自学了一些java的语法,但在真正面对OO这样的工程训练时才发现寒假所学的那点语法简直不值一提,也深刻的感受到在这个过程中自己的提升确实很快,毕竟d ...
随机推荐
- Fast R-CNN(理解)
0 - 背景 经典的R-CNN存在以下几个问题: 训练分多步骤(先在分类数据集上预训练,再进行fine-tune训练,然后再针对每个类别都训练一个线性SVM分类器,最后再用regressors对bou ...
- gzip 压缩
nginx 开启静态 gzip 配合 Vue 构建 在站点配置添加如下代码: location ~* \.(css|js)$ { gzip_static on; } 这是 nginx 的静态 gz ...
- sql优化------查询整个表按照某个字段排序后的前几条
后续补充
- C#基础零碎知识点摘录
1.类分为静态类个非静态类(实例类) 静态类不能创建对象,使用方法时,直接类名.方法名(),常用的静态类有Console类 实例类:创建对象时通过对象调用类的方法 2.当我们声明一个类成员为静态时,意 ...
- 非旋 treap 结构体数组版(无指针)详解,有图有真相
非旋 $treap$ (FHQ treap)的简单入门 前置技能 建议在掌握普通 treap 以及 左偏堆(也就是可并堆)食用本blog 原理 以随机数维护平衡,使树高期望为logn级别, FHQ ...
- SpringCloud+ZUUL跨域请求中的OPTIONS请求处理
目前项目结构是VUE做前端,后端采用微服务架构,在开发时前端需要跨域请求数据,通过CorsConfig配置解决了简单跨域请求需要.但当需要在请求的header中增加token信息时,出现了请求失败的情 ...
- Git常用的操作
1.git使用的常规操作 git pull——>编辑——>git add——>git commit——>git push 用git add把文件添加进去,实际上就是把文 ...
- Node-SASS安装 scss
今天第一次用vue-cli 构建一个项目时, 前期一直很正常, 在编写了sass 时就报错了, 错误如下 This dependency was not found: * !!vue-style-l ...
- 在python中使用print()时,raw write()返回无效的长度:OSError: raw write() returned invalid length 254 (should have been between 0 and 127)
写出一个不是code的bug,很烦恼,解决了挺长时间,都翻到外文来看,不过还是解决了,只尝试了一种简单可观的方法,希望对大家有用 我正在使用Django与Keras(tensorflow)来训练一个模 ...
- Win7 安装bundle
bundle依赖ruby,因此需要下载并安装一下内容: 1. rubyinstaller 这个是windows专用的ruby安装程序,下载地址是http://rubyinstaller.org/ 2. ...
