I used to be enamored of object-oriented programming. I'm now finding myself leaning toward believing that it is a plot designed to destroy joy.

Eric Allman

一、基于度量来分析程序结构

总体:

第一次作业:在两个类中处理了所有多项式的求导,一个主函数控制输入并且处理字符串,格式不正确时报错;另外一个处理多项式并且求导。

第二次作业:在第一次作业的基础上讲多项式和单项式分离开来,由于每一项可以简化成(k,a,b,c)的函数,所以没有区分三角函数与单项式。

第三次作业:对第二次作业进行了重构,但依然没有使用继承与接口,将字符串处理完毕后输入Nest类分离加减项,再传入另一个类分离乘除项,分别有各自的求导方法,符合单项式或者单项三角函数或者数字为止。

基于量类的属性个数、方法个数、每个方法规模、每个方法的控制分支数目、类总代码规模,并计算了经典的OO度量,分析类的内聚和相互间的耦合情况,具体指标如下。


第一次作业:

类图:一个Main莽完所有……

度量分析:

可以看出,第一次作业中使用的类很少,并且使用了内部类,没有分离出来。一个main莽完了所有类,很多方法复杂度过高。对于字符串的处理采用了判断一项然后删除的方法,每一项分为了三个(常数,省略项,或者普通项),正则匹配的时候用了诸多if-else语句,增加了复杂度。求导化简时只是合并了同类项,对于正负的加减号没有进行有效的化简导致出错。因为只用了一个类,嵌套深度比较深。

第二次作业:

第二次作业在第一次的基础上做出了修改,因为每个单项可以化简成一个四元函数,于是抽象出两个单项式和多项式的类,分别有求导的方法。不足之处在于可扩展性很差,给第三次作业带来了很大的难度;此外,因为水平有限,除了合并同类项,对于三角函数繁多的化简也没有研究;最后,第一次作业中讲多项式处理输入也没有抽象出一个类,导致main里面有挤满了一堆代码。

第三次作业:

第三次作业对第二次作业进行了重构,因为对继承和借口的理解仍然有偏差,所以并没有运用到继承和借口。将字符串处理抽象出了一个input_handler的类,然后对于最基本的项建立了number和polyterm的类。字符串处理完毕之后输入Nest和Factor的类,两个类求导方法中反复迭代直到最后if-else判断是符合单项,再传入number和polyterm的求导。由于在类之间,多项式及其结果是以字符串的形式传递,化简起来比较麻烦,所以没有做相应的化简。

Factor和Nest的diff方法都有若干个if-else语句,复杂度和嵌套深度都很高。


二、BUG部分

主要分为格式错误的判断和输出结果两部分。

格式错误:

(1) 出现了要求之外的非法字符,比如\f \v:

对于字符串预处理的时候可以先判断是否含有规定字符之外的字符串。

当时偷懒用了\s识别所有的空格和\t,结果没有注意到其与空格差别,踩了坑。

(2)因子作为嵌套项时没有括号:

