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第一单元终于结束,当终究要落笔总结,竟不知从何写起…… 回首再去看第一次的作业,你会满足于那时的幸福,或许,这就是成长吧! 千言万语,一 ...
随机推荐
- YOLO v3
yolo为you only look once. 是一个全卷积神经网络(FCN),它有75层卷积层,包含跳跃式传递和降采样,没有池化层,当stide=2时用做降采样. yolo的输出是一个特征映射(f ...
- selenium采用find_element_by方法识别页面元素
主要是练习获取页面中的各元素,马克 # coding:utf-8 import time from selenium import webdriver import unittest from pyt ...
- 使用ansible实现轻量级的批量主机管理
作者:邓聪聪 查看ansible配置文件下的hosts的文件 [root@ansible-server scripts]# cat /etc/ansible/hosts [test] 172.16.1 ...
- OPPO F9 Pro在哪里打开usb调试模式的完美方法
经常我们使用pc通过数据线连接到安卓手机的时候,如果手机没有开启USB调试模式,pc则没能够成功读到我们的手机,此情况我们需要找处理方法将手机的USB调试模式开启,今天我们介绍OPPO F9 Pro如 ...
- n2n windows 编译安装文件
n2n安装 n2n原理编译版下载,可直接使用:windows下vpn客户端 n2n_v2_linux_x64 n2n_v2_Win32TAP网卡驱动 #linux环境编译yum install -y ...
- Model类代码生成器
using Humanizer; using System; using System.Collections.Generic; using System.Data; using System.Dat ...
- JS 从剪贴板上传图片
用Ubuntu两年多了,习惯了Ubuntu的操作感觉比WIN用起来还爽,就一点不爽,生态应用很少,好多WIN上好用的软件在Ubuntu找不到的,希望以后的软件可以做到一次编译全平台通用. 即使用上Wi ...
- Helm - Kubernetes服务编排的利器
Helm介绍 在Kubernetes中部署容器云应用(容器或微服务编排)是一项有挑战性的工作,Helm就是为了简化在Kubernetes中安装部署容器云应用的一个客户端工具.通过Helm能够帮助开发者 ...
- vs2017更新出错:The entire Box execution exiting with result code: 0x0
在将vs2017 15.7.4更新至15.9.5出现“The entire Box execution exiting with result code: 0x0”错误,也就是文件解压下载开始安装后, ...
- SQL反模式学习笔记1 开篇
什么是“反模式” 反模式是一种试图解决问题的方法,但通常会同时引发别的问题. 反模式分类 (1)逻辑数据库设计反模式 在开始编码之前,需要决定数据库中存储什么信息以及最佳的数据组织方式和内在关联方式. ...