面向对象程序设计第一单元总结

一、基于度量的程序结构分析

基于度量的程序结构分析,主要运用IntelliJ里面自带的Diagram功能生成类关系图,以及Metrics插件进行复杂度分析。

其中复杂度分析相关指标含义如下:

Complexity Metrics(复杂度分析)

这部分我们需要使用的主要是方法的复杂度分析。

方法的复杂度分析主要基于循环复杂度的计算。循环复杂度是一种表示程序复杂度的软件度量,由程序流程图中的“基础路径”数量得来。

  1. ev(G):即Essentail Complexity,用来表示一个方法的结构化程度,范围在[1,v(G)]之间,值越大则程序的结构越“病态”,其计算过程和图的“缩点”有关。
  2. iv(G):即Design Complexity,用来表示一个方法和他所调用的其他方法的紧密程度,范围也在[1,v(G)]之间,值越大联系越紧密。
  3. v(G):即循环复杂度,可以理解为穷尽程序流程每一条路径所需要的试验次数。

对于类,有OCavgWMC两个项目。

  1. OCavg:类的方法的平均循环复杂度。
  2. WNC:类的方法的总循环复杂度。

Dependency Metrics(依赖度分析)

依赖度分析度量了类之间的依赖程度。有如下几种项目:

  1. Cyclic:指和类直接或间接相互依赖的类的数量。这样的相互依赖可能导致代码难以理解和测试。
  2. Dcy和Dcy:计算了该类直接依赖的类的数量,带表示包括了间接依赖的类。
  3. Dpt和Dpt:计算了直接依赖该类的类的数量,带表示包括了间接依赖的类。

第一次作业

类图:

度量表:

第一次作业仅仅是实现一个幂函数表达式的求导,所以本次作业我仅仅设计了一个幂函数表达式对象包含系数和指数数组,用正则表达式判断输入合法之后,再用正则表达式将每一项匹配构造出来,即可生成表达式对象,正则表达式如下:

String regChkItem = "[\\+\\-]*\\d*\\**[x]*(\\^+[\\+\\-]*\\d*|\\d*)";String regConstant = "[\\+\\-]{0,2}\\d+";String regNumItem = "[\\+\\-]{0,2}\\d+\\*x";String regItem = "[\\+\\-]{0,2}x";String regItemPow = "[\\+\\-]{0,2}x\\^[\\+\\-]?\\d+";String regNumItemPow = "[\\+\\-]{0,2}\\d+\\*x\\^[\\+\\-]?\\d+";
生成对象之后按照求导法则进行求导,以及可以通过扫描合并系数相同的项,在输出的时候正项置于前面,负项置于后面,系数为0或者指数为1或0的情况进行格式省略,以达到优化输出的目的。

优点:生成对象时仅仅记录幂函数最关键的特征:幂数和指数,便于求导、化简缺点:扩展性不强

第二次作业

类图:

度量表:

第二次作业在第一次作业的基础上加入了三角函数sin、cos,沿用第一次作业的思路,发现表达式的每一项都可以表示成a*x^b*sin(x)^c*cos(x)^d的形式,所以提取其最关键的特征系数a、幂指数b、sin指数c、cos指数d即可完成表达式对象的构造。第二次作业本来可以在第一次作业的基础上直接加入sinNum和cosNum数组属性,但为了更具层次性和逻辑性,抽象多了一层Item,使得更为简洁。

此次作业也是用正则表达式提取每一项然后进行构造,正则表达式如下:

 String regItem = "[\\+\\-]{1,2}" +
                    "(([\\+\\-]?\\d+)|" +
                    "(x\\^[\\+\\-]?\\d+)|" +
                    "(x)|" +
                    "((sin|cos)\\(x\\)\\^[\\+\\-]?\\d+)|"
                    +
                    "((sin|cos)\\(x\\))){1}" +
                    "((\\*[\\+\\-]?\\d+)|" +
                    "(\\*x\\^[\\+\\-]?\\d+)|" +
                    "(\\*x)|" +
                    "(\\*(sin|cos)\\(x\\)\\^[\\+\\-]?\\d+)|" +
                    "(\\*(sin|cos)\\(x\\)))*";

提取出来后求导即可,此次作业仍可进行有限度的优化,在输出的时候正项置于前面,负项置于后面,系数为0或者指数为1或0的情况进行格式省略,也可以判断幂指数和三角函数指数相同时,进行同类项合并,但是由于三角函数的特殊性,一些基于三角函数公式的合并的实现会有难度。

优点:提取出表达式的主要特征,方便构造表达式及求导

缺点:提取表达书主要特征的方法对于无嵌套的表达式比较实用,若表达式有嵌套则难以扩展

第三次作业

类图:

度量表:

第三次作业加入三角函数嵌套规则之后,前两次作业的思路难以借用,因为拥有嵌套的情况下,表达式不能用一条式子表示,得调用递归才能识别。笔者一开始尝试构建AST树来进行运算,但是发现一些WRONG FORMAT!的情况难以判断,导致错误的输入也能得出结果,以及对于x*-1或x^-1这种系数或者指数为有符号数的情况笔者未能在有限的时间内想出比较好的解决方法。遂进行代码重构。经分析发现,输入的表达式可以视为每一个乘积项和的形式,而每一个乘积项可以看成每一个单项相乘的形式,而单项可能为常数项、幂函数项、三角函数项以及表达式和三角函数嵌套项,其中表达式和三角函数又可以视为乘积项和的形式,如此便形成了递归嵌套。一开始的思路是先按照和->积->单项->嵌套...的思路将每一项分开形成树的结构存储,再进行求导操作最终返回结果。但是实际在写的过程中,发现这样写的复杂度很高,水平有限,于是就面向过程编程了一波,直接在按层次分开每一项的过程中递归求导返回结果。所以PlusItem MuilIem SingleItem的属性直接置为求导结果,在输入解析表达式的过程中就进行嵌套求导操作,然后一层一层返回结果。

