多项式求导
对于多项式计算的认识
-
总体认识
多项式是天然的树形结构,理论上所有的多项式都可以用表达式树表示,而Java中的继承和接口方法可以很轻松的递归嵌套建立一棵表达式树。 -
分阶段认识
- 从ArrayList到HashMap
在第一二次作业中,多项式的形式相对简单
由相加减的项和系数,和项中仅有简单幂次相乘,组合
因而项和幂次为Key,系数为Value的HashMap是组织这种数据最好的数据结构。
而在这次数据结构的转变中,初次接触到了
extend
override
等概念,了解到自定义类的方法,也学习了部分HashMap库。
学习资料记录如下浅谈Java中的hashcode方法 - 从ArrayList到HashMap
//Key
private BigInteger xbasePower = BigInteger.ZERO;
private BigInteger sinPower = BigInteger.ZERO;
private BigInteger cosPower = BigInteger.ZERO;
- 从线性表到表达式树
第三次作业,难度复杂度较前两次大了很多。
表达式中嵌套表达式,之前采用的单分支单一结构的线形表,已经很难解决表达式嵌套表达式的递归结构。
在离散数学、数据结构中,我们学习到“树是天然的递归结构”。
而指导书中的描述,也很清楚的将表达式,描述为分支+层次的结构,因而表达式树是确定需要使用的。
确定了这种数据结构,剩下的就是结构实现的问题了。
通过学习花花大佬的代码,缓慢且艰难的写出这次表达式作业。(对于接口和继承的总结见之后博客)
三次作业代码分析
分析工具
- IDEA 类图
- DesigniteJava
相关标准:- LOC (Lines Of Code – at method and class granularity)
- CC (Cyclomatic Complexity – Method)
- PC (Parameter Count – Method)
- NOF (Number of Fields – Class)
- NOPF (Number of Public Fields – Class)
- NOM (Number of Methods – Class)
- NOPM (Number of Public Methods – Class)
- WMC (Weighted Methods per Class – Class)
- NC (Number of Children – Class)
- DIT (Depth of Inheritance Tree – Class)
- LCOM (Lack of Cohesion in Methods – Class)
- FANIN (Fan-in – Class)
- FANOUT (Fan-out – Class)
第一次作业
-
代码架构--类图分析
-
数据分析
第二次作业
-
代码架构--类图分析
-
数据分析
第三次作业
-
代码架构--类图分析
-
数据分析
三次作业总分析
当我们对基本机制还一无所知的情况下,我们就必须退而求助于统计学。
从类图的复杂度可以看到,三次作业的难度是逐级增长的。
但是从几次数据分析来看,对面向对象的认识也越来越深入。
发现bug与debug
-
自我测试
在读题时,构造出一系列覆盖性小型测试集
借助于shell和python,写出了自动的黑盒测试,也就是随机性大面积测试集 -
互测
- 第一次互测 认真的阅读了对方的代码并学习,发现bug主要集中在正则表达式和输出部分
- 之后两次互测 由于冯如杯等项目原因,没有认真互测,在之后的学习改进
-
Bug修复
Bug主要有两个来源,WRONG FORMAT和优化性能导致问题。- WRONG FORMAT! 对于format问题,思考不充分,而且也不够重视,但是在听了荣老师对WRONG FORMAT造成的航天史上的几次危机之后,在之后的编程中会格外注意,并且加强测试。
- 优化问题,优化之后测试不充分。
关于设计模式的思考
三次作业写完之后,算是把Java语法过了一遍。
看了Neo学长的设计模式全解析
发现可以用工厂思想来生成表达式的各个因子,这一思想期待在之后的作业中学习强化。