总述

    三周的时间一晃而过,也到了和表达式说再见的时候了。想起来,现在已经能够优雅地在互测“攻击”别人,然后笑对被别人“攻击”,就觉得OO这三周还是很有意义,也多多少少改变了我。周六已经快习惯早上背着包,找个自习室做题,然后晚上回宿舍,和同学交流。三周的三次作业强度一次都比一次大,但我个人而言,觉得尚且还能够适应,可能是课下时间充足所以会不是很紧张。反正一句话,再遇见表达式计算,咱不怂。最后关于解题思路,值得一提的是,由于自身惰性,和题目内容的偶然性,最终三次作业的解题思路从大方向上而言是一样的:因子级处理,先处理乘号再处理加号(不使用表达式树之类的,就是简单的判断一下优先级---遇见加法存进结果并更新缓存,遇见乘法添加进缓存)

  第一次作业

  写第一次作业的时候,关于OO就是个小白啊,又加上第一次作业难度不大,所以我只是简单的建了一个Node类(事后发现大家都是Poly,感觉数据结构之后就只会Node了.....),如下是第一次作业的类图。

    当时的解题思路很简单,觉得一个通用的Node应该能够表示完几种因子类型(事实上讲,也确实可以)。但是现在回过头来看,Node类要做的事情太多了,程序的主功能“qd”求导也封装在Node里面了,这使得如果程序的主体功能全部依赖于Node类。这对数据保护不是很友好,一旦后期有对功能需求有所修改,则必将影响Node类内部其他属性和方法,但事实上Node类作为一个因子类,其本身的内容应当是随因子变换而变换而非是内容。

  

    上图是相关的类方法复杂度分析,从里面可以发现,Node本身的构造方法的设计复杂度和实际复杂度都很高。我个人认为这是因为我需要用一个Node去匹配所有的因子情况所造成的。大量的参数其实本身就是一种设计不良的体现。不过还是由于懒等原因,当时并没有决定去进一步地优化设计。从这里也可以看出Node类作为一个因子类其实有一些"勉强"了,现在觉得最好的可行方法就是Nqde类作为父类,然后新建各个因子自己的子类,这样解决可能要好一些。

  第二次作业

    第二次作业相较之第一次作业多了三角函数,实际上只是多了一个因子类而已,所以当时我觉得(现在也是)解题大方向不需要有什么变换,只是在输入上下一些功夫,写一个新的pattern能够匹配出三角函数这个因子,并对Node类进行修改,使得其能够支持三角函数。说到这里又不得不说,其实在第二次作业的时候,我就察觉到Node类有些臃肿,可是由于舍不得(懒)还是决定复用结构,所以我的第二次作业类图就成了这个样子:

  

    由上面的类图可以基本看出,Node1与第一次的Node在方法上并没有太多的换,在属性上多出了关于三角函数相关的属性。至于Poly2这个类似与第一次作业的Maintest,相当于Main。最大的变换还是在于把求导方法给挪到了Main里面,算是一个初步的功能与数据的分离吧。下面是相关的类方法复杂度分析:

  

    从类方法复杂度来看,judgesymbol、main、output、simplify个方法的复杂度比较高。main方法的复杂度主要是由于我没有封装输入,所以基本所有的输入提前任务全都是由main负责了,所以其复杂度较高。对于judgesymbol而言,这一直是我三次作业的一个bug点,因为符号判断实际上是一个很重要的WF点,同时这个符号判断也是非常灵活、变式非常多的一个点。由于我在正则表达式上的设计存在缺陷(偷懒了),所以这让我在符号判断的时候相当难受,大量的if判断让我都觉得尴尬,有此复杂度不意外。至于simplify和output的复杂,我觉得是合理的(相对于我的设计思路而言),许多不同的因子,他们的输出其实不尽相同,这就要求output有强大的适应力。至于simplify的复杂,这是显而易见的。

  第三次作业

    第三次作业就像是关卡的BOSS一样,乍拿到手真的很头痛,输入不好处理、输出不好处理、递归不好处理以及和我之前的结构设计有一定的冲突。这种种原因让我觉得第三次作业难,比前两次难。但是又正如我在文章开头中所说的,三次作业一个思路过。冷静下来,其实第三次的求导,仍然只是因子增加了,只不过这次增加的因子更加复杂,也不能像前两次作业一样,通过一些属性来表示整个结构。但是无论怎么说,确实只是增加了因子的数量,这让输入变得更加复杂,以及求导难度增加(其实真的增加了吗?),但是这些都好处理。所以我就这样想着,写出了第三次作业的题解,不涉及表达式树以及其他的复杂的数据结构或者是复杂的解法。大方向“加号与乘号的处理(缓存机制)”,对象上针对因子分别实现其求导方法,最后一个归总合并。正如我下面的这张类图:

  

    如果你细心地看完了,前面所有的内容,到这里肯定会感慨:居然不是Node3?终于把各个因子类都分割出来了吗?。在做第三次作业的时候,我实在是忍无可忍,终于决定重新构建我的整个代码结构而不采用复用第二次作业的现有框架(其实要复用的话难度也挺大的)。当重新把整体结构重构优化之后,我发现这个过程其实并不复杂,反而非常省心,所以这次可谓是用亲身经历去实践了一个好的思路和框架是能让许多事情都简单起来的。以下是相关类方法的复杂度分析

  

    不难发现,Main类中的SpecialPattern、isPoly和getItem方法在复杂度上都比较高。是设计的问题吗?设计的问题肯定有的,但是我觉得主要是它们要承担的功能太过复杂才是主要因素。SpecialPattern是个格式提取的方法、其内封装了表达式因子和非标准三角函数的三角函数的格式提取。isPoly是对于表达式因子和非标准三角函数的三角函数的WF判断。getItem是对求导结果的获取,也就是说, 对输入的参数,返回求导的结果,它内部的复杂性主要是其内部调用了基本所有的主要功能函数。

  总结

    OO搞我啊。每次我在看到新发的作业指导书之后,总是喜欢这么说。但是我也喜欢讲,其实OO没那么难的,真的。

    希望能够在OO上面收获一段难忘的编程回忆,也希望互测的时候手下留情(苦笑)。

