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. parallel::ForkManager

    use Parallel::ForkManager; my $MAX_PROCESSES=10;   #申明最大进程数(一次创建的进程越多,越耗内存): my $pm = new Parallel:: ...

  2. Spark SQL / Catalyst 内部原理 与 RBO

    原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/spark/rbo/ 本文所述内容均基于 2018年9月10日 Spark ...

  3. C#取出重复的方式以及用字典存储以键存储集合的方法

    最近在做项目的时候,发现有些需求需要特别的方式来实现.下面看代码 private List<string> firstType = new List<string>(); pr ...

  4. 常见模块(七) re模块

    首先明白正则表达式和re模块的关系:正则:是一种规则,这种规则在任何一种语言中都严格按照此规则进行匹配.正则匹配的就是字符串,从字符串的左边往右边匹配re: re是python语言中的利用正则规则的一 ...

  5. 2018.5.8 python操纵sqlite数据库

    创建: create_Email = "CREATE TABLE if not exists emails (\n\ id INTEGER NOT NULL,\n\ user VARCHAR ...

  6. STM8L LCD配置与com使用问题

    void LCD_GPIO_Config(void) { //SEG GPIO Init GPIO_Init(GPIOE, GPIO_Pin_0|GPIO_Pin_1,GPIO_Mode_Out_PP ...

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

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

  8. Beginning Math and Physics For Game Programmers (Wendy Stahler 著)

    Chapter 1. Points and Lines (已看) Chapter 2. Geometry Snippets (已看) Chapter 3. Trigonometry Snippets  ...

  9. 关于PCA

    PCA是常见的降维技术. 对于使用PCA来进行降维的数据,需要进行预处理,是指能够实现均值为0,以及方差接近.如何来确定到底哪个维度是"主成分"?就要某个axis的方差. 为什么要 ...

  10. lay-verify 无效

    lay-verify 无效 使用lay-verify有两个需要注意的地方: form标签需要添加 class="layui-form" 提交按钮需要添加 lay-submit=&q ...