前言

  OO第一单元共有三次作业,分别为多项式求导、带有三角函数与幂函数的表达式求导、带有嵌套表达式因子的表达式求导。虽然这三次作业都离不开求导,可是每次作业的复杂度都是大大递增的。对于习惯于面向过程编程的我来说,完成这三次作业是一个不小的挑战。我在各个方面也还存在着诸多问题,借由此次博客,我将回顾一下完成这三次作业的经历,并对代码进行一次详细的分析与总结。


基于度量的程序结构分析

  这里使用了IDEA的Diagram和MetricsReloaded工具辅助分析。工具里的一些参数说明如下:

  方法与类的复杂度分析(Complexity Metrics)

  1、方法

  (1)、ev(G):即Essential Complexity,用来表示一个方法的结构化程度,范围在[1,v(G)]之间,值越大则程序的结构越”病态“。

  (2)、iv(G):即Design Complexity,用来表示一个方法和他所调用的其他方法的紧密程度,范围在[1,v(G)]之间,值越大联系越紧密。

  (3)、v(G):即循环复杂度,可理解为穷尽程序流程每一条路径所需要的试验次数。

  2、类

  (1)、OCavg:表示类的方法的平均循环复杂度

  (2)、WMC:表示类的方法的总循环复杂度

  类之间的依赖度分析(Dependency Metrics)

  (1)、Cyclic:指和类直接或间接相互依赖的类的数量,这样的相互依赖可能导致代码难以理解和测试

  (2)、Dcy和Dcy*: 计算了该类直接依赖的类的数量,带*表示包括了间接依赖的类。

  (3)、Dpt和Dpt*:计算了直接依赖该类的类的数量,带*表示了包括了间接依赖的类

第一次作业

  

  

  

  

  可以看到,在第一次作业中,ev(G)和v(G)都比较高,主要是因为第一次作业我没有用大正则直接进行匹配,而是采用了特判的方法,将所以可能的格式错误判断出来,由于要进行多次判断,因而复杂度较高。这种特判的方法构成的代码可拓展性较差,而且非常容易漏掉某些情况导致BUG,因此在之后的作业中我舍弃了这个方法。

第二次作业

  

  

  

  

  第二次作业的情况较第一次来说要好了许多,但是Input.isLegal()等方法的ev(G)依然很高,主要是因为这些方法中采用了较多层的if-else结构或者for循环,而且高耦合的问题依然存在

第三次作业

  

  

  

  

  可以看出,第三次作业的设计非常糟糕,主要是未能好好考虑代码架构问题。我只是为了能够完成测试而写代码,而没有充分考虑代码的层次与结构问题,这导致每个类的规模较大,实现的方法数量较多,类的复杂度也较高,这样的代码难以进行维护和扩展,我也未能灵活使用继承和接口来实现,这是此次作业的不足之处。

  根据以上三次作业的代码分析结果,我的代码编写受着面向过程思想的影响较深,没有应用到面向对象的一些思想,例如继承和接口等。此外,从代码的组织上来看,每一次作业我基本上都是直接重构,很少用到了源代码,这也体现我的代码可拓展性较差。希望在以后的作业中加以改进。

分析自己程序的bug

第一次作业

  第一次作业的BUG主要在于对JAVA一些String类的方法不熟悉导致的。例如String.split()方法,当分隔符在字符串开头时,所得字符串数组第0项为空字符串,当分隔符在字符串末尾时,所得字符串数组最后一项却不是空字符串。由于对方法不熟悉,导致我未能正确判断处于字符串末尾的分隔符,导致BUG

第三次作业

  第三次作业的BUG在于正则表达式,在编写正则表达式时,忽略了表达式因子括号前可以存在2个运算符的情况,从而导致类似+ - (EXP)形式的输入会被判定为WRONG FORMAT

找他人的bug

  第一次作业由于代码量较少,阅读起来比较简单,我秉着学习的目的去阅读了他人的代码,同时思考他人的设计思路等等,通过这样我找出了一些不容易被查出的BUG。同时,我自己编造了一些较为刁钻的数据,也可以找出不少人的BUG

  在后两次作业中,我主要是通过观察代码的架构,例如对方设计了什么类,来实现什么样的功能,由此编造一些在实现过程中可能出现的边界情况,由此寻找BUG

Applying Creational Pattern

  在第一次作业中,我直接把整个表达式作为一个类进行求导

  在第二次作业中,我把一个表达式类又进行了细分,即一个表达式类由若干个项类构成,而项类又由若干个因子类构成,通过对因子求导,实现项的求导,通过项的求导,实现表达式的求导

  在第三次作业中,我同样采用了第二次作业的结构,只是由于表达式因子的存在,我先将表达式因子都替换为一个(exp)因子,再进行正则表达式匹配替换后的表达式是否满足条件,同时通过递归,判断被替换的表达式因子内部是否满足表达式,通过这种方式实现了表达式的合法性判断及求导

