OO_多项式求导_单元总结
概述:
面向对象第一单元的作业是三次难度依次递增的多项式求导。第一次作业是仅包含带符号整数和幂函数的多项式求导,例如:-1+xˆ233-xˆ06;第二次是在前面的基础上增加了三角函数的求导,例如:-1+xˆ233*xˆ06-sin(x)*3*cos(x);第三次是增加了嵌套函数的求导,例如:(-1+xˆ233)*sin(xˆ2)ˆ06-cos(sin(x))*3。经过三次的求导训练,我学会了正则表达式的用法、Java内大数运算、对象与类、继承与多态、异常捕获、利用checkstyle检查并规范自己的代码等。
一、基于度量分析自己的程序结构
1、类图
三次作业难度递增,类图的结构复杂度递增。前两次作业的项以及项求出来的导数具有相同的格式,故整体可划分为从输入串中读取项、求项的导数两大块内容。第三次作业复杂一些,采用了边读项边求导的方法。
1.1 第一次作业类图

第一次作业结构相对简单,共分了CalculateDerivatives(计算每个项的导数)和ExtractCoefAndIndex(提取出每个项的指数和系数)两个类。写这次作业的代码时,刚开始接触java,代码中有很大部分还是过程式程序的写法,而且类的定义也不是很合理。总的来说,第一次作业并没有写出一个面向对象式程序应有的框架,很失败。
1.2 第二次作业类图

第二次作业分成了Term项类和Expression表达式类(其中包含Main函数),通过这次作业学会了重写hashcode和equals等,但是代码中有很大的冗余,主要是自己构思的时候没有考虑清楚。而且,这次的代码只能为这次的作业服务,可扩展几乎为零。一旦更改要求,代码可能就要全部重写。
1.3 第三次作业类图

第三次作业中涉及嵌套,结构相对复杂。分为常数类、三角函数类(包含嵌套)、乘类、加类、幂函数类五个类,通过接口返回每个类中的因子的数值和求导结果,整个代码运行过程中相当于从上到下生成一棵树,然后从下到上返回值和导数。这次的代码相比较前两次,整体可扩展性强,结构清晰。但是,我是用String类型返回的值和导数,这就使得项中的一些特点被抹去了,很难合并同类项、做相关的优化。所以,这次作业只能保证正确性,可优化性几乎为零。
2、利用MetricsReloaded插件的度量结果
根据博客https://www.cnblogs.com/panxuchen/p/8689287.html安装并使用了该插件,运行结果如下:
2.1第一次作业度量结果

2.2第二次作业度量结果

2.3第三次作业度量结果

ev(G)基本复杂度是用来衡量程序非结构化程度的,数值越高意味着非结构化程度高,难以模块化和维护。
Iv(G)模块设计复杂度是用来衡量模块判定结构,即模块和其他模块的调用关系。数值越高意味着耦合度越高。
v(G)是用来衡量一个模块判定结构的复杂程度,数值越大说明程序代码可能质量低且难于测试和维护。
根据以上三个值判断,我的程序的高内聚低耦合度很差。主要原因是我的代码中类之间的层次没有分清,各个类之间的独立性较强,相互调用的少,没有区分好过程式程序和面向对象式程序。之后的实验中,我应该在代码的框架构思上多花些时间。
二、分析自己程序的bug
第一次作业的bug,主要是没有处理1*x的情况,之后将输出字符串单独处理,把1*消除。
第二次作业的bug,是因为程序的鲁棒性差,没有判断是否hasnextline(),导致程序在没有输入的情况下调用了String.nextline()函数,报错。
第三次作业的bug,是因为加括号的问题。有些地方必须要加括号,否则在特定的情况下会出错,例如sin(x+x)应该写成sin((x+x))。
bug的存在主要是因为设计的时候没有考虑到整体性,没有想好细节就开始写代码,导致debug之路漫长。
三、分析自己发现别人程序bug所采用的策略bug
1、自己构造比较全面的测试样例
在第一次作业中,正确的输入和错误的输入的种类相对较少,可以实现全覆盖的测试;第二次作业兼容了第一次作业,故可以用第一次的测试程序来测第二次的代码,之后将第一次的测试样例中的 x 换成 cos(x) 或 sin(x) 继续测试;第三次的作业情况较多,很难全部覆盖的测试,可以根据自己的代码特点,每个分支写一个测试样例,保证覆盖测试自己代码的全部分支。
2、与同学交流
多多查看讨论区,学习下大佬们的思路和方法,避免踩大佬们踩过的坑;可以和周围同学多多交流,相互找bug。
3、写代码的时候保持脑子清醒
要在大脑十分清醒的情况下写代码,不然会出现很多的眼高手低的笔误,增加了debug时间。
三、Applying Creational Pattern
结合三次作业的要求,如果重构,我选择用工厂模式。
将输入串分解成一个一个的因子,之后利用工厂模式建立一个一个的因子类,每类中单独求导并返回求导结果。

