经过了三周的OO,尽管过程不太轻松,但是有所得还是值得欣慰的事!


(1)程序结构

第一次作业:

  UML类图如下,第一次作业在结构上并没有太多面向对象的思想,只是简单的分类,一个运行类,两个对象类,预处理都是直接在运行类进行的,所以有点乱(于是第二次果断重写了-_-!)

  复杂度如下,因为带有一定面向过程的原因,写的也没有特别复杂,所以看数据还好,但是在结构上不得不承认,确实是很糟糕,完全无法扩展,以至第二次作业得重新布局,不过也确实在重新构思的过程中理解了第一次的问题所在,明白了面向对象从人的思维角度出发的特点,尽管如此,第二次作业还是写的有点乱。

第二次作业:

  第二次作业主要加入了三角函数,理论上基于第一次作业进行扩展并不会很难,而且也使用了继承和多态,并且思考了如何为第三次作业的扩展进行服务。

  通过类图可以看出,父类为Factor(因子),子类有四个,常数,幂函数,sin(x)以及cos(x),然后Poly类为多项式,Term类为项;Poly包含Term,Term包含Factor。RegEx类用来进行正则处理,Optimize类用来优化,Main为运行类。

(由于方法太多,这里放的是类的复杂度)

  因为基本的处理都是在mian里面,所以main的复杂度很高,但是相比第一次,程序的逻辑更清晰,当然代码量也有了很大的增加(这里有个小疑问,是不是结构的层次化和清晰就意味着大量的代码呢?在读hdl代码时发现他的结构在我看来无比复杂,而且代码很多,但是考虑的确实很全面,)。

  至于第二次作业的优化,在合并同类项的基础上只考虑了sin^2+cos^2=1这种情况,由于不会使用随机优化这种东西,导致优化的很差。

第三次作业:

  第三次作业加入了嵌套和表达式因子,个人做法是递归判断并且处理,但是没有使用助教所讲的那种递归下降法,而是直接在类的创建和求导过程中递归求解,这种做法的好处是只需要递归一次就可以得到不优化的结果(我的架构在优化时必须再次递归优化,而且bug很多,但是只要不优化,就没有问题^-^)。以下是类图:

结构还算清晰,基本思路也比较符合助教的思路,就是递归考虑:

1)首先处理多项式,利用运算符“+”和“-”来进行分割,此处需要判断运算符

2)对第一步分割出来的Term项进行处理,利用“*”进行分割,产生因子(Factor)

3)对不同种类的因子进行不统的处理(这里共有五个子类:常熟,幂函数,sin,cos,和表达式因子)

4)每个因子类重写求导接口,最后递归输出(为了保证正确,需要大量的括号,也给优化带来很大的麻烦)

以下是复杂度:

  可以看到,那个Handle类神奇的突破了60(好吧,我就是把所有处理方法写到了一个地方)

  所以这里还有一个疑问,处理类该这么进行合理的分配呢?(输入处理,输出处理,求导处理等等???)

  对于第三次作业,优点可能就是不优化我就不会爆炸(其实是写了优化的,但是有些问题,不敢用了┭┮﹏┭┮)

  但是在处理过程发现还是有些问题,就像是接口这个东西,只是强行安在了求导上面,没有学会如何正确优雅的使用,再有就是预处理的问题,由于正则表达式在一开始不能使用,那么怎么全面的排除所有的WF让人头很大(骚的就是没有检查WF,不然我感觉自己的bug会出现很多),再者在优化时,思路是递归处理括号并且合并同类项,但是我也在同时担心,这样做会不会超时,不优化的情况下最后一个中测点跑了28M,尝试优化后40M+,就不太敢了,希望可以看到第三次作业的优化巨佬的代码学习一下!!

(2)自己的bug

  可能我是直接写了一个bug出来!代码百千行,bug处处藏!格式不规范,强测两行泪!

  第一次作业的bug主要是忘记了无脑空格,出现的原因是我在开始阶段判断了空串不合法,但是在空格替换后也可能出现空串,所以对于“         ”这种输入就会出错。

  第二次作业的bug是正则表达式不小心删掉了一个“+”(这谁想的到啊),关键还是强测没有测这个。。。。。。

还有一个bug是在优化1*-1*这种情况时,忽略了^-1这个东西,导致出现了sin(x)-cos(x)^2.....这种东西,是自己的优化背锅

  第三次作业的bug是不优化,对,没有优化就没有bug,所以这一次没敢加优化,也就没有显性的错误,至于WF,可能会有漏洞,但是自动化测试目前没有测出来。

(3)how to find a bug(对,就是a bug,那个狼人,说的就是你,找那么多干嘛?)

我的主要方法当然是——随缘大法,开玩笑的,不要当真,debug还是个苦力活

  仔细阅读代码固然是不可或缺的,但是上来先进行一次全面攻击,会使的找bug更有针对性,也更多容易发现bug,这里有个小想法,不知可不可行,就是开放其他人被hack数,这样就更利于去查找了,同时隐藏自己的被hack数,于是就更加不敢不去找bug了,当然风险就是南湖人数增加!但是从OO学习的角度来看,我知道他一定有bug时,就会无所不用其极的找问题,而且对于所有人hack的同质bug,被hack者一波就可以修复,本身并不会损失什么,当然最慌的就是我自己看不到自己的情况,这谁敢不好好查找(前提是大家心态都要好一点,不要太在意分数,但是发现问题对于学习应该更加有利才对,而且同质bug的策略也不会损失很多)。

