我本着公平公开公正的态度作出以下评价:

1、面向对象真的很修身养性

2、有一个好的身体非常重要

3、互相hack可以暴露人的阴暗面

好了,步入正题。

一、作业分析

1、第一次作业分析

1.1类图

1.1.2基于度量的分析

由于只有两个类,而Deri()类几乎什么都没做的,导致Poly类的复杂度较高。一开始写OO当成面向过程来写,结果把大部分功能都放在构造函数里面一起实现了。

1.2心路历程思考过程

当时对于面向对象没什么概念,照着面向过程就去写代码了。第一次作业是简单的多项式,两个类解决问题,一个用来存储,一个用来求导。(事实上,在写代码的时候,求导过程和存储放在了一起,而Derivation类形同虚设,只是一个main()函数)。由于第一次的输入比较简单,和大部分人一样,我选择了大正则匹配,将匹配到的单项式存入Polynomial,并完成求导,再将求导结果返回给Derivativation。而格式判断的工作则是在正则匹配时不停地删去已匹配的项,若字符串最后为空,即格式正确。

1.3制造bug的原因

一个主要bug是空白符的问题,指导书中只要求space和\t,而我用\s实现的空格匹配。

2、第二次作业分析

2.1类图

2.1.2基于度量的分析

可以看出,实例化一个对象的复杂度较高,尤其是Poly类。这次作业和第一次作业一样,把大部分功能都放在了构造函数当中。

2.2思考过程

第二次作业引入了三角函数sin(x)和cos(x),相较于第一次的正则,这一次更加复杂,但是我们依然可以选择头铁的用大正则解决(会面临爆栈问题),这样就连格式判断的问题也一并解决了。在匹配到单项式之后,先进行通过replace操作将所有单项式符号归一化以方便后续处理(例如:删空格,删加号,减号合并),再对单项式进行逐个读入,存储系数和三个指数。并且增加了equal()方法和add()方法用来合并同类项。求导操作也是在Term类里完成的。最后的简化输出则由Poly类实现,但是在实现过程要不断向Term索要指数,系数,不得不增加geta(),getb(),getc(),getd()四个方法,这属于设计上的纰漏。

2.3制造bug的原因

在Term初步归一化时,前置负号没有处理(其实处理了,半夜误删了那一段代码)。

没有仔细看指导书,在Poly类里少了两种空格插入的情况。

3、第三次作业分析

3.1类图

3.1.2基于度量的分析

我对比了一下别人的代码复杂度,我第三次作业的复杂度算是炸了,可能是类太少,干得活太多.....除了Deri()类,其他类都挺辛苦的,我都不好意思分析了.....反正能者多劳吧,三个类都挺复杂的。好在这次不仅是构造函数比较辛苦,求导也复杂度比较高,一家人就应该整整齐齐。

2.2思考过程

第三次作业是最复杂的一次,也是我做得最简单的一次。大部分时间都花在了构思上,所以敲起代码反而得心应手。大正则的时代已经过去了,这次我选做了通过正负号来切分多项式,再通过乘号来切分因子。问题的难点在于括号的干扰,当然这对于大佬不是问题。我用了一个比较笨的办法,匹配到括号开始另一段正则匹配,数到相同数量的左右括号时再开始之前的加(乘)号匹配。对因子分情况求导,当因子是基础因子时(不含多项式)返回特定结果,因子不是特定因子时,对组成因子的多项式进行递归存储。这样存储以后,求导的时候就很简单,我们只需要把他的下一级看成一个整体,就可以很容易地表示出这一级的导函数,直到基础因子时,返回基础因子的导数。在返回导函数的同时,我还对系数,指数为0,和为1的情况在每一级进行化简,以减少递归时的计算压力。这样做的时候,输入格式判断也变简单了。只要上一级的输入,不满足这一层的接口,则抛出异常。可以看出,在整个计算过程中,我完全抛弃了int型(或BigInteger型)的变量,全部都是以String的形式进行传递,这样做简单粗暴,但是不利于最后的化简。不过对于我这样咸鱼玩家来说,也没有化简的必要了。

2.3制造bug的原因

对于输出结果,专门写了一个shortderi()方法,其中存在错误的化简。

没有仔细看指导书,无视了大整数,在factor类中错误地抛出异常。

4、总览

仔细看指导书会减少bug,减少因为“无知”产生的bug。

花时间放在构思上,比花时间放在修补上更值得。

二、分析bug的策略及问题

策略:

1、在自己写程序时,每注意到一个点,就写一个测试数据,到最后会有一个小规模的测试集,虽然这个测试集对于自己的程序没什么杀伤力,但对于别人的程序,可能是个不错的武器。

2、系统地构造wrong fromat的情况,尽可能排列出所有元素小于4个的组合

3、构造复杂的输入

