前言

  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. 2019年一次java知识点总结

    java基础 数据类型 集合与数据结构 关键字(static,rty ...) IO和网络 多线程(并发与锁,死锁) 异常 简单算法,复杂度 JVM 类加载 java内存模型 对象监听器字节码 垃圾回 ...

  2. iview 非 template/render 标签转换

    在 非 template/render情形下使用 iview,发现除了官方的一些需要注意的点外,还有一些其他需要注意的,这里记录下,防踩坑: 官方说明: 在非 template/render 模式下( ...

  3. PMI-ACP练习题知识积累-打印版

    敏捷铁三角的参数:价值,质量,约束.传统的铁三角包括的参数是范围,进度和成本 敏捷计划的三个主要层级为:发布计划,迭代计划,每日计划 敏捷开发模型的特征包括 开发由多个迭代组成. 敏捷拥抱不确定性,而 ...

  4. 前端笔记知识点整合之JavaScript(二)关于运算符&初识条件判断语句

    运算符 数学运算符的正统,number和number的数学运算,结果是number.出于面试的考虑,有一些奇奇怪怪的数学运算: 数学运算中:只有纯字符串.布尔值.null能够进行隐式转换.   //隐 ...

  5. Linux下查看CPU型号,内存大小,硬盘空间,进程等的命令(详解)

    转自:http://www.jb51.net/article/97157.htm 1 查看CPU 1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physic ...

  6. ubuntu16.4下使用QT修改系统时间

    我也是在网上找的,自己随便改了一下六个lineEdit控件,每个控件输入日期时间,点击按钮触发函数可修改时间. 1 //一键修改系统时间 QString year = ui->lineEdit_ ...

  7. Git初始配置和基本使用

    初次运行Git前的配置 本文是在安裝完git以后首先应做到一些配置,安装教程可以参考廖雪峰git教程 用户信息 当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址. 这样做很重要,因为每 ...

  8. Interactive map of Linux kernel

    Interactive map of Linux kernel 2.6.36  : http://www.makelinux.net/kernel_map/ 注: 图中函数名带连接

  9. 阿里云centos安装docker

    近期转向core开发,mssql也支持了docker,索性把手上的一台服务改成centos做测试开发.中间安装docker碰到的问题做个记录. docker版本 docker从1.13版本之后采用时间 ...

  10. python3 代理设置

    前言: 用过很多种代理使用方式,这里总结一下. 1.urllib+socks5的代理1 from sockshandler import SocksiPyHandler import socks fr ...