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. warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

    在C++中, char* p = "abc"; // valid in C, invalid in C++ 会跳出警告:warning: ISO C++ forbids conve ...

  2. 关于Linux的随笔笔记

    1.Ctrl+c.Ctrl+z和Ctrl+d的区别: Ctrl+c和Ctrl+z都是中断命令,但是他们的作用却不一样: Ctrl+c 是向当前进程发送SIGINT信号,用于终止进程: Ctrl+z 是 ...

  3. 7系列FPGA的时钟资源——UG472

    时钟架构总览 7系的FPGA使用了专用的全局(Global)和区域(Regional)IO和时钟资源来管理设计中各种的时钟需求.Clock Management Tiles(CMT)提供了时钟合成(C ...

  4. vim简单使用教程【转】

    vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...

  5. web开发简史与技术选型

    视频地址:http://v.youku.com/v_show/id_XMTQxNzM1MzAwOA==.html?firsttime=0&from=y1.4-2

  6. lua table表判断是否为空

    官方手册里早已经给了答案,那就是靠lua内置的next函数 即如此用: a = {} if next(a) == nil then next其实就是pairs遍历table时用来取下一个内容的函数. ...

  7. sprd测试系统跑vts

    android 8.1版本上google新增vts测试,主要针对测试vendor接口, 在sprd ctest系统中,需要注意: 1. 以同一个账号登录ctest远程站点,和本地ctest客户端 2. ...

  8. OrCAD Capture CIS 16.6 将版本16.6的设计文件另存为版本16.2的设计文件

    操作系统:Windows 10 x64 工具1:OrCAD Capture CIS 16.6-S062 (v16-6-112FF) 启动OrCAD Capture CIS,打开.dsn设计文件,右击该 ...

  9. html表单通过关联数组向php后台传多条数据并遍历输出

    通过表单向php后台传多条数据,以关联数组方式呈现,废话不多说,代码附上: html表单代码,方式我设置为get: <form action="php/cart.php" m ...

  10. AtCoder Grand Contest 030 (AGC030) C - Coloring Torus 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/AGC030C.html 题解 才发现当时是被题意杀了. 当时理解的题意是“对于任意的 (i,j) ,颜色 i 和 ...