写在前面

  在接触OO课程之前,自己是完全没有学习过java语言的,因此作为一名初的不能再初的初学者,无论是在哪方面都会有许多茫然,但是我相信通过一次次认真的完成OO作业,我对面向对象的理解应该会渐渐的深入,就写在博客上记录下我的点滴的收获。下面是我对前三次作业的分析与体会。

作业分析

(一)第一次作业

  类图如下:

  度量分析如下:

代码分析:   

  因为第一次作业对面向对象编程几乎没有概念,因此就当是按照C程序那样编写,现在一看这就是完全的面向过程的编程方法。在一个class里面定义了完成该程序需要的几个方法,比如判断合法性、提取项、计算、简化等,然后在main函数中顺着自己(读取->判断->拆分->求导->合并同类项)的思路编写。而通过上图的方法的度量可以看出,ev(G)基本复杂度普遍比较高,说明第一次程序的结构化程度比较低,这样增大了程序的理解难度,并且也难以进行代码维护。

  这次作业我优化方式是采用的每计算出一个项来,就将它的系数与指数用特殊字符连成一个字符串然后压入一个ArrayList数组中,然后在压入数据时,遍历之前已经压入的,如果指数相同就进行合并,最后输出总的表达式。但是存在比较大的一点疏忽是类似(a - b) 是要比(-b + a) 有效长度短一些的,由于这一点没考虑到,因此影响到了自己的性能分。

(二)第二次作业

  类图如下:

  度量分析如下:

 

代码分析:

  这次作业我是采用三元组的方式完成的,即a * x^b * sin(x) ^ c * cos(x) ^d。由上图可以看到这次作业分了4个类,其中Work类即主程序执行main函数,Ifvalue负责对输入进来的表达式进行合法性判断与拆分,Hanterm类进行项的处理与简化,在Dercom类中进行运算。而我这次的优化与第一次几乎一样,只不过这次是变为往ArrayList数组中压入四个参数组成的字符串,但是处理方式还是没有变化。

  值得一提的是,虽然这次勉勉强强的为程序分了class,但是细看的话还是有很大部分是面向过程的。感觉写的时候就是本着要用哪些类完成哪些过程、实现哪些结果的目的而创建的类。这样还是有一些面向过程的,比较明显的是通过上面的类图可以发现每个类里面的参数几乎只是为了这次作业而做的,也就是说没有一定的独立性,当单独拿出来一个时,可应用性就不大了,并不能实现像java自定义的那些类(比如String)一样即能实现一些特定的功能,又能保证适当的独立性。用比较通俗的语言来说就是我感觉这些类是从这个程序的一个类里面拆分出来的方法组成的集合吧,我认为这主要是我对类的理解还没有多么深入而导致的,总归是需要慢慢探索学习的。

(三)第三次作业

  类图如下:

  度量分析如下:

代码分析:

  这次作业我的主要思路是先假想输入的表达式为一个合法的字符串,然后按照一定的规则以'+'分隔出各个项,然后再以'*'分隔出各个因子,如果遇到括号,那么久一直记录直到遇到与其相对应的右括号才结束,然后将所有因子依次用正则表达式匹配,共有五种形式(常数, x, sin, cos, (.+)),匹配到哪个格式就新建相应的类,然后在类里面进行相应的简化与计算;如果这五种格式都没有匹配到的话,那就进入异常处理的类,直接输出WF。

  我认为第三次作业才算是真正一次我对类的一种比较正确的使用方法的一次尝试,在这次作业里我分别建立了term类与factor类进行相应的处理,同时建立了x,sin等不同形式因子的类,针对不同的类有不同的处理方式。但是让我感到遗憾的是本来在设计中设计的借口与继承在真正编写时却没有用到,所以我在编写程序时还是有一定量的代码复用的。这是我设计上的失误,没有完全设计好应该怎样去办。

