2019_BUAAOO_第一单元总结
前言
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_第一单元总结的更多相关文章
- OO第一单元作业小结
前言 第一单元的主题是表达式求导,第一次作业是只带有常数和幂函数的求导,第二次作业加入了正余弦函数,第三次作业又加入了表达式嵌套,难度逐渐提升.总体来说前两次作业还易于应对,而第三次作业做得相对有些艰 ...
- BUAA面向对象设计与构造——第一单元总结
BUAA面向对象设计与构造——第一单元总结 第一阶段:只支持一元多项式的表达式求导 1. 程序结构 由于是第一次接触面向对象的编程,加之题目要求不算复杂,我在第一次作业中并没有很好利用面向对象的特点, ...
- OO第一单元作业总结
oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...
- OO第一单元总结
OO第一单元作业总结 一.前言 开学四周,不知不觉已经做了三次OO作业.事实上,每一次作业对我来说都是很大的挑战,需要花费大量的时间和精力来学习. 虽然学得很艰苦,但最后还是连滚带爬地完成了.(好惨一 ...
- OO第一次博客作业--第一单元总结
OO第一单元总结 面向对象设计与构造的第一单元,对“面向对象”的概念还根本不理解不熟悉,只觉得需要“分模块”,但不知道怎么分,分多少模块,怎么根据需要的模块的功能建立类.学习的进度又太慢,根本跟不上出 ...
- OO第一单元总结(表达式求导)
写在前边:第一次接触面向对象语言,编程思想仍然不可避免的有以前面向过程的影子.从第一次作业的完全面向过程,到第二次学会剥离各个类互不影响到第三次作业的先构思面向对象的基本程序架构再编程.虽然程序有些地 ...
- OO第一单元优化博客
OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)\)和\(cos(x)\)的指数作为坐标,在图上画出来就可 ...
- 【BUAA-OO】第一单元作业总结
#OO第一单元作业总结 #确认存活,爱学习,爱北航,爱OO 一.三次作业分析 1.第一次作业 1.1 程序结构 对方法的度量: 类的内聚和相互间的耦合情况: 类图: 优缺点: 优点大概没什么优点,毕竟 ...
- OO面向对象第一单元总结
OO面向对象第一单元总结(表达式求导) 写在前面: 魔鬼课程oo第一单元终于结束,当终究要落笔总结,竟不知从何写起…… 回首再去看第一次的作业,你会满足于那时的幸福,或许,这就是成长吧! 千言万语,一 ...
随机推荐
- HtmlWebpackPlugin用的html的ejs模板文件中如何使用条件判断
折腾: [已解决]给react-hot-boilerplate中的index.html换成用HtmlWebpackPlugin自动生成html 期间,已经有了思路了,但是不知道如何在ejs的html中 ...
- LightOJ 1348 (树链剖分 + 线段树(树状数组))
题目 Link 分析 典型的树链剖分题, 树链剖分学习资料 Code #include <bits/stdc++.h> using namespace std; const int max ...
- Laravel-google-authenticator--Google验证码
开发前的准备 安装Laravel 安装二维码生成器QrCode,没有安装也可以,接下来会安装 安装拓展 1.运行如下代码安装拓展包: composer require "earnp/lara ...
- 关于form-checkbox 必填项无效的错误
校验规则要写在一个form里 检查data,给个默认值. 否则刚进去错误提示不显示. 其次,要加 type 类型,注意大小写 触发类型为 change .
- C++示例
Linux C++ template使用示例: #include <iostream> #include <cstring> using namespace std; temp ...
- python——Pycharm的简单介绍
一.什么是Pycharm? Pycharm是一种python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳转.智能提示.自 ...
- python复习基本知识
print(x or y) """x or y ; x 为 true ,则返回x ,否则返回flase“”“” and 则相反 优先级比较:not > and &g ...
- BeanUtils.copyProperties缓解代码压力,释放双手
简单描述:之前在写代码的时候,经常把表单提交到后台的对象的参数,通过getter方法取出来,然后,再通过setter方法传递给需要的对象,代码中写了很多get set这种方法,后来听同事说,sprin ...
- sql 随笔更新
SELECT DISTINCT(p.`id`), p.`id` , v.`full_name` , CONCAT(LEFT(v.mobile, 7), '****') , DATE_FORMAT(DA ...
- CentOS运维常用技能
1.添加系统帐号 [root@localhost ~]# adduser gordon [root@localhost ~]# passwd gordon //新帐号添加密码,然后输入密码就完成了.修 ...