总述

    三周的时间一晃而过,也到了和表达式说再见的时候了。想起来,现在已经能够优雅地在互测“攻击”别人,然后笑对被别人“攻击”,就觉得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. POIUtils 导出 poi Test 100w 600w 条数据

    依赖: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-l ...

  2. 属性控件CMFCPropertyGridCtrl简单用法

    这是我的原创! 用一堆的编辑框下拉框做配置界面,很是繁琐,还要对齐排版……用这个属性控件 CMFCPropertyGridCtrl 就可以统一风格了. //初始化 CMFCPropertyGridCt ...

  3. 在Linux机器上安装MySQL

    在Linux机器上安装MySQL,仔细认真些就没有问题. CentOS 7下MySQL 5.7安装.配置与应用_数据库技术_Linux公社-Linux系统门户网站 搞不定的话,直接删掉这个MySQL, ...

  4. OrderBy排序和IComparer的使用

    https://www.cnblogs.com/May-day/p/7490334.html 一,OrderBy排序在MDSN中有两种使用方法,如下 1>第一种方法的使用,就是根据某个字段排序, ...

  5. window Linux 双系统安装

    我是先安装的win10,然后在其基础上又安装了Ubuntu 16.04,为了今后再次安装方便,这里记录一下安装过程. 我在安装时主要参考了文章:https://blog.csdn.net/flyyuf ...

  6. [转]NSIS 制作安装包无法创建桌面快捷方式或无法删除开始菜单项

    用户将桌面文件转移了,如: D:\Doc\Desktop  ,安装程序后,桌面不会生成快捷方式, 或者卸载后,开始菜单中的文件也不会被删除 NSIS卸载后无法删除开始菜单中的内容原因:因为NSIS中使 ...

  7. PowerDesigner工具将表字段转成java实体

    首先将数据库的表导出为SQL文件.下载安装PowerDesigner工具. 下面以图文的形式讲解: 图   (1) 图   (2) 图   (3) 图   (4) 图   (5) 图   (6) 图 ...

  8. The Ultimate Productivity Hack is Saying No

    The Ultimate Productivity Hack is Saying No By James ClearRead this on JamesClear.com The ultimate p ...

  9. VB6 Collection实现百万文本去重

    上一篇数组的去重说到,对于千次计算以上的去重基本上特别的吃力,这里就介绍一种方法,通过Collection集合对象来过滤重复. Option Explicit '//By: InkHin '// 参考 ...

  10. list.sort和内置方法sorted的区别

    1.list.sort会直接修改list,不会把原来的列表复制一份,直接修改list,所以list.sort的返回值为None; 2.sorted(list)的返回值就修改之后的list,原来的lis ...