优点:将一般的处理输入--生成对象--求导--输入结果的过程简化成输入--求导--输出结果,实现简单

缺点:面向过程编程,未能体现面向对象的妙处,而且可拓展性不高

二、BUG分析

第一次作业

第二次作业

前两次作业因为正确的表达式可以用正则表达式描述,所以不会出现WRONG FORMAT!误判的情况,在输入正确的情况下,求导也比较容易实现,因此在强测和胡测的过程中没有被发现BUG。

第三次作业

sin( 1)是正确的输入却被误判成WRONG FORMAT! ,原因是在判断sin|cos(+ 1)三角函数内部的带符号数符号和数字有空格的非法输入情况时,判断+-的次次数为0 or 1,导致出错,次数为1即可改正。

这个错误是出现在用正则表达式对错误类型进行判断时,正则表达式填写错误造成的。所谓成也正则,败也正则,第一第二次作业可以用正则表达式描述正确的输入,确实万无一失,但是第三次作业正则表达式无法描述一个表达式的时候,只能用正则表达式来描述单个项,递归下降。在使用正则表示式时不宜将其写得过长,否则会出现一些缺漏或者造成爆栈的风险。

三、互测方法

由于笔者不会使用对拍器进行数据测试,一般在互测的时候,都是先用笔者撰写代码时采用的数据对测试代码进行测试,然后再深入阅读代码理解逻辑结构看是否有BUG。

优点:针对性高

缺点:阅读时间多和阅读难度大

四、总结反思

在构造对象和设计架构的时候,应该首先分析要生成什么对象,以及分析对象的特征和属性,进而得到需要什么方法,才能满足需求。

原文地址:https://www.cnblogs.com/lancevender/p/10591552.html

时间: 2024-10-11 01:54:36

面向对象程序设计第一单元总结的相关文章

Python面向对象程序设计第一弹

类和对象: 定义类: class 类名: 属性 方法 定义类的对象: 类的对象名=类名() 类的属性:分为公有和私有,类似于c++的private和public,私有变量名前面添加__ 构造函数:在创建类的对象的时候,对类进行初始化的函数.(它的功能远不止赋值这么简单,思维不要被局限了) 形式:def __init__(self,其他参数) 语句块 关于其中的self,self代表的是类的实例,代表当前对象的地址.(按照我的逻辑解释,因为类里面的函数作用在类的对象上,那么对象就是自身,用self

2018面向对象程序设计(Java)第一周

2018面向对象程序设计(Java) 第1周学习指导及要求(2018.8.24-2018.9.2)   学习目标 了解课程上课方式及老师教学要求,掌握课程学习必要的软件工具: 简单了解Java特点及历史: 理解JVM.JRE与JDK等概念,学会下载.安装.测试JDK: 掌握PATH.CLASSPATH的系统变量作用并会设置: 掌握命令行编译并运行Java程序的步骤: 掌握Java Application 程序结构特点: 掌握JDK命令行方式下开发运行Java程序的步骤. 初步使用Elipse,学

王艳 201771010127《面向对象程序设计(java)》第一周学习总结

王艳 201771010127<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com JAVA-729 程序设计评测:https://pintia.cn/ JAVA! 代码托管平台:https://github.com/ JAVAWY 中国大学MOOC:https://www.icourse163.org/ JAVASE729 以下回答是或否 是否加入课程班级博客群 是 是否加入课程QQ讨

赵栋 201771010137 《面向对象程序设计(java)》第一周学习总结

<面向对象程序设计(java)>第一周学习总结第一部分:课程准备部分 平台名称 注册账号 博客园:www.cnblogs.com/ https://www.cnblogs.com/zd0421/ 程序设计评测:https://pintia.cn/ [email protected] 代码托管平台:https://github.com/ STPPKJ 中国大学MOOC:https://www.icourse163.org/ 17393165076 以下回答是或否 是否加入课程班级博客群 是 是否

达拉草201771010105《面向对象程序设计(java)》第一周学习总结

达拉草201771010105<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com DLC 程序设计评测:https://pintia.cn/ [email protected] 代码托管平台:https://github.com/ dalacao 中国大学MOOC:https://www.icourse163.org/ 2665087485 以下回答是或否 是否加入课程班级博客群 是

李瑞红 201771010111《面向对象程序设计(java)》第一周学习总结

李瑞红 201771010111<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com 3451487460 程序设计评测:https://pintia.cn/ [email protected] 代码托管平台:https://github.com/ 3451487490 中国大学MOOC:https://www.icourse163.org/ 3451487460 以下回答是或否 是否加

张季跃201771010139《面向对象程序设计(java)》第一周学习总结(改)

张季跃201771010139<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com Tonma 程序设计评测:https://pintia.cn/ [email protected] 代码托管平台:https://github.com/ [email protected] 中国大学MOOC:https://www.icourse163.org/ 1987400371 以下回答是或否 是否

焦旭超201771010109《面向对象程序设计(java)》第一周学习总结

本人学号<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com jccljj 程序设计评测:https://pintia.cn/ [email protected] 代码托管平台:https://github.com/ Jcczits 中国大学MOOC:https://www.icourse163.org/ Jcczits 以下回答是或否 是否加入课程班级博客群 是 是否加入课程QQ讨论群

201771010103 陈亚茹 《面向对象程序设计(java)》第一周学习总结

本人学号<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com https://www.cnblogs.com/980303CYR/ 程序设计评测:https://pintia.cn/ [email protected] 代码托管平台:https://github.com/ 980303 中国大学MOOC:https://www.icourse163.org/ 2519983735 以下回