OO第一单元单元总结的更多相关文章

  1. OO第一单元作业总结

    oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...

  2. OO第一单元总结

    OO第一单元作业总结 一.前言 开学四周,不知不觉已经做了三次OO作业.事实上,每一次作业对我来说都是很大的挑战,需要花费大量的时间和精力来学习. 虽然学得很艰苦,但最后还是连滚带爬地完成了.(好惨一 ...

  3. OO第一单元优化博客

    OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)​\)和\(cos(x)​\)的指数作为坐标,在图上画出来就可 ...

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

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

  5. OO第一单元(求导)单元总结

    OO第一单元(求导)单元总结 这是我们oo课程的第一个单元,也是意在让我们接触了解掌握oo思想的一个单元,这个单元的作业以求导为主题,从一开始的加减多项式求导再到最后的嵌套多项式求导,难度逐渐提高,编 ...

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

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

  7. OO第一单元(前四周)作业总结

    OO第一单元(前四周)作业总结 OO第一单元(前四周)作业总结要求(第四次作业) 0.前言 本次博客针对的是本人学习Java的第一阶段的三次作业的作业总结 第一次作业的内容是:7-1 计算税率 (20 ...

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

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

  9. OO第一单元总结与反思

    OO第一单元总结与反思 目录 OO第一单元总结与反思 摘要 第一次作业 本次作业UML类图 本次作业度量分析 第二次作业 本次作业的UML类图 本次作业的度量分析 第三次作业 本次作业的UML类图: ...

  10. 2020 OO 第一单元总结 表达式求导

    title: BUAA-OO 第一单元总结 date: 2020-03-19 20:53:41 tags: OO categories: 学习 OO第一单元通过三次递进式的作业让我们实现表达式求导,在 ...

随机推荐

  1. FutureTask原理解析

    原文链接:http://www.studyshare.cn/blog-front/blog/details/1130 首先写一个简单的Demo public static void main(Stri ...

  2. autolayout原理

    Autolayout Engine根据视图间的约束关系得到一个线性方程组,求这个线性方程组的解即得到每个视图的位置信息.(x,y,width,height) 参考: https://www.jians ...

  3. DOM访问和处理HTML文档的标准方法

    innerHTML获取或替换HTML元素的内容 <p id="d">对于错我无法来判断 </p><script type="text/jav ...

  4. AlphaGo的前世今生(二)AlphaGo: Countdown to AI Revolution

    这是本专题的第二节,在这一节我们将以David Silver等人的Natrue论文Mastering the game of Go with deep neural networks and tree ...

  5. java二分法搜索

    二分法就是要将数据每次都分成两份然后再去找到你想要的数据 在二分法查找时要求传入的数据必须已经有序,假设现在为升序,然后每次将所寻找的值与中间值(数组左边界+(右边界-左边界)/2)作比较,大了则去寻 ...

  6. python学习Day7 数据类型的转换,字符编码演变历程

    一.数据类型的转换 1.1.1.字符转列表:lst1 = str.split(默认空格,也可依据指定字符分界),若无分界字符,就没法拆分,这时可以直接放进list转成列表 ----> s1 = ...

  7. Java8内置的函数式编程接口应用场景和方式

    首先,我们先定义一个函数式编程接口 @FunctionalInterface public interface BooleanFunctionalInterface<T> { boolea ...

  8. Game Engine Architecture 1

    [Game Engine Architecture 1] 1.This book is really just the beginning of a fascinating and potential ...

  9. less,more,view一个文件时中文可以正常显示,可是VI却显示乱码呢?

    https://blog.csdn.net/konglongaa/article/details/80590470 登陆后输入export LC_ALL="zh_CN.GB2312" ...

  10. WPF网格绑定控件并控制控件是否可读

    <DataGridTemplateColumn Width="100" Header="实测值"> <DataGridTemplateColu ...