以上是胡言乱语,不可轻易相信!

(4)重构?

  讲真,一个月的学习过去了,对于OOP,我可能还是处于弟弟阶段。对于面向对象这个东西,掌握的确实不好,一方面可能是时间比较少,在构思后容易害怕写不完就匆忙工作,导致效果不如人意;反思自己的做法,我认为,必要的系统看书学习是不可或缺的,之前以为看了网页上的java教程我就稳了,是稳了(挂科稳了,啥都不会),再者大量的练习真的是不可或缺的,诚然OO作业工作量大(但周五上机那个是真做不完),三次作业我总共写了2000行代码左右吧,其中不乏问题和bug。

  对于重构,在听完助教的parse递归处理方法后,感觉这个确实很诱人啊,准备去尝试一下,希望自己能重写成功吧(重构是不可能的了)。

OOP第一章总结的更多相关文章

  1. OOP 第一章作业总结

    程序设计结构分析 类图分析 第一次作业 由于第一次作业完成的功能比较简单,而且出于对面向对象设计理念不熟悉(其实现在也不是很熟悉,逃),整个程序设计的非常简单.通过类图(见下)可以看出,程序只有两个类 ...

  2. Java OOP——第一章 对象和封装

    1.软件出现的目的: 用计算机的语言描述现实世界 用计算机解决现实世界的问题   ◆面向对象设计和开发程序的好处:    交流更加流畅    提高设计和开发效率 计算机语言的发展向接近人的思维方式演变 ...

  3. 第一章 C++简介

    第一章  C++简介 1.1  C++特点 C++融合了3种不同的编程方式:C语言代表的过程性语言,C++在C语言基础上添加的类代表的面向对象语言,C++模板支持的泛型编程. 1.2  C语言及其编程 ...

  4. 学习笔记(一)--->《Java 8编程官方参考教程(第9版).pdf》:第一章到六章学习笔记

    注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.违者本人不负法律责任.违法者自负一切法律责任. ...

  5. Spring3实战第一章 Aop 切面 XML配置

    刚看spring3实战书籍第一章  切面以前没有关注过 现在看到了  随手试验一下 AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Objec ...

  6. C++ Primer Plus学习:第一章

    C++入门第一章:预备知识 C++简介 C++融合了三种不同的编程方式: C语言代表的过程性语言. C++在C语言基础上添加的类代表的面向对象语言. C++模板支持的泛型编程. C++简史 20世纪7 ...

  7. 为什么我要放弃javaScript数据结构与算法(第一章)—— JavaScript简介

    数据结构与算法一直是我算比较薄弱的地方,希望通过阅读<javaScript数据结构与算法>可以有所改变,我相信接下来的记录不单单对于我自己有帮助,也可以帮助到一些这方面的小白,接下来让我们 ...

  8. C++ Primer Plus 第一章 预备知识

    C++ Primer Plus 第一章 预备知识 知识点梳理 本章主要讲述了C++的由来,讨论了面向过程语言与面向对象语言的区别,介绍了ANSI/ISO制定的C++标准,阐述了在Windows.Mac ...

  9. 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...

随机推荐

  1. 竖式问题(JAVA语言)

    package 第三章; import java.util.Scanner; public class 竖式问题 { public static void main(String[] args) { ...

  2. ApiTesting全链路接口自动化测试框架 - 实战应用

    场景一.添加公共配置 我们在做自动化开始的时候,一般有很多公共的环境配置,比如host.token.user等等,如果这些放在用例中,一旦修改,将非常的不便.麻烦(尤其切换环境). 所以这里我们提供了 ...

  3. vue文本滚动组件

    看了好多网上的文本组件,发现好多都有这样那样的问题:特别是滚动的时候失真的感觉,今天整合了文本滚动的方式用CSS的 animation写出一套组件:VUE项目直接用.感觉有用的朋友关注下   效果图, ...

  4. 你要偷偷学会排查线上CPU飙高的问题,然后惊艳所有人!

    GitHub 20k Star 的Java工程师成神之路,不来了解一下吗! GitHub 20k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 20k Star 的Java工 ...

  5. PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) 目录 PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) ...

  6. 安装mongoDB出现的问题:无法启动

    在我的电脑- 管理 - 服务-中会出现一个MongoDB Server的服务,你需要去手动删除这个服务删除指令: 在cmd管理员模式下使用: sc delete MongoDB Server 然后再配 ...

  7. JS基础学习第一天

    JavaScript JavaScript负责页面中的的行为. 它是一门运行在浏览器端的脚本语言. JS的编写的位置 1.可以编写到标签的指定属性中 12 <button onclick=&qu ...

  8. 3步安装Python虚拟环境virtualenv

    1. pip安装必要库 pip install virtualenv -i https://pypi.douban.com/simple pip install virtualenvwrapper - ...

  9. 数据库MySQL一

    P252 1.MySQL 最为主要使用的数据库 my sequel 不容易查找数据 DB数据库 存储数据的仓库,它保存了一系列有组织的数据 DBMS数据库管理系统,数据库是通过DBMS创建和操作的容器 ...

  10. 玉帝传美猴王上天,大闹天宫之Java设计模式:命令模式

    目录 示例 改进代码 命令模式 定义 意图 主要解决问题 何时使用 优缺点 玉帝传美猴王上天 命令模式和策略模式的区别 示例 系统需要设计一个命令行界面,用户可输入命令来执行某项功能,系统的功能会不断 ...