2019_BUAAOO_第一单元总结的更多相关文章

  1. OO第一单元作业小结

    前言 第一单元的主题是表达式求导,第一次作业是只带有常数和幂函数的求导,第二次作业加入了正余弦函数,第三次作业又加入了表达式嵌套,难度逐渐提升.总体来说前两次作业还易于应对,而第三次作业做得相对有些艰 ...

  2. BUAA面向对象设计与构造——第一单元总结

    BUAA面向对象设计与构造——第一单元总结 第一阶段:只支持一元多项式的表达式求导 1. 程序结构 由于是第一次接触面向对象的编程,加之题目要求不算复杂,我在第一次作业中并没有很好利用面向对象的特点, ...

  3. OO第一单元作业总结

    oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...

  4. OO第一单元总结

    OO第一单元作业总结 一.前言 开学四周,不知不觉已经做了三次OO作业.事实上,每一次作业对我来说都是很大的挑战,需要花费大量的时间和精力来学习. 虽然学得很艰苦,但最后还是连滚带爬地完成了.(好惨一 ...

  5. OO第一次博客作业--第一单元总结

    OO第一单元总结 面向对象设计与构造的第一单元,对“面向对象”的概念还根本不理解不熟悉,只觉得需要“分模块”,但不知道怎么分,分多少模块,怎么根据需要的模块的功能建立类.学习的进度又太慢,根本跟不上出 ...

  6. OO第一单元总结(表达式求导)

    写在前边:第一次接触面向对象语言,编程思想仍然不可避免的有以前面向过程的影子.从第一次作业的完全面向过程,到第二次学会剥离各个类互不影响到第三次作业的先构思面向对象的基本程序架构再编程.虽然程序有些地 ...

  7. OO第一单元优化博客

    OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)​\)和\(cos(x)​\)的指数作为坐标,在图上画出来就可 ...

  8. 【BUAA-OO】第一单元作业总结

    #OO第一单元作业总结 #确认存活,爱学习,爱北航,爱OO 一.三次作业分析 1.第一次作业 1.1 程序结构 对方法的度量: 类的内聚和相互间的耦合情况: 类图: 优缺点: 优点大概没什么优点,毕竟 ...

  9. OO面向对象第一单元总结

    OO面向对象第一单元总结(表达式求导) 写在前面: 魔鬼课程oo第一单元终于结束,当终究要落笔总结,竟不知从何写起…… 回首再去看第一次的作业,你会满足于那时的幸福,或许,这就是成长吧! 千言万语,一 ...

随机推荐

  1. bently addin 二次开发学习

    元素结构: 一些基本元素的添加与绘制: class CreateElement { public static void LineAndLineString() { Application app = ...

  2. 【medium】78. Subsets

    求集合不重复的子集: 下面python的写法很好啊! class Solution(object): def subsets(self, nums): """ :type ...

  3. Java数据类型与运算符

    Java 基本数据类型 Java 的两大数据类型: 内置数据类型 引用数据类型 内置数据类型 Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. b ...

  4. STM32的定时器定时时间计算(计数时间和中断定时时间)

    时基单元 可编程高级控制定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器.这个计数器可以向上计数.向下计数或者向上向下双向计数.此计数器时钟由预分频器分频得到. 计数器.自动装载寄存器和预 ...

  5. 2018-2019-2 网络对抗技术 20165206 Exp3 免杀原理与实践

    - 2018-2019-2 网络对抗技术 20165206 Exp3 免杀原理与实践 - 实验任务 1 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己 ...

  6. UWP 调用Win32 关机

    话说最近程序需要个晚上自动关机的功能 原则上 uwp 应该是没有关机权限的 上网搜索之 有人说只要这样就可以了 var psi = new ProcessStartInfo("shutdow ...

  7. thinkPHP5扩展workerman

    -安装workerman 首先通过 composer 安装 composer require topthink/think-worker -vvv 如果报错: Installation failed, ...

  8. Centos6.5系统关闭防火墙

    关闭Centos6.5系统防火墙步骤: 1.命令:service iptables stop //停止正在运行的防火墙服务 2.命令:chkconfig iptables off //永久关闭防火墙 ...

  9. Jquery DataTable初探

    最近在做公司的后台模版,表格渲染都是用的datatable,现在来总结一下常用用法. datatable中文网参考链接 配置介绍 1. "aLengthMenu": [ [5, 1 ...

  10. lombok @EqualsAndHashCode 注解讲解

    官方文档:@EqualsAndHashCode 原文中提到的大致有以下几点: 1. 此注解会生成equals(Object other) 和 hashCode()方法. 2. 它默认使用非静态,非瞬态 ...