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]第一次博客作业
第一次作业 第一次进行面向对象的编程,不论是针对数据设计类还是对方法进行合适的归于不同类中,都不是很熟悉.所写出来的程序还是面向过程+有函数的类(虽然现在很大程度上感觉起来也是这样).索性作业难度并不 ...
随机推荐
- Ubuntu14.04和16.04官方默认更新源sources.list和第三方源推荐(干货!)
不多说,直接上干货! 写在前面:笔者由于还在学校学习,学校没有开发给Linux用的上网客户端,所以只能用在windows系统中通过安装虚拟机运行linux比较方便,但没有外网,只有学校的教育网,所以我 ...
- Spark环境搭建(一)-----------HDFS分布式文件系统搭建
下载的压缩文件放在~/software/ 解压安装在~/app/ 一:分布式文件系统搭建HDFS 1,下载Hadoop HDFS环境搭建 使用版本:hadoop-2.6.0-cdh5.7. ...
- git Disconnected:No supported authentication methods available问题解决
在本地克隆gitlab上的项目,报如下错误:Disconnected:No supported authentication methods available(server sent:publick ...
- C_使用clock()函数获取程序执行时间
clock():捕捉从程序开始运行到clock()被调用时所耗费的时间.这个时间单位是clock tick ,即“时钟打点”. 常数CLK_TCK:机器时钟每秒所走的时钟打点数. #include & ...
- Array,prototype.concat.apply与[].conat.apply.
一直都知道JS数组Array内置对象有一个concat方法,但是也没怎么研究过,今天偶然就看了看 concat是连接一个或多个数组 返回的是连接后数组的一个副本 var oldArr=[]; var ...
- __x__(12)0906第三天__<meta>标签
<meta name=" " content=" " />标签常用功能: 指定浏览器对当前页面的字符集: <!doctype html> ...
- Node.js_ express.Router 路由器_模块化管理路由
路由器 express.Router 路由器 模块化管理 路由 基本使用: 路由模块 1. 引入 express const express = require('express'); 其他相关模块 ...
- Go语言基础之map
Go语言基础之map Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现. map map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能 ...
- 循环结构while
Note:高能:语句结构都是由关键字开头,用冒号结束! 一:语句结构 while 判断条件: 语句 二:基本规则 (1)使用缩进来划分语句块,相同缩进数的语句在一 ...
- DevExpress GridControl复合表头(多行表头)设置
关于DevExpress.XtraGrid的复合表头或多行表头的示例,界面如下图所示 1.首先要把DevExpress的GridControl转换为BandedGridView 2.设置显示列及绑定的 ...