4、脚本生成规范的输入,将输出结果与matlab自动比对

测bug的不足:

1、没有覆盖全面的format

2、没有覆盖全面的计算结果

PS:没有结合除自己以外被测者的代码设计结构构造样例。

北航OO第一单元总结的更多相关文章

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

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

  2. 2019年北航OO第一单元(表达式求导任务)总结

    2019面向对象课设第一单元总结 一.三次作业总结 1. 第一次作业 1.1 需求分析 第一次作业的需求是完成简单多项式导函数的求解,表达式中每一项均为简单的常数乘以幂函数形式,优化目标为最短输出.为 ...

  3. 2019北航OO第一单元作业总结

    一.前三次作业内容分析总结 前言 前三次作业,我提交了三次,但是有效作业只有两次,最后一次作业没能实现多项式求导的基本功能因此无疾而终,反思留给后文再续,首先我介绍一下这三次作业,三次作业围绕着多项式 ...

  4. 2020北航OO第一单元总结

    前言 学习面向对象这门课程的后的第一单元作业,主线是多项式求导,三次作业层层推进,由单一的幂函数求导,到幂函数和三角函数的复合求导,最后再到两种函数的嵌套求导,由两个类到重构后的十几个类,我逐渐对面向 ...

  5. 北航OO第一单元作业总结(Retake)

    前言:当我写这篇博客的时候,我的心情是复杂的,因为这实际上是我第二次写这篇博客--我今年重修的这门课.我对去年的成绩心有不甘--在激烈的竞争下,我虽然尽可能完成了所有作业(仅一次作业未通过弱测),但爆 ...

  6. 2020北航OO第二单元总结

    2020北航OO第二单元总结 前言 本单元考察基于多线程的电梯调度问题,成功让我从一个多线程小白到了基本掌握了使用锁来控制线程安全的能力,收获颇多(充分体验了迷茫地de一个又一个死锁bug的痛苦). ...

  7. OO第一单元作业总结

    oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...

  8. OO第一单元总结

    OO第一单元作业总结 一.前言 开学四周,不知不觉已经做了三次OO作业.事实上,每一次作业对我来说都是很大的挑战,需要花费大量的时间和精力来学习. 虽然学得很艰苦,但最后还是连滚带爬地完成了.(好惨一 ...

  9. OO第一单元优化博客

    OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)​\)和\(cos(x)​\)的指数作为坐标,在图上画出来就可 ...

随机推荐

  1. 关于Excel报错

    今天,用POI做一个Excel的导出时,总是报空指针错误.后来经过我仔细的查找翻阅日志才发现问题的真正所在: 报错如下: HTTP Status 500 - Request processing fa ...

  2. Oracle基础知识点——Oracle服务端和客户端

    Oracle服务端 服务端提供oracle服务的实例,其是数据库的核心,用于数据库的管理,对象的管理与存储.数据的存储.查询.数据库资源的监控.监听等一些服务. 例子:比如一台机子上安装了Oracle ...

  3. ZJOI 2014 星系调查(推导)

    题意 https://loj.ac/problem/2201 思路 说白了就是一条路径上有 \(n\) 个二维坐标,求一条直线使得所有点到此直线的距离和最小. 设这条直线为 \(y=kx+b\) ,距 ...

  4. Hadoop之HDFS概述

    一.HDFS产生背景及定义 1.HDFS产生背景 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文 ...

  5. Redis 持久化RDB 和AOF

    一.持久化之全量写入:RDB rdb配置 [redis@6381]$ more redis.conf save 900 1 save 300 10 save 60 10000 dbfilename & ...

  6. 如何解决WebBrowser.DocumentCompleted事件的多次调用

    转载:https://www.cnblogs.com/rchlz/archive/2009/02/27/1399274.html 关于DocumentCompleted事件,MSDN给出的解释是在文档 ...

  7. psycopg2+postgis+pgAdmin4

    基于docker的postgres 部署见这篇 https://www.cnblogs.com/xuanmanstein/p/7742647.html 连接数据库 import psycopg2cla ...

  8. pycharm上传代码到远程服务器

    本来不打算写了,可是,还是记不住 源自https://blog.csdn.net/zhangyu4863/article/details/80188207 我的是pycharm2018.1.4专业版: ...

  9. oracle 游标分析与理解(基础)

    --------------坚持写一点 慢慢成长 希望对大家有所帮助(小白的理解)  也是自己学习后的理解(只是一小部分,需要更深沉的还需日后成长) 接下来就是我们的重点 --游标 提供了一种对从表中 ...

  10. [经验]怎么删除“通过QQ/TIM发送到”右键菜单

      首先打开QQ主面板上的系统设置   选择[基本设置]-[文件管理]菜单,并将如图所示的选项去掉勾选即可