四、总结与反思
这三次作业给我的经验教训是,一定要先学,然后再写,不然很容易造轮子。想好整体的思路之后再动笔写代码,不要急于求成,不然,会像我的第一次作业一样写出很多冗余的代码。
OO_多项式求导_单元总结的更多相关文章
- OO_JAVA_表达式求导_单元总结
OO_JAVA_表达式求导_单元总结 这里引用个链接,是我写的另一份博客,讲的是设计层面的问题,下面主要是对自己代码的单元总结. 程序分析 (1)基于度量来分析自己的程序结构 第一次作业 程序结构大致 ...
- OO第一单元总结-多项式求导
OO第一单元总结-多项式求导 一.第一.第二次作业总结 因为前两次作业设计复杂度差别不大,因而放在这里统一总结. 基于度量分析程序结构: 前两次作业确实存在缺乏可拓展设计的构想,基本还是面向过程的思维 ...
- BUAA_OO Summary——多项式求导问题
从C.DS.计组一路折磨过来, 几乎都在采用过程化.函数式的编程思想.初接触面向对象的项目开发,经过了三周的对多项式求导问题的迭代开发,经历了设计.coding.测评环节,算是对面向对象有了一定的认识 ...
- 多项式求导系列——OO Unit1分析和总结
一.摘要 本文是BUAA OO课程Unit1在课程讲授.三次作业完成.自测和互测时发现的问题,以及倾听别人的思路分享所引起个人的一些思考的总结性博客.本文第二部分介绍三次作业的设计思路,主要以类图的形 ...
- OO第一单元总结——多项式求导
第一次作业分析 1.程序结构分析 类图: 好吧,这一次基本上完全是在面向过程编程,没有看出来任何的面向对象的特性. 复杂度: 可以看到模块间的相互耦合度很高,PolyDerive方法的非结构化程度也不 ...
- OO第一单元总结__多项式求导问题
作业一.含幂函数的简单多项式的求导 (1)基于度量的程序结构分析 1. 统计信息图: 2. 结构信息图: 3. 复杂度分析 基本复杂度(Essential Complexity (ev(G)).模块设 ...
- OO随笔之魔鬼的第一单元——多项式求导
OO是个借助Java交我们面向对象的课,可是萌新们总是喜欢带着面向过程的脑子去写求导,然后就是各种一面(main)到底.各种方法杂糅,然后就是被hack的很惨. 第一次作业:萌新入门面向对象 题目分析 ...
- BUAA_OO_homworkone包含三角函数的多项式求导
第一次作业 基于x的简单多项式相加求导 带符号整数 支持前导0的带符号整数,符号可省略,如: +02.-16>.19260817等. 幂函数 一般形式 由自变量x和指数组成,指数为一个带符号整数 ...
- BUAA-OO-第一单元表达式求导作业总结
figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...
随机推荐
- [org.springframework.context.annotation.ComponentScanBeanDefinitionParser] are only available on JDK 1.5 and higher 问题--MyEclipse设置JDK版本
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML doc ...
- VS2017离线版的SSDT安装包(包括SSIS)
VS2017离线版的SSDT安装包(包括SSIS) 装好SQL2016和VS2017后发现没有创建SSIS项目的接口,原来VS2017里是没有包含SSDT的安装包的. 下面是我整理好的包含中英文的VS ...
- c语言函数参数类似继承的传递
函数的参数如果是一个父结构的指针, 这个结构包含在另一个子结构中, typedef struct test_node_one test_node_one_t; typedef struct test_ ...
- mybatis 映射生成mapper和pojo ---逆向工程的使用过程
使用逆向工程生成mapper和pojo 2. 新建一个项目,随便叫什么 3.导入mybatis-generator-core .mybatis.mybatis-spring.log4j等jar 4.在 ...
- Mac 系统下创建可双击执行文件,cd到执行文件当前目录
在mac下之前我一直用.sh文件,但是要去终端里才能执行,后来得知可以写.command文件,双击及可执行,很方便,特此记录 #!/bin/bash basepath=$(cd `dirname $0 ...
- PHP批量保存图片
关于这个问题网上也有回答,我只是把我在工作中用到的代码分解出来,供需要的朋友使用.以下代码都已经经过测试,所以没有任何问题.有问题请加QQ:1127173874 第一部分 数据库表结构 create ...
- java面试题复习(一)
//基础最重要,如果面试官问一个答不上一个,那有难度的都都不用问了,直接就pass了,就像我,嘿嘿. //每天最好熟记10个问题,这些问题在编程是会很厚帮助,帮你避免很多不应该出现的错误. 一.面向对 ...
- ASP.NET 实现PDF文件下载[转]
本文介绍了一种在ASP.NET中下载文件的方法.方法一:可能是最简单的.最短的方式: 1 Response.ContentType = "application/pdf"; 2 R ...
- jsonp现实跨域Ajax CORS
浏览器有一个很重要的概念——同源策略(Same-Origin Policy).所谓同源是指,域名,协议,端口相同.不同源的客户端脚本(javascript.ActionScript)在没明确授权的情况 ...
- Spring源码分析——源码分析环境搭建
1.在Windows上安装Gradle gradle工具类似于maven,用于项目的构建,此处主要用于构建spring源码,以便我们将spring源码导入eclipse. 开发环境 Java:JDK8 ...