oo 第一单元总结

摘要

第一单元共三次作业

第一次作业为简单多项式导函数求解

第二次作业增加三角函数求导嵌套

第三次作业增加在三角函数内部嵌套因子合法性判断

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

第一次作业

设计思路:

​ 第一作业主要完成幂函数(a*x**b)和常数组合的简单求导,总体而言设计起来比较容易。

本次作业的思路:

​ 读入表达式,对表达式进行简化。根据符号将表达式进行拆分成项的形式。利用正则表达式对项中进行解析,分成系数和指数,存入Hashmap中,其中系数为value,指数为key,利用Hashmap进行同类项合并。

​ 可能的优化:合并同类项,将正项放在前面。

结构分析:

  • 规模分析

image

本次作业共分为三个类,分别为:Mainclass,Poly,Polyanalaysis。

总体而言,整体的代码量不是很大,输出toString方法的代码设计存在较多的if-else判断导致方法长度过长。

  • 度量分析

    方法度量:
    image

    其中复杂度较高的是输出求导结果和解析幂函数的方法。

    类度量:
    image

    其中复杂度较高的是解析表达式的类。

  • 类图及分析

    第一次作业类图
    image

    设计分析:设计Mainclass类时考虑到输入的表达式中会存在空格和多个符号,这样对后期的表达式解析造成不便,所以设置simple方法进行简化。在进行简化后,考虑到需要对幂函数进行求导,所以需要拆分表达式,并进行存储;进而需要对项进行解析,所以设计Polyanalysis类,主要用正则表达式和String类中的方法,将系数和指数分离出来。设计Poly类用来存储幂函数的指数和系数,考虑到需要进行合并同类项,所以将其存储为Hashmap,并进行求导输出。

  • 优缺点分析

    优点:按照该思路可以完成题目要求。

    缺点:

    1、由于第一次作业较为简单,此次作业基本沿用面向过程的思考方式,不利于后期扩展。

    2、在最初设计时一些特殊情况考虑的略有欠缺,所以在之后的debug过程中对代码进行修改,导致代码的整体阅读效果欠佳。

第二次作业

设计思路:

​ 第二次作业相比于第一次作业跨度较大,主要难点为解决表达式因子嵌套问题。为了处理此问题本次设计较第一次作业做了较大改动。

本次作业的思路:

​ 首先对输入的表达式进行简化和拆分(利用符号和括号),方法大致与作业一相同。此次作业并没有采用表达式树,递归下降的方法,而是充分利用了多态和类之间的继承关系。设置Factor类表示因子,在Factor类下设置Power(幂函数),Sin,Cos,Constant(常数)四个子类;Poly类表示表达式,Item类表示项,设置All类表示上述类别的父类。类之间的继承关系如下图所示:
image

​ 在每一类中实现了求导输出方法,并实现方法判断拆分出的字符串所属类别,进行进一步创建相应类的对象。

结构分析:

  • 规模分析

    本次作业中设计了9个类,主要是Item类代码量较大,主要是其中的求导方法和分类方法的复杂度较大。
    image

  • 度量分析

    类度量
    image

    其中复杂度较高的是主函数和Item类。

  • 类图及分析

    第二次作业类图

    image

    设计分析:由于第三次作业与第二次作业的架构和方法基本相同,所以具体分析见第三次作业。

第三次作业

设计思路:

​ 第三次作业在第二次作业的基础上并不需要做较多变动,只需对三角函数类进行改动,使其支持因子嵌套求导。增加合法性判断,同时需要注意求导结果的合法性。

本次作业的思路:

​ 总体沿用第二次作业的架构,在第二次作业的基础上,修改三角函数类,增添三角函数内因子属性,并修改三角函数类中的求导方法。对于合法性判断,主要分为两个部分,在首次读入表达式之后,利用正则表达式进行初步的合法性判断。某些非合法的形式需要随着表达式的一步步解析在类的内部进行判断。

结构分析:

  • 规模分析

    本次作业共建了9个类,其中Poly类和Item类的代码量较大。
    image

  • 度量分析

    类度量
    image

    其中复杂度较高的是主函数和Item类,主类中的判断合法性方法的复杂度较高,Item中进行解析的方法的复杂度较高。

  • 类图及分析

    第三次作业类图:
    image

    设计分析:

    Mainclass:主要完成输入表达式的化简和合法性判断。

    image

    Poly:主要完成表达式的存储、解析、分类,并实现表达式层面的求导输出。

    image

    Item:主要完成项的存储、解析、分类,并乘积项的求导输出。

    image

    Factor:继承Derivable接口的抽象类。

    image

    Cos:余弦函数类,继承Factor类,设置cosinner属性用于因子嵌套,完成余弦函数的求导。

    image

    Sin:正弦函数类,继承Factor类,设置sininner属性用于因子嵌套,完成正弦函数的求导。

    image

    Constant:常数类,继承Factor类,用于常数的求导。

    image

    Power:幂函数类,继承Factor类,用于幂函数的求导。

    image

    Derivable:求导接口。

    image

  • 优缺点分析

    优点:本次作业充分利用了类之间的继承关系,层次关系较为清晰。

    缺点:此方法对于求导后的结果进行优化并不方便,需要对求导后的字符串进行处理,较为困难并且出现bug的几率较大。此外本次设计中没有使用工厂方法,而造成了代码冗余,可以利用工厂模型进行批量处理,缩减代码。

2、Bug总结

​ 在作业中出现的bug是一些情况没有考虑到,还有就是错误格式的判断不全,在强测中出现了bug。

3、重构经历总结

​ 第二次作业与第一次作业相比较是一个全新的构建方式,改变了第一次作业基本面向过程的设计思路,设置了继承和借口。第三次作业是对第二次作业的延续,没有进行重构。

4、心得体会

​ 本单元的作业在学习的过程中逐渐学到了很多oo的思想。在完成作业的过程中,作业的构思和思考的过程比较辛苦,需要想清楚期间的逻辑关系。尽管完成的过程艰辛,遇到了一些困难,但是也收获到了很多知识。

posted @ 2021-03-26 22:32  祎yi  阅读(102)  评论(2)    收藏  举报