OO第一单元单元总结
总述
三周的时间一晃而过,也到了和表达式说再见的时候了。想起来,现在已经能够优雅地在互测“攻击”别人,然后笑对被别人“攻击”,就觉得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第一单元单元总结的更多相关文章
- OO第一单元作业总结
oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...
- OO第一单元总结
OO第一单元作业总结 一.前言 开学四周,不知不觉已经做了三次OO作业.事实上,每一次作业对我来说都是很大的挑战,需要花费大量的时间和精力来学习. 虽然学得很艰苦,但最后还是连滚带爬地完成了.(好惨一 ...
- OO第一单元优化博客
OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)\)和\(cos(x)\)的指数作为坐标,在图上画出来就可 ...
- 【OO学习】OO第一单元作业总结
OO第一单元作业总结 在第一单元作业中,我们只做了一件事情:求导,对多项式求导,对带三角函数的表达式求导,对有括号嵌套的表达式求导.作业难度依次递增,让我们熟悉面向对象编程方法,开始从面向过程向面向对 ...
- OO第一单元(求导)单元总结
OO第一单元(求导)单元总结 这是我们oo课程的第一个单元,也是意在让我们接触了解掌握oo思想的一个单元,这个单元的作业以求导为主题,从一开始的加减多项式求导再到最后的嵌套多项式求导,难度逐渐提高,编 ...
- 【作业1.0】OO第一单元作业总结
OO第一单元作业已全部完成,为了使这一单元的作业能够收获更多一点,我回忆起我曾经在计算机组成课设中,经常我们会写一些实验报告,经常以此对实验内容反思总结.在我们开始下一单元的作业之前,我在此对OO第一 ...
- OO第一单元(前四周)作业总结
OO第一单元(前四周)作业总结 OO第一单元(前四周)作业总结要求(第四次作业) 0.前言 本次博客针对的是本人学习Java的第一阶段的三次作业的作业总结 第一次作业的内容是:7-1 计算税率 (20 ...
- 北航OO第一单元作业总结(1.1~1.3)
经过了三次作业之后,OO第一单元告一段落,作为一个蒟蒻,我初步了解了面向对象的编程思想,并将所学内容用于实践. 一.第一次作业 1.架构分析 本次作业需要完成的任务为简单多项式导函数的求解.表达式仅支 ...
- OO第一单元总结与反思
OO第一单元总结与反思 目录 OO第一单元总结与反思 摘要 第一次作业 本次作业UML类图 本次作业度量分析 第二次作业 本次作业的UML类图 本次作业的度量分析 第三次作业 本次作业的UML类图: ...
- 2020 OO 第一单元总结 表达式求导
title: BUAA-OO 第一单元总结 date: 2020-03-19 20:53:41 tags: OO categories: 学习 OO第一单元通过三次递进式的作业让我们实现表达式求导,在 ...
随机推荐
- Spring Boot微服务如何集成fescar解决分布式事务问题?
什么是fescar? 关于fescar的详细介绍,请参阅fescar wiki. 传统的2PC提交协议,会持有一个全局性的锁,所有局部事务预提交成功后一起提交,或有一个局部事务预提交失败后一起回滚,最 ...
- JVM运行、类加载的全过程
类加载机制:JVM把CLASS文件加载到内存,并对数据进行校验.解析和初始化,最终形成JVM可以直接使用的Java文件. 加载:把class文件字节码加载到内存中,并且将这些静态数据转换成方法区中的运 ...
- “帮你”APP——NABCD需求分析
1.你的创意解决了用户的什么需求?(N) 本学校已存在的失物招领.表白墙.二手市场等QQ群普遍存在信息冗杂,时效性差等缺点.不能充分发挥信息有效性的,我们的“帮你”APP能够充分发挥信息的有效性,让失 ...
- JEECG 3.7.8 新版表单校验提示风格使用&升级方法(validform 新风格漂亮,布局简单)
JEECG 表单校验采用的是validform,默认的校验提示需要占用页面布局,提示效果较传统.jeecg这个自定义的校验提示风格,不占用页面布局,提示效果也更美观,简单易用,让表单看起来更漂亮!!! ...
- webservice 教程
https://ke.qq.com/webcourse/index.html#cid=28875&term_id=100182700&taid=800324205965515& ...
- lombok踩坑与思考
虽然接触到lombok已经有很长时间,但是大量使用lombok以减少代码编写还是在新团队编写新代码维护老代码中遇到的. 我个人并不主张使用lombok,其带来的代价足以抵消其便利,但是由于团队编码风格 ...
- MySQL 登陆
#==========================登陆mysql ============================================ # 登陆用户名:-u,登陆IP: -h, ...
- 关于activity的一点总结(一)
关于activity的重点: 参考网址:https://blog.csdn.net/qq_26787115/article/details/52556842 一.activity生命周期. 二..启动 ...
- (项目六)Mha-Atlas-MySQL高可用方案实践
mha-mysql环境准备: 三台虚拟机,都安装了mysql,都关闭防火墙和selinux,同时在每台虚拟机上都做映射 软件包 1) mha管理节点安装包: mha4mysql-manager-0.5 ...
- CDH5.15.1 hive 连接mongodb配置及增删改查
1. 下载 wget http://repo1.maven.org/maven2/org/mongodb/mongo-hadoop/mongo-hadoop-hive/2.0.2/mongo-hado ...