指导书上很明确的写了(然而第一遍我并没有认真读,我滚了

输出的时候也要注意在+-因子外面加上括号,为了保险起见我一股脑的括号全加上了,导致输出特别长,后来想想,两个基项和乘除项的括号应该可以省略。

(3)去括号时注意括号是否匹配:

最开始去掉不必要的括号时选择直接while循环去掉最外层的括号,但是形如(3*3)+(4*sin(x))就报错WF,发现去掉括号时需要判断是否匹配,于是加了个flag标志是否匹配判断。

(4)加减号重复:

项与项之间有符号,项本身还有符号,就可能造成多余的输出。最后replaceAll一下就好了。

输出错误:

(1)乘以1或者0的项

如果乘以0,当开始写的时候就不输出了,结果只有一个项的时候结果就比较尴尬;1也是类似的问题,自身再化简就容易输出格式错误。现在也没太想好怎么处理……

(2)略项前面的符号

省略项只能出现在首项中,否则就是格式错误……还是选择加括号好了……

等等等等。

如何构造测试样例

讨论课上看神仙们分享了自己写的对拍器,觉得很有实践价值与意义。我自己测试自己的时候仍然停留在针对能想出的错误类型,构造测试样例,然后输入IDLE用Python自带的包,随机选取数字,看看结果是否一致。


三、Applying Creational Pattern

面向对象的思想就应该是由简到繁,层层的递进,将所有要实现的功能抽象为类,而不是第一步该干什么,第二步该干什么,否则在多项式输入的时候WF的判断细节将会变得十分复杂。在每一次实践中我都在不断加深对面向对象的几大原则的理解……

单一职责原则,是指一个类的功能要单一。比如在第二次作业中,所有项都归结为 k*x^a*sin^b*cos^c形式,可以省时省力但可扩展性差。其次, 要遵循接口分离原则和继承接口, 模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。在第三次作业中观摩了其他小伙伴的作业,才恍然大悟求导可以提取出来作为一个接口,这样可以省去对于各个单项的判断。最后通过循环依赖,不停地讲表达式缩减(类似于表达式树),实现递归求导。


四、 总结

Java基础几乎为零,也缺乏实践指导的情况下,应该先熟悉基本编程思想,再纠结编程技巧……事实证明,一个坏的设计架构带来的麻烦不止一点,不将多种功能分离开而想一口气吃成个胖子的后果就是debug难度直线上升。

最大的感受就是,学好正则表达式,有秩序的建立类,少用ifelse,少用ifelse,少用ifelse。

QAQQAQQAQ我一定重新做人,哭了(x

前三次OO作业小结的更多相关文章

  1. 【作业】HansBug的前三次OO作业分析与小结

    OO课程目前已经进行了三次的作业,容我在本文中做一点微小的工作. 第一次作业 第一次作业由于难度不大,所以笔者程序实际上写的也比较随意一些.(点击就送指导书~) 类图 程序的大致结构如下: 代码分析 ...

  2. 前三次OO作业总结

    一.作业总结 前三次的任务都是表达式求导.这是我在高中就思考过的问题,但是很久都没有付诸实践,直到学习了"类"这个强大的工具.还有正则表达式,如果能适当使用,则不失为一个字符串格式 ...

  3. 2018-北航-面向对象-前三次OO作业分析与小结

    基于度量的程序结构分析 由于平时使用了NetBrains出品的IDEA作为IDE,在分析程序的时候我使用了IDEA的插件Metrics Reloaded.然而在使用时发现不懂得很多分析项目的含义,因此 ...

  4. 2018-北航-面向对象第三次OO作业分析与小结

    1. 规格设计的发展历史 规格设计用于对程序设提供分解,抽象等的手段.在撰写代码规格的时候,需要对组成部件进行抽象. 在1960s,软件设计出现危机,例如Dijkstra提出了goto语句的种种危害, ...

  5. oo作业总结(一)

    概述 经历了三次oo作业的洗礼,让我对java语言的强大以及面向对象编程有了初步的理解(当然,我是小白).本文接下来就将对自己这三次作业的代码进行分析以及分享自己的心路历程. 基础知识点考核 针对前三 ...

  6. OO前三次作业分析

    一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...

  7. OO前三次作业思考(第一次OO——Blog)

    OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...

  8. OO前三次作业总结

    一.第一次作业 1.程序设计分析 ![img](s1.ax1x.com/2018/04/02/CSgoSU.png) 图1 第一次作业类图 ![name](https://images2018.cnb ...

  9. OO第三单元作业小结

    一.JML理论基础及应用工具链情况 理论基础 1.JML表达式 \result:表示方法执行后的返回值. \old(expr):表示一个表达式expr在相应方法执行前的取值. \foall:全称量词修 ...

随机推荐

  1. Python全栈之路----常用模块----logging模块

    很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...

  2. Number.toLocalString() js

    地址链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocal ...

  3. SQA计划

    一.SQA计划 1.软件工程 所做程序是一个长沙大学的学习app系统 .可以实现用户的注册登录,课程学习,以及活动参加.根据需求建模,进行体系结构设计,然后设计. 2.质量保证 (1)项目需要符合IE ...

  4. python画高斯分布图形

    高斯分布,也叫正态分布,是一个在数学.物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力. 若随机变量X服从一个数学期望为μ.方差为σ^2的正态分布,记为N(μ,σ^2).其概率 ...

  5. unity 常用插件 2

    Advanced PlayerPrefs Window 用来管理 PlayerPrefs 数据,超好用 JsonDotNet JSON 的序列化/反序列化插件.这个插件是支持 iOS, Android ...

  6. Java 关键字详解(持续更新中)

    abstract:     表明类或者成员方法具有抽象熟悉.       修饰类,抽象类:         抽象类不能被实例化:         抽象类中可以有属性.方法.构造,都是用来给子类继承的: ...

  7. sqlserver2008简介

    sql 数据库简介 应该掌握的部分: 1.  数据库的基本概念 2.  数据库模型的基本概念 3.  实体联系模型的基本概念 4.  关系模型的基本概念和性质 5.  数据库优化理论 6.  掌握创建 ...

  8. oracle错误汇总2

    http://blog.itpub.net/30430420/viewspace-1799925/ ============================= 现象!!!!!!!!!!!!!!!!!S ...

  9. Java泛型相关总结(下)

    约束与局限性 不能用基本类型实例化类型参数 不能像Pair<double>这样调用,只能Pair<Double>,原因是类型擦除 运行时类型查询只使用于原始类型 虚拟机中的对象 ...

  10. C语言之二维数组与指针

    二维数组: ][]; 二维数组实质上也就是一维数组,a[2][3]可看做一个2个元素的一维数组,这2个元素又是另一个数组,在内存中,它的排布如下: #include "stdio.h&quo ...