BUG分析

  前面两次作业因为思维量并不是很大,所以我在想好思路后尽可能的考虑输入可能出现的各种情况,因此在强测与互测中都没有被狼到。但是这应该并不是代表我的程序就没有Bug了,记得老师上课还说过我们的程序一定有或多或少的Bug呢~但是刚刚上面提到的一个优化的问题是我直到看到第二次强测结果后才意识到的,所有关于(a - b)与(-b + a)的问题我都没有考虑到,因此前两次作业虽然我在自己的能力范围内都尽力去把优化做好,但一直没有拿到比较高的性能分。

  然而第三次作业我是的的确确出现了两个比较致命的Bug。一个是我在对括号内的因子求导时直接提取出了里面的内容,并没有考虑到括号外面的符号的问题,换句话说,只要评测中出现了-()之类的内容,我输出的结果应该就是错误的。第二点是我在对项进行拆分的时候没有考虑到式子中kennel出现类似 ^ +2  、 * +2 这样的部分,因此我对项的拆分时会将这部分也拆分,这就导致了本来正确的输入被被我硬生生的搞成WF。

  我觉得导致自己出现这些bug的原因主要有两点。一点是由于一开始好长时间都对第三次作业不知道该如何去处理,直到周一晚上之前我一直处于苦恼的过程中,当时只是打算把表达式的项拆分掉,这就导致了对所出现的情况没有考虑全,因此就写出了Bug。第二点是我之前写代码总是想先把思路完全给弄通了然后在去整体的额写,这就会导致我可能在设计的时候会对哪几方面设计的不完全,因此在写的时候也就没有考虑到,由此又回写出Bug。

  我在hack其他同学时不论是使用脚本,还是对同学依次测试,我都会先对一些可能的边界情况进行检测,就比如输入只有一个因子,结果化简完之后因子全是0等情况,因为我觉得一方面有可能同学们在编写代码的时候就默认了这是个有许多项的多项式,另一方面有可能同学们在优化时会有些放松,就有时难以考虑到全是0的情况,就会导致没有输出结果了。

体会与感受

  总之我觉得这第一单元的三次作业一定程度上应该只能算是OO课程的入门考试吧,虽然自己在写的时候会遇到许多困难,但是也都是慢慢被虐过来了。。而在这三次训练中,我从一开始的不知道什么是方法,为什么要分class到现在已经对class、对接口、对继承、对抽象类渐渐有了一些理解了,我相信欠缺的许多知识与相关方面的理解总会通过后面的练习而慢慢去理解与运用的,我们同学就把学习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. OO第二单元小结

    OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...

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

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

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

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

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

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

随机推荐

  1. 【java】异常

    异常体系:Throwable ---Error 通常出现重大问题:如类不存在或者内存溢出.停止运行,不对代码进行处理 ---Exception 在运行时出现的情况,可以进行针对性处理.可以通过try ...

  2. react优缺点

    优点: 1.面向组件,方便组件的复用. 2.从操作dom改为操作state. 缺点: 1.html和javascript较高耦合,不方便分工开发. 2.当一个页面中两处元素组件有相关性时,父组件会非常 ...

  3. jenkins 构建完毕后接着构建另外一个构建的方法

  4. 关于anaconda中jupyter notebook错误

    anaconda这个软件是真的坑,其中的jupyter notebook每次都会出错,不知道,为什么,可惜我的pycharm装tensorflow一直有错误,不然,真想卸了这个软件. 会莫名其妙闪退, ...

  5. ArcGIS紧凑型缓存存储格式分析

    by 蔡建良 2018-8-24 网络中我看到的网文将bundle存储切片数据的方式都没说清或是说错.按照错误方法一样可以在桌面浏览,但在arcgis for android却无法浏览. bundlx ...

  6. unity最基本操作

    1. 2017.1.0  2017.1.1 2017.2.0 2017.3.4  5.5.3  p4 小版本号高出现bug可能性更小:一台电脑可以安装多个版本的unity,但是需要安装在不同路径:安装 ...

  7. js对象原型prototype

    javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用. 每一个构造函数都有一个属性叫做原型 1.1. 原型法设 ...

  8. ct

    b80e00u9dxwpqw7bt98rm5zmlxt08cxs A3WKXKBHWDUOEOP3EVJA2YRM6JSZPJWGTCQ5BSYAWI4GMSIXOAT2IQ

  9. (转)SQLServer_十步优化SQL Server中的数据访问五

    第九步:合理组织数据库文件组和文件 创建SQL Server数据库时,数据库服务器会自动在文件系统上创建一系列的文件,之后创建的每一个数据库对象实际上都是存储在这些文件中的.SQL Server有下面 ...

  10. orcad 自带常用原理图库解析

    在cadence 安装目录下文件夹\Cadence\SPB_16.6\tools\capture\library 中有如下常用库,只是部分常用的库,还有很多不常用的也都在目录下面, 1.AMPLIFI ...