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第一次博客作业--第一单元总结的更多相关文章

  1. oo 第一次博客作业

    oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...

  2. OO第一次博客作业

    OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...

  3. OO第一次博客作业(第一单元总结)

    Q:菜是绿的,鸡是黄的,那菜鸡是什么颜色的? A:红的,强测全WA了,能不红么. 菜不菜的问题先不说了,认真研究一下这次的题目,以及WA的原因吧. 程序结构简析 三次实验的核心结构都是差不多 第一次的 ...

  4. OO第一次博客作业总结反思

    使用了masteruml插件来生成类图和metrics插件分析代码 第一次作业 1.UML类图 >在第一次作业中,使用了两个类,代码中有没有使用的变量与函数,为平衡两个类的内容,我将输出函数放在 ...

  5. [BUAA OO]第一次博客作业

    第一次作业 第一次进行面向对象的编程,不论是针对数据设计类还是对方法进行合适的归于不同类中,都不是很熟悉.所写出来的程序还是面向过程+有函数的类(虽然现在很大程度上感觉起来也是这样).索性作业难度并不 ...

  6. [BUAA软工]第一次博客作业---阅读《构建之法》

    [BUAA软工]第一次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第1次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...

  7. Java第一次博客作业

    第一次博客作业 目录 三次作业题目详情 作业中的错误分析 感想与心得 题目详情 题目1:第一次作业: 类图: 题目2 类图: 题目3 类图: 题目4 题目5 题目6 类图: 题目7 类图: 题目8 第 ...

  8. OO第二次博客作业--第二单元总结

    第一次作业 1. 设计策略 第一次作业,一共三个线程,主线程.输入线程和电梯线程,有一个共享对象--调度器(队列). 调度的策略大多集中到了电梯里,调度器反而只剩下一个队列. 2. 基于度量的分析 类 ...

  9. OO第一次博客总结

    虽然早在开学之前就已耳闻过OO这门课的威力,也在寒假自学了一些java的语法,但在真正面对OO这样的工程训练时才发现寒假所学的那点语法简直不值一提,也深刻的感受到在这个过程中自己的提升确实很快,毕竟d ...

随机推荐

  1. python 模块 wmi 远程连接 windows 获取配置信息

    测试工具应用: https://ask.csdn.net/questions/247013 wmi连接不上报错问题集 https://blog.csdn.net/xcntime/article/det ...

  2. react简书

    开发项目之前的准备 https://www.chromefor.com/  登录此网站 下载相关crx react插件 不然要FQ 下载 React Developer Tools 谷歌插件下载 Re ...

  3. DQL、DML、DDL、DCL区别

    DQL(data query language)数据查询语言 主要是由SELECT构成的查询语句 基本语法:select 字段名 from 表名 where 查询条件 DML(data manipul ...

  4. LeetCode第十三题-将罗马数字转化为数字

    问题简介:将输入的String类型的罗马数字转化为int数值 问题详解:罗马数字由七个不同的符号表示:I,V,X,L,C,D和M 符号-数值 I - 1 V - 5 X -10 L - 50 C - ...

  5. 有了GPRS为什么还要LoRa和NB-IoT?【转】

    转自:https://blog.csdn.net/i_am_Banmei2/article/details/81869724 与其说是GPRS和NB-IoT的比较,不如说是传统网络与新兴网络的比较,我 ...

  6. 【转】Java中的static关键字解析

    一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没 ...

  7. 关于git 远程仓库密码一直输错的问题

    解决方法, git 换地方使用后需要重新配置秘钥,一个钥匙开一个地方的门: 如果还不行, 在控制面板-用户账户-凭据管理-加添凭证,输入正确的账号密码:因为Windows的凭据管理器里面可能保存了你刚 ...

  8. 此主机支持Intel VT-x,但Intel VT-x处于禁用状态

    原因:未开启虚拟化技术 解决方法:https://www.cnblogs.com/jiefu/p/10711955.html

  9. Cesium 动态更换模型贴图方法

    参考资料 github 讨论地址 示例代码地址 示例代码 var viewer = new Cesium.Viewer('cesiumContainer'); var scene = viewer.s ...

  10. ssh报错 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    今天登陆远程主机的时候,出现如下的报错信息 ssh 10.0.0.1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WAR ...