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> ...
随机推荐
- MySql解除安全模式:Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.
在修改一条数据字段时报错: Error Code: 1175. You are using safe update mode and you tried to update a table witho ...
- jq 点击复制div里面的内容 如果粘贴到富文本中,会将样式,里面所有的标签,文字一并粘贴进去
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- svn错误:更新源码出现校验和不匹配问题
svn 的文本校验和不匹配: 最近在更新自动化源代码的时候出现了一个错误:svn: Checksum mismatch while updating.... 查了下google,原来是在更新源码出现校 ...
- 阿里分布式事务解决方案-GTS
摘要: 本文将深入和大家探讨微服务架构下,分布式事务的各种解决方案,并重点为大家解读阿里巴巴提出的分布式事务解决方案----GTS.该方案中提到的GTS是全新一代解决微服务问题的分布式事务互联网中间件 ...
- 基于Java的HashMap和HashSet实现
一.Map接口类: import java.util.Iterator; public interface IMap<K, V> { /* 清除所有键值对 */ void clear(); ...
- 【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- [Swift]LeetCode785. 判断二分图 | Is Graph Bipartite?
Given an undirected graph, return true if and only if it is bipartite. Recall that a graph is bipart ...
- linux入门--Linux发行版本详解
从技术上来说,李纳斯•托瓦兹开发的 Linux 只是一个内核.内核指的是一个提供设备驱动.文件系统.进程管理.网络通信等功能的系统软件,内核并不是一套完整的操作系统,它只是操作系统的核心.一些组织或厂 ...
- 11.Git分支-远程跟踪分支的概念、多个远程仓库的使用
1.远程跟踪分支的概念 远程引用是对远程仓库的引用,包括分支.标签等等. 1.可以通过 git ls-remote <remote> 来获得远程引用的完整列表 2.git remote ...
- Python内置函数(44)——next
英文文档: next(iterator[, default]) Retrieve the next item from the iterator by calling its __next__() m ...