oo第一次作业
前言:
这是一篇面向对象作业总结,作业内容是对多项式进行求导,一共有三个阶段,具体要求不详述,第一阶段只要求’+’连接coeff*x^pow的形式,第二次支持*连接的幂函数及三角函数,第三次则需要支持括号表达式的嵌套。本想不用编译原理所述表达式树,最后发现做成一团乱麻。
第一次作业
类图如下:
说明:第一次作业比较简易,主要是对新版eclipse和checkstyle的安装和熟悉。词法分析器为Token,可以考虑将其单例化,因为只有一个词法分析器。用Poly存储多项式的系数和幂次,在PolyDif里有着主入口,根据加号拆项,以HashMap<>存入<幂次,系数>,按求导法则进行求导,最终遍历Map以输出结果。
代码度量结果如下:
Bug:不能直接去除所有空格,因为+ 10不算数字。
0不输出,由于大整数0输出时前面没有+,导致我强测三处没过,改正方法就是判断系数是否为0,是则跳过。
还有其他,总的来说,bug存在于词法分析程序以及输出程序,因为其分支比较多。
第一次作业略述如上。
第二次作业
类图如下:
三个Minizer可以不用看,因为不支持括号表达式,所以提取公因式无效
第二次作业也没有什么优化,仅仅是系数合并。构造了一个CompTerm的类,表面一个项由系数、幂次、sin幂次、cos幂次所唯一决定,这种断言有局限性,不宜扩展,但是可以有效合并系数。
Bug: 由于多处抛出异常,所以导致最后异常没有处理,就是没有输出wrong format,但是打印函数堆栈。最终把所有异常都交给了主入口main。
度量结果如下:
这里有一个静态属性,但是不是词法分析程序,他是scanner。而词法分析器被分给了diff主控程序,就是语法分析器,这样造成的问题在第三次作业中有所体现。总之,这个类关系勉强可以应对现有需求。
第三次作业
第三次作业的类构造是有问题的,类图如下:
这个类关系图甚至比上一次还要少了,其中Diff本来是对表达式进行语法分析的一个类,它内嵌了一个词法分析器,还有两个字符串,一个是输入的表达式,一个是求导后的表达式。而对因子和项进行分析的函数调用了专门负责求导的函数。作为结果,对项和因子进行分析的两个函数getTerm和getFactor,都是用两个字符串作为返回值的,一个意味着分析到了什么样的串,一个是求导后的结果。然而我直接用Diff类本身作为其中方法getTerm和getFactor的返回值,让Diff类的功能比较模糊。Sin和cos又继承了Diff类,意味着创造它们的实例就可以得到Sin(…)和其求导结果。然而这样做使得词法分析器进行了复制和分裂,就不再是全局的词法分析器了,这样一方面占用额外内存,还会导致各个词法分析器处理到的位置是不同步的,这里有很多bug,而这样仅仅是让Sin可以独立分析其自身表达式。最后在优化时,由于Diff功能太过耦合,所以Optm不能再继承Diff,而是另外完成了一个语法分析器,代码多有类似。
问题的本质就是不想用全局变量,可以说所有类的实例都是临时开的,然后通过字符串进行互相传递,没有抽象出表达式树。可以开两个静态变量,就是词法分析器和表达式树的根节点,而不是完全依赖与语言递归的特性进行字符串处理。
度量结果如下:
可以看出,代码规模并不比第二次大多少,这是因为删了第二次中的许多额外功能。
圈复杂度还是过高,3.171,就是分支数太多,这不oo,按照树的方式重构,然后节点实现统一的接口,也许可以降圈复杂度。方法数有72个,这是因为里面大量的都是get和set方法,不能有protected就只能这样进行同步。静态方法还可以再减少,因为那3个方法只是给main用的。Static方法不是不能用,单例模式就要用,但是也不能专门造一个类把所有的方法都设置成static的了,这是底线。想尽量减少static,就发现所有容器都是函数里的临时变量。Static还是要适中。
Bug: 由于用的是字符串进行传递,所以老是会出现括号存去问题。对于(++sin(x))这样的,去括号后是++sin(x),逐层求导后发现是++cos(x),返回时又要去括号,则会出现…*++cos(x)这样的错误串。解决方案是写了个while去掉前导符号。
还有一些bug诸如词法分析器同步时尾部空格数不一样导致偏移值不同,这种bug太细节了,就不多赘述了。
这些bug产生的规律都是由于字符串没有抽象成语法树所造成的。
设计模式
可以考虑工厂模式,因为每次创造Diff或Sin或Cos或Poly或Optm的时候,都只是为其词法分析器赋值,没有牵涉到求导的情况。又不好把求导直接写进构造器,所以可以用工厂方法,制造一个工厂,产生实例的同时执行其特征操作。工厂应当使用静态方法。
总结
还是不能直接把字符串作为内部表示。内部数据的管理应当抽象出来。
oo第一次作业的更多相关文章
- OO第一次作业总结
OO第一次学习总结 1.第一次作业:多项式加法 从未接触过java的我,在从输入输出开始学了几天后,按照C语言的思路,写出了一个与面向过程极其接近的程序. 在这个程序中,存在两个类:一个是Comput ...
- 从入门到不放弃——OO第一次作业总结
写在最前面: 我是一个这学期之前从未接触过java的小白,对面向对象的理解可能也只是停留在大一python讲过几节课的面向对象.幸运的是,可能由于前三次作业难度还是较低,并未给我造成太大的困难,接下来 ...
- OO第一次博客作业
OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...
- OO第一次博客作业--第一单元总结
OO第一单元总结 面向对象设计与构造的第一单元,对“面向对象”的概念还根本不理解不熟悉,只觉得需要“分模块”,但不知道怎么分,分多少模块,怎么根据需要的模块的功能建立类.学习的进度又太慢,根本跟不上出 ...
- oo 第一次博客作业
oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...
- 2018 OO第一次总结(作业1-3)
第一次作业1.程序分析 (1)OO度量 (2)类图: (3)分析与评价: 这次作业由于作业整体设计难度不大,因此按照去年暑假上的OO先导课老师讲的设计方法很容易实现一个还不错的面向对象式程序,类与类之 ...
- OO第一次总结作业
第一次OO博客作业 前言 面向对象课程已经经过了4周的时间.前三次作业全部是关于多项式求导的相关内容,内容由易到难,同时我也开始逐渐深入感受学习面向对象的各项特征,逐渐将自己的编程风格从C向真正的面向 ...
- OO第一次博客作业总结反思
使用了masteruml插件来生成类图和metrics插件分析代码 第一次作业 1.UML类图 >在第一次作业中,使用了两个类,代码中有没有使用的变量与函数,为平衡两个类的内容,我将输出函数放在 ...
- OO第一次博客作业(第一单元总结)
Q:菜是绿的,鸡是黄的,那菜鸡是什么颜色的? A:红的,强测全WA了,能不红么. 菜不菜的问题先不说了,认真研究一下这次的题目,以及WA的原因吧. 程序结构简析 三次实验的核心结构都是差不多 第一次的 ...
随机推荐
- python可视化pyecharts
python可视化pyecharts 简单介绍 pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 JS 库.用 Echarts 生成的图可视化 ...
- 《团队作业第二周》五小福团队作业——UNO
<团队作业第二周>五小福团队作业--UNO 一.修改完善上周提交的需求规格说明书 THE FIRST改变 首先:我们组的博客无小组分工及占比,这是第一个问题,当时我们在写博客的时候由于很多 ...
- randint模块无法加载
原因:把程序文件名命名为 random.py 导致 random.randint 加载的是这个文件的模块
- HDU 3949 XOR [线性基|高斯消元]
目录 题目链接 题解 代码 题目链接 HDU 3949 XOR 题解 hdu3949XOR 搞死消元找到一组线性无关组 消出对角矩阵后 对于k二进制拆分 对于每列只有有一个1的,显然可以用k的二进制数 ...
- 什么是 B 树?
本文提到的「B-树」,就是「B树」,都是 B-tree 的翻译,里面不是减号-,是连接符-.因为有人把 B-tree 翻成 「B-树」,让人以为「B树」和「B-树」是两种树,实际上两者就是同一种树. ...
- HTML4入门
这篇来介绍下超链接和网站架构,做好准备要开始了! 超链接:从一个文档链接到另一个文档,也可以式文档的指定部分及文档内跳转,也俗称设置锚点:点击超链接将使网络浏览器跳转到另一个网址.url可以指向HTM ...
- __x__(10)0906第三天__字符实体(转义字符)
实体:也叫转义字符,在网页中,一些类似“大于号”和“小于号”这样的字符,无法直接使用,需要用特殊的字符串来表示. 实体语法: “&实体名字;” 或者 “&实体编号;” 注意: 最好使用 ...
- [LeetCode] Design Circular Deque 设计环形双向队列
Design your implementation of the circular double-ended queue (deque). Your implementation should su ...
- Java课程寒假之开发记账本软件(Android版)之一
一.选择编译软件 最终选择了目前较为流行的Android Studio,网上的评价都比较偏向于好评. 安装的过程还算比较正常,没有什么太大的波折,解压安装虽然直接,但对于我这种每次装编译软件都有形形色 ...
- 6.3 Pandora 实操 - 数据立方
简介 数据立方是适用于大规模实时数据(每天百亿条,10TB+ 级别数据)查询与分析的数据库系统,提供交互式的访问数据的能力,支持数据过滤.分组.聚合,实现亚秒级以内对亿行级别的数据表进行多维探索分析. ...