OOP第一章总结
经过了三周的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第一章总结的更多相关文章
- OOP 第一章作业总结
程序设计结构分析 类图分析 第一次作业 由于第一次作业完成的功能比较简单,而且出于对面向对象设计理念不熟悉(其实现在也不是很熟悉,逃),整个程序设计的非常简单.通过类图(见下)可以看出,程序只有两个类 ...
- Java OOP——第一章 对象和封装
1.软件出现的目的: 用计算机的语言描述现实世界 用计算机解决现实世界的问题 ◆面向对象设计和开发程序的好处: 交流更加流畅 提高设计和开发效率 计算机语言的发展向接近人的思维方式演变 ...
- 第一章 C++简介
第一章 C++简介 1.1 C++特点 C++融合了3种不同的编程方式:C语言代表的过程性语言,C++在C语言基础上添加的类代表的面向对象语言,C++模板支持的泛型编程. 1.2 C语言及其编程 ...
- 学习笔记(一)--->《Java 8编程官方参考教程(第9版).pdf》:第一章到六章学习笔记
注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.违者本人不负法律责任.违法者自负一切法律责任. ...
- Spring3实战第一章 Aop 切面 XML配置
刚看spring3实战书籍第一章 切面以前没有关注过 现在看到了 随手试验一下 AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Objec ...
- C++ Primer Plus学习:第一章
C++入门第一章:预备知识 C++简介 C++融合了三种不同的编程方式: C语言代表的过程性语言. C++在C语言基础上添加的类代表的面向对象语言. C++模板支持的泛型编程. C++简史 20世纪7 ...
- 为什么我要放弃javaScript数据结构与算法(第一章)—— JavaScript简介
数据结构与算法一直是我算比较薄弱的地方,希望通过阅读<javaScript数据结构与算法>可以有所改变,我相信接下来的记录不单单对于我自己有帮助,也可以帮助到一些这方面的小白,接下来让我们 ...
- C++ Primer Plus 第一章 预备知识
C++ Primer Plus 第一章 预备知识 知识点梳理 本章主要讲述了C++的由来,讨论了面向过程语言与面向对象语言的区别,介绍了ANSI/ISO制定的C++标准,阐述了在Windows.Mac ...
- 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...
随机推荐
- UML和设计模式原则总结
UML总结: uml就是统一建模语言,包括语义概念 标记符号和指南 具有静态 动态 环境上的和组织性的部分 .它不是编程语言.uml预览它涉及的主要领域有结构性(静态视图,用例视图,构件图,实现视图, ...
- cookie跨域那些事儿
一个请求从发出到返回,需要浏览器和服务端的协调配合.浏览器要把自己的请求参数带给服务端,服务端校验参数之后,除了返回数据,也可能会顺便把请求是否缓存,cookie等信息告诉浏览器.当请求是跨域请求的时 ...
- Spring框架的介绍
1.Spring框架的结构 由持久层.表现层.中间模块和测试层组成. 持久层:和数据接触.事务管理 表现层:对数据进行处理 中间模块:核心功能 测试层:用来测试完整度 核心功能介绍 1.1 控制反转 ...
- DFS 深搜专题 入门典例 -- 凌宸1642
DFS 深搜专题 入门典例 -- 凌宸1642 深度优先搜索 是一种 枚举所有完整路径以遍历所有情况的搜索方法 ,使用 递归 可以很好的实现 深度优先搜索. 1 最大价值 题目描述 有 n 件物品 ...
- CVE-2010-3333-office RTF栈溢出漏洞分析
0x00 前言 此漏洞是根据泉哥的<漏洞战争>来学习分析的,网上已有大量分析文章在此只是做一个独立的分析记录. 0x01 复现环境 操作系统-->windows7 x64 软件版本- ...
- Java代码度量分析工具:DesigniteJava简介
前言 在Java面向对象课程的学习过程中,我们需要使用度量工具来分析自己程序的代码结构.受OO课程组以及前辈们博客提醒,笔者找到了DesigniteJava这款软件,现对此软件进行简单的说明. 一.D ...
- Gateway的限流重试机制详解
前言 想要源码地址的可以加上此微信:Lemon877164954 前面给大家介绍了Spring Cloud Gateway的入门教程,这篇给大家探讨下Spring Cloud Gateway的一些其 ...
- 【Azure 应用服务】App Service/Azure Function的出站连接过多而引起了SNAT端口耗尽,导致一些新的请求出现超时错误(Timeout)
问题描述 当需要在应用中有大量的出站连接时候,就会涉及到SNAT(源地址网络转换)耗尽的问题.而通过Azure App Service/Function的默认监控指标图表中,却没有可以直接查看到SNA ...
- 05.ElementUI源码学习:项目发布配置(github pages&npm package)
0x00.前言 书接上文.项目第一个组件已经封装好,说明文档也已编写好.下面需要将说明文档发布到外网上,以此来展示和推广项目,使用 Github Pages功能实现.同时将组件发布之 npm 上,方便 ...
- 02- APP需求分析与APP测试流程
在展开一轮测试的时候,我们要遵循一个规范的流程. APP测试流程: 项目立项:简单介绍项目内容是什么? 需求评审:开发,测试,和产品. 分析需求:编写测试用例 测试用例评审:一般测试团队参加,测试点是 ...