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第一单元作业总结的更多相关文章

  1. 【OO学习】OO第一单元作业总结

    OO第一单元作业总结 在第一单元作业中,我们只做了一件事情:求导,对多项式求导,对带三角函数的表达式求导,对有括号嵌套的表达式求导.作业难度依次递增,让我们熟悉面向对象编程方法,开始从面向过程向面向对 ...

  2. 【作业1.0】OO第一单元作业总结

    OO第一单元作业已全部完成,为了使这一单元的作业能够收获更多一点,我回忆起我曾经在计算机组成课设中,经常我们会写一些实验报告,经常以此对实验内容反思总结.在我们开始下一单元的作业之前,我在此对OO第一 ...

  3. OO第一单元作业总结——表达式求导

    OO第一单元作业总结 第一次作业 基于度量分析代码结构 基本算法 第一次作业是简单多项式导函数求解,不需要对输入数据的合法性进行判定, 基本思想是用 (coeff, expo)表示二元组 coeff* ...

  4. 北航OO第一单元作业总结(1.1~1.3)

    经过了三次作业之后,OO第一单元告一段落,作为一个蒟蒻,我初步了解了面向对象的编程思想,并将所学内容用于实践. 一.第一次作业 1.架构分析 本次作业需要完成的任务为简单多项式导函数的求解.表达式仅支 ...

  5. OO第一单元作业小结

    前言 第一单元的主题是表达式求导,第一次作业是只带有常数和幂函数的求导,第二次作业加入了正余弦函数,第三次作业又加入了表达式嵌套,难度逐渐提升.总体来说前两次作业还易于应对,而第三次作业做得相对有些艰 ...

  6. 2019北航OO第一单元作业总结

    一.前三次作业内容分析总结 前言 前三次作业,我提交了三次,但是有效作业只有两次,最后一次作业没能实现多项式求导的基本功能因此无疾而终,反思留给后文再续,首先我介绍一下这三次作业,三次作业围绕着多项式 ...

  7. OO第一单元作业——魔幻求导

    简介 本单元作业分为三次 第一次作业:需要完成的任务为简单多项式导函数的求解. 第二次作业:需要完成的任务为包含简单幂函数和简单正余弦函数的导函数的求解. 第三次作业:需要完成的任务为包含简单幂函数和 ...

  8. OO第一单元作业总结之初识面向对象

    第一个单元的三次作业均为求导,循序渐进的让我们掌握如何构造类和方法,让整个代码是面向对象的设计而不是面向过程的设计.如果第一次作业和第二次作业你只是简单的对过程着手架构类,到了第三次作业就会变得格外麻 ...

  9. 多项式与三角函数求导——BUAA OO 第一单元作业总结

    第一次作业 需求简要说明 针对符合规定的多项式表达式输出其符合格式规定的导函数多项式,格式错误输出WRONG FORMAT! 带符号整数 支持前导0的带符号整数,符号可省略,如: +02.-16> ...

随机推荐

  1. QEMU KVM Libvirt手册(6) – Network Block Device

    网络块设备是通过NBD Server将虚拟块设备通过TCP/IP export出来,可以远程访问. NBD Server通常是qemu-nbd 可以提供unix socket qemu-nbd -t ...

  2. JavaScript 异步编程的前世今生(下)

    ES6 中的 Generator 在 ES6 出现之前,基本都是各式各样类似Promise的解决方案来处理异步操作的代码逻辑,但是 ES6 的Generator却给异步操作又提供了新的思路,马上就有人 ...

  3. React Native组件、生命周期及属性传值props详解

    创建组件的三种方式 第一种:通过ES6的方式创建 /** * 方式一 :ES6 */ export default class HelloComponent extends Component { r ...

  4. Java面试题中常考的容易混淆的知识点区别

    以下是我收集的Java编程里各种区别,供Java学习爱好者参考,这些区别都是每次Java面试中常考的,大家好好掌握,如有失误请留言指出.想要获取Java详细全套学习资料请到上海尚学堂官网获取. 1.H ...

  5. [Swift]LeetCode25. k个一组翻转链表 | Reverse Nodes in k-Group

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k  ...

  6. [Swift]LeetCode105. 从前序与中序遍历序列构造二叉树 | Construct Binary Tree from Preorder and Inorder Traversal

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  7. [Swift]LeetCode386. 字典序排数 | Lexicographical Numbers

    Given an integer n, return 1 - n in lexicographical order. For example, given 13, return: [1,10,11,1 ...

  8. [Swift]LeetCode388. 文件的最长绝对路径 | Longest Absolute File Path

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  9. Java数据结构和算法 - TreeMap源码理解红黑树

    前言 本篇将结合JDK1.6的TreeMap源码,来一起探索红-黑树的奥秘.红黑树是解决二叉搜索树的非平衡问题. 当插入(或者删除)一个新节点时,为了使树保持平衡,必须遵循一定的规则,这个规则就是红- ...

  10. Android开发:修改eclipse里的Android虚拟机路径

    一.发现问题: 今天打开电脑发现C盘缩了不少,这才意识到:eclipse里配置的安卓虚拟机默认放在了C盘里. 当然,在不同的电脑上可能路径有所不同,我的默认路径是:C:\Users\lenovo\.a ...