ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

oo第一单元总结

2019-03-25 21:40:10  阅读:257  来源: 互联网

标签:oo 总结 结点 主类 作业 幂函数 表达式 求导 单元


本次博客总结中,我使用了intellij的UML自动生成了类图,并利用了 DesigniteJava 对我的代码进行了分析,其中 DesigniteJava 分析结果的各项含义分别为:

一、第一次作业

第一次作业是对简单多项式求导,表达式中只包含了基本的幂函数。对于第一次的作业,我建立了一个名为Poly的类,用于表示一个幂函数(属性包含了幂函数的系数与指数),在类中实现了对该幂函数的求导方法。在主类中我建立了一个动态链表,用于存储表达式以及求导后的结果,然后再主类中实现了对输入的合法化判断(用正则表达式对每一项进行判断)以及求导,最后将结果输出。关于第一次作业的分析结果入下:

1、基于度量分析程序结构

(1)methodMetrics

(2)typeMetrics

 (3)类图

2、本次作业优缺点

优点:思路很简单,写起来比较快

缺点:并没有面向对象的思维,整个程序的实现还是用的c语言的思路,而且整个主类太大了,并没有进行进一步的拆分。

 

 二、第二次作业

第二次作业在第一次作业的基础上加入了三角函数的求导,但三角函数和幂函数是彼此分离的,也就是说只是增加了一种因子类型而已。因此我的做法与上次作业类似,不过考虑到不同因子的求导方式不同,以及求导结果的合并问题,我建立了名为Item的类,里面包含了x、sinx、cosx的次数以及整项的系数。然后在ItemDer类中完成了求导功能,最后在主类Derivation中完成输入合法化的检测(用正则表达式对每一项进行判断)以及求导和输出的功能。也就是说第二次作业实质上就是在第一次作业上的简单扩展。关于第二次作业的分析结果如下:

1、基于度量分析程序结构

(1)methodMetrics

 

(2)typeMetrics

 

(3)类图

2、本次作业优缺点

优点:建立的Item项由于将x、sinx、cosx均包含了进去,在求导合并阶段非常好执行,整体思路和第一次代码一致,简单清晰。

缺点:代码的作用较为局限,只够支持将出现不同的独立函数放入表达式中进行计算而不会对程序改动较大,但对于嵌套类型的表达式无能为力。

 

 三、第三次作业

第三次作业引入了嵌套因子和表达式因子,整体架构与前两次相比完全改变。在本次作业中,我将整个表达式建立成为了一棵树的形式,子结点均为基本因子(整数、幂函数、无嵌套三角函数),中间结点为某种运算(加、减、乘、嵌套)。建立了一个名为Node的类,里面的属性包括了结点类型(加、减、乘、嵌套、基本因子)、左右结点以及Node结点对应的表达式。子结点与中间结点均从父结点继承,一共形成了8个子类,每个子类有自己的求导方式。在主类读入表达式后,通过调用expression、term、factor三个方法,自上而下构造表达式树。最后通过对根结点调用求导方法完成对整个表达式的求导,继而输出求导结果。关于第三次作业的分析结果如下:

1、基于度量分析程序结构

(1)methodMetrics

(2)typeMetrics

(3)类图

2、本次作业优缺点

优点:建立了很多个子类,每个类的长度都不是很长,这一点比起前两次作业都有所进步。构造树和对树求导的部分完全隔离,主类的功能实现很简单。

缺点:每个结点的求导结果都是以字符串的形式返回,中间结点的求导结果只是左右结点的简单拼接,基本没有化简。

 

四、三次作业的程序设计总结分析

1、输入合法化检测:这三次作业中,题目共有的问题就是关于空格位置的正确性判断。在第一次作业中我是将空格写在了正则表达式中,不得不说这种方法真的非常蠢,导致我的正则表达式很长,在匹配成功后还要再去掉空格,显得比较繁琐。于是第二三次作业我就采用了先将读入的表达式去掉空格再进行匹配的方式,即事先将空格位置错误的情况罗列出来,然后对字符串进行匹配,若出现这种情况则直接报错。

2、求导功能的实现:前两次作业的求导都是类似的,我都是建立了一个类,属性即为出现的函数的次数或系数(如x的指数、sinx的指数、cosx的指数),然后在主类中建立一个动态链表,链表中的每一项用于存储表达式中的一项,对表达式分析完成后依次对链表中各项进行求导并合并同类项,最后输出链表中的结果。第三次作业采用了和前两次完全不同的架构,对不同的因子以及计算方式建立不同的类,并完成了对不同类的求导方法,将表达式构建成一个棵树,再对根节点求导,从而完成了对整棵树的求导。结束了三次作业后才意识到如果一开始就用构建树的方法,那每次作业的改动就不会那么大,也不用每次都那么可怜的重写了。

 

五、使用对象创建模式

在第三次作业中,我创建了一个父类Node,并创建了几个继承父类的子类。如下图所示:

每个类都有一个公共的功能——求导。第三次作业中的思路是构造一棵表达式树,每个Node都具有左右结点两个属性。在了解了工厂模式后,我认为可以改进为定义一个名为der的接口,里面的方法是求导。这些子类都是der接口的实现类,可以单独建立一个factory类,在里面实现创建这些子类的对象的方法,即通过传入的参数来判断要创建一个什么类的对象,并返回为Node类型。则通过这种方式可以方便的创建不同子类的对象。

 

标签:oo,总结,结点,主类,作业,幂函数,表达式,求导,单元
来源: https://www.cnblogs.com/gracciechou/p/10584816.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有