OO第一单元作业总结
oo第一单元的作业是对多项式的求导。下面就是对三次作业分别进行分析。
第一次作业
分析
第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数项和指数项。实际上这次作业给我的最大收获是初步认识了正则表达式的使用。程序的结构如下:
设计
结构十分简单,只有一个类(就是面向了过程。。。),类的构造函数用以处理输入的字符串,calcDiff()用来计算导数。
度量分析
从表格中可以看出来,factor()方法的复杂度与独立路径条数较高,这是因为这个方法中进行了太多的if-else判断,代码的分支条数太多,导致代码可读性不高。
强测
这次比较失误的是没有仔细审好题目,以为++x这种操作是不合法。导致扣了一定的分数。
总结
本次作业难度不高,对于刚刚学java的菜鸟还是十分友好的,但由于对面向对象的思想还是比较陌生,所以写出来的代码确实不忍直视。但是收获还是有的,比如学会了正则表达式等工具。
第二次作业
分析
这次作业明显就要比上一次的作业难度上有了很大的提升。以及老师在周四的课堂上最后说了一句,“觉得第一次代码写的不行就赶紧重构吧,否则第三次作业是一定过不了的”。于是乎果断重构了代码。通过揣摩指导书(提醒了这次作业三角函数中只有x这种变量),我提前预判到下次作业可能是复合函数求导hhh,所以在构思的时候就把复合函数考虑了进来,在factor类里增加了一个expression类型的私有属性。
设计
UML图如下:
与第一次作业相比,这次的设计要复杂的多,也有了面向对象的影子。
度量分析
这次有好几个方法的V(G)值很高,一部分原因是因为我考虑了factor中存在expression的因素,导致多了很多分支判断。另一部分原因是因为在做输出优化的时候没有想清楚具体的优化方法,单纯一味的if判断。
总结
因为这次所设计的需求超过了实际需求,所以耗费了很多的时间,但也为下次作业节省了不少时间。同时这次作业的测试规模已经十分之巨大了,所以我也学习了一下规模化规范测试的方法,用Junit进行了批量测试。
第三次作业
分析
实际上这次作业在发布之初我就非常的兴奋了,因为基本符合了我在作业二时所做的预判,总算没有白费功夫。。所以实际上我的代码结果和上次来讲基本相似,花费的时间也比较短暂,一天就完成了此次作业。比较大的区别就是在于输入判断这块,由于factor里面还有expression,这种带括号的文法是无法直接用正则表达式进行匹配的,所以我的解决方法是进行迭代处理。比如像sin((xcos(x)))这种Term,我是先将内部括号代换成x即sin(x),之后判断外层语法是否正确,然后在将(xcos(x))代换回来,等到factor内部的expression再进行判断。
设计
UML图如下:
总体思路和上次一毛一样,就是修改了一些细节以及增加了一些用来优化的方法。
度量分析
总结
实际上我的这个设计上是有很大的缺陷的,实际上像加减乘除运算都应该从factor,term,expression类中抽离出来,单独做一个运算类,高内聚,低偶和。而我现在所做的并没有达到这一目的。所以每次修改一个类的方法都会导致一连串的连锁反映,这也导致之后在强测的时候发现有一处判断没有修改而出现了错误。代码的可读性也差了很多。
Bug分析
三次作业的bug主要出现的位置就是在输入处理和优化上面,输入有审题不认真导致也有边界考虑不周全导致。这部分的处理确实十分的棘手也很麻烦。只要思维稍有不连惯性就很有可能出现了bug。优化上的问题从根本上考虑就是设计上的缺陷导致,没有很好的分析清楚各个类之间的继承关系,导致每个类内的书写非常的累赘。
分析自己发现别人程序bug所采用的策略
实际上我没有刻意的去挖掘他人的代码缺陷并精心设计针对性的测试程序,还是主要使用的黑盒来进行测试。在测试时,我编写了一个自动生成测试用例的脚本(sympy进行验证),来测试代码的正确性,会不会爆栈等。同时也人工设计了一些格式上有问题的数据来检测程序的输入处理上是否有问题。
Applying Creational Pattern
前两次作业因为功能相对简单,在没有创建模式的概念下也能比较舒服的完成。但第三次作业的时候就感到十分不舒服了。如果要让我重构的话,我觉得我会创建一个接口类以及常数类、三角函数类、表达式类、项类。用接口类给出不同的运算接口。然后再在每个类中实现它。
总结
这三次作业做的确实都比较仓促,由于还有别的一些事情,没有花费足够的时间在这上面,之后应该多花费时间在面向对象这门课来。
不过通过这三次作业,我对Java语言的掌握程度提升了很多,也对面向对象编程有了进一步的认识,逐渐摆脱了面向过程的思想。更加注重程序的可扩展性和鲁棒性。
OO第一单元作业总结的更多相关文章
- 【OO学习】OO第一单元作业总结
OO第一单元作业总结 在第一单元作业中,我们只做了一件事情:求导,对多项式求导,对带三角函数的表达式求导,对有括号嵌套的表达式求导.作业难度依次递增,让我们熟悉面向对象编程方法,开始从面向过程向面向对 ...
- 【作业1.0】OO第一单元作业总结
OO第一单元作业已全部完成,为了使这一单元的作业能够收获更多一点,我回忆起我曾经在计算机组成课设中,经常我们会写一些实验报告,经常以此对实验内容反思总结.在我们开始下一单元的作业之前,我在此对OO第一 ...
- OO第一单元作业总结——表达式求导
OO第一单元作业总结 第一次作业 基于度量分析代码结构 基本算法 第一次作业是简单多项式导函数求解,不需要对输入数据的合法性进行判定, 基本思想是用 (coeff, expo)表示二元组 coeff* ...
- 北航OO第一单元作业总结(1.1~1.3)
经过了三次作业之后,OO第一单元告一段落,作为一个蒟蒻,我初步了解了面向对象的编程思想,并将所学内容用于实践. 一.第一次作业 1.架构分析 本次作业需要完成的任务为简单多项式导函数的求解.表达式仅支 ...
- OO第一单元作业小结
前言 第一单元的主题是表达式求导,第一次作业是只带有常数和幂函数的求导,第二次作业加入了正余弦函数,第三次作业又加入了表达式嵌套,难度逐渐提升.总体来说前两次作业还易于应对,而第三次作业做得相对有些艰 ...
- 2019北航OO第一单元作业总结
一.前三次作业内容分析总结 前言 前三次作业,我提交了三次,但是有效作业只有两次,最后一次作业没能实现多项式求导的基本功能因此无疾而终,反思留给后文再续,首先我介绍一下这三次作业,三次作业围绕着多项式 ...
- OO第一单元作业——魔幻求导
简介 本单元作业分为三次 第一次作业:需要完成的任务为简单多项式导函数的求解. 第二次作业:需要完成的任务为包含简单幂函数和简单正余弦函数的导函数的求解. 第三次作业:需要完成的任务为包含简单幂函数和 ...
- OO第一单元作业总结之初识面向对象
第一个单元的三次作业均为求导,循序渐进的让我们掌握如何构造类和方法,让整个代码是面向对象的设计而不是面向过程的设计.如果第一次作业和第二次作业你只是简单的对过程着手架构类,到了第三次作业就会变得格外麻 ...
- 多项式与三角函数求导——BUAA OO 第一单元作业总结
第一次作业 需求简要说明 针对符合规定的多项式表达式输出其符合格式规定的导函数多项式,格式错误输出WRONG FORMAT! 带符号整数 支持前导0的带符号整数,符号可省略,如: +02.-16> ...
随机推荐
- H5混合开发问题总结
1.This application is modifying the autolayout engine from a background thread, which can lead to en ...
- XLua----热更新
一.xLua 环境配置 1).Xlua中 Plugin Xlua复制到 需要热更新的工程中---->Assets子目录 2).开启宏HOTFIX_ENABLE File---->bui ...
- 动态规划----最长递增子序列问题(LIS)
题目: 输出最长递增子序列的长度,如输入 4 2 3 1 5 6,输出 4 (因为 2 3 5 6组成了最长递增子序列). 暴力破解法:这种方法很简单,两层for循环搞定,时间复杂度是O(N2). 动 ...
- apollo在liunx环境实战(三)
1. apollo在liunx环境实战(三) 1.1. 准备 下载apollo源码 https://github.com/ctripcorp/apollo 1.2. 创建数据库 在自己的liunx环境 ...
- flink metric库的使用和自定义metric-reporter
简单介绍 flink内部实现了一套metric数据收集库. 同时flink自身系统有一些固定的metric数据, 包括系统的一些指标,CPU,内存, IO 或者各个task运行的一些指标.具体包含那些 ...
- 工作5年的Java程序员,才学会阅读源码,可悲吗?
最近一位5年开发经验的群友与我聊天 他说:最近慢慢的尝试去看spring的源码,学习spring,以前都只是会用就行了,但是越是到后面,发现只懂怎么用还不够,在面试的时候经常被问到一些开源框架的源码问 ...
- PyCharm证书过期:Your license has expired
报错“your evaluation license has expired, pycharm will now exit”1.解决步骤,点击‘Activation code’,授权激活pycharm ...
- linux-centerOs6.8安装nginx与配置
一:安装nginx 1.安装gcc(命令:yum install gcc)备注:可以输入gcc -v查询版本信息,查看是否自带安装 2.安装pcre(命令:yum install pcre-devel ...
- SpringBoot+Elasticsearch
1. 前言 1.1. 集成方式 Spring Boot中集成Elasticsearch有4种方式: REST Client Jest Spring Data Spring Data Elastic ...
- JDK1.8源码(一)——java.util.ArrayList
ArrayList 定义 ArrayList 是一个用数组实现的集合,支持随机访问,元素有序且可以重复. public class ArrayList<E> extends Abstr ...