I used to be enamored of object-oriented programming. I'm now finding myself leaning toward believing that it is a plot designed to destroy joy.

Eric Allman

一、基于度量来分析程序结构

总体:

第一次作业:在两个类中处理了所有多项式的求导,一个主函数控制输入并且处理字符串,格式不正确时报错;另外一个处理多项式并且求导。

第二次作业:在第一次作业的基础上讲多项式和单项式分离开来,由于每一项可以简化成(k,a,b,c)的函数,所以没有区分三角函数与单项式。

第三次作业:对第二次作业进行了重构,但依然没有使用继承与接口,将字符串处理完毕后输入Nest类分离加减项,再传入另一个类分离乘除项,分别有各自的求导方法,符合单项式或者单项三角函数或者数字为止。

基于量类的属性个数、方法个数、每个方法规模、每个方法的控制分支数目、类总代码规模,并计算了经典的OO度量,分析类的内聚和相互间的耦合情况,具体指标如下。


第一次作业:

类图:一个Main莽完所有……

度量分析:

可以看出,第一次作业中使用的类很少,并且使用了内部类,没有分离出来。一个main莽完了所有类,很多方法复杂度过高。对于字符串的处理采用了判断一项然后删除的方法,每一项分为了三个(常数,省略项,或者普通项),正则匹配的时候用了诸多if-else语句,增加了复杂度。求导化简时只是合并了同类项,对于正负的加减号没有进行有效的化简导致出错。因为只用了一个类,嵌套深度比较深。

第二次作业:

第二次作业在第一次的基础上做出了修改,因为每个单项可以化简成一个四元函数,于是抽象出两个单项式和多项式的类,分别有求导的方法。不足之处在于可扩展性很差,给第三次作业带来了很大的难度;此外,因为水平有限,除了合并同类项,对于三角函数繁多的化简也没有研究;最后,第一次作业中讲多项式处理输入也没有抽象出一个类,导致main里面有挤满了一堆代码。

第三次作业:

第三次作业对第二次作业进行了重构,因为对继承和借口的理解仍然有偏差,所以并没有运用到继承和借口。将字符串处理抽象出了一个input_handler的类,然后对于最基本的项建立了number和polyterm的类。字符串处理完毕之后输入Nest和Factor的类,两个类求导方法中反复迭代直到最后if-else判断是符合单项,再传入number和polyterm的求导。由于在类之间,多项式及其结果是以字符串的形式传递,化简起来比较麻烦,所以没有做相应的化简。

Factor和Nest的diff方法都有若干个if-else语句,复杂度和嵌套深度都很高。


二、BUG部分

主要分为格式错误的判断和输出结果两部分。

格式错误:

(1) 出现了要求之外的非法字符,比如\f \v:

对于字符串预处理的时候可以先判断是否含有规定字符之外的字符串。

当时偷懒用了\s识别所有的空格和\t,结果没有注意到其与空格差别,踩了坑。

(2)因子作为嵌套项时没有括号:

指导书上很明确的写了(然而第一遍我并没有认真读,我滚了

输出的时候也要注意在+-因子外面加上括号,为了保险起见我一股脑的括号全加上了,导致输出特别长,后来想想,两个基项和乘除项的括号应该可以省略。

(3)去括号时注意括号是否匹配:

最开始去掉不必要的括号时选择直接while循环去掉最外层的括号,但是形如(3*3)+(4*sin(x))就报错WF,发现去掉括号时需要判断是否匹配,于是加了个flag标志是否匹配判断。

(4)加减号重复:

项与项之间有符号,项本身还有符号,就可能造成多余的输出。最后replaceAll一下就好了。

输出错误:

(1)乘以1或者0的项

如果乘以0,当开始写的时候就不输出了,结果只有一个项的时候结果就比较尴尬;1也是类似的问题,自身再化简就容易输出格式错误。现在也没太想好怎么处理……

(2)略项前面的符号

省略项只能出现在首项中,否则就是格式错误……还是选择加括号好了……

等等等等。

如何构造测试样例

讨论课上看神仙们分享了自己写的对拍器,觉得很有实践价值与意义。我自己测试自己的时候仍然停留在针对能想出的错误类型,构造测试样例,然后输入IDLE用Python自带的包,随机选取数字,看看结果是否一致。


三、Applying Creational Pattern

面向对象的思想就应该是由简到繁,层层的递进,将所有要实现的功能抽象为类,而不是第一步该干什么,第二步该干什么,否则在多项式输入的时候WF的判断细节将会变得十分复杂。在每一次实践中我都在不断加深对面向对象的几大原则的理解……

单一职责原则,是指一个类的功能要单一。比如在第二次作业中,所有项都归结为 k*x^a*sin^b*cos^c形式,可以省时省力但可扩展性差。其次, 要遵循接口分离原则和继承接口, 模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。在第三次作业中观摩了其他小伙伴的作业,才恍然大悟求导可以提取出来作为一个接口,这样可以省去对于各个单项的判断。最后通过循环依赖,不停地讲表达式缩减(类似于表达式树),实现递归求导。


四、 总结

Java基础几乎为零,也缺乏实践指导的情况下,应该先熟悉基本编程思想,再纠结编程技巧……事实证明,一个坏的设计架构带来的麻烦不止一点,不将多种功能分离开而想一口气吃成个胖子的后果就是debug难度直线上升。

最大的感受就是,学好正则表达式,有秩序的建立类,少用ifelse,少用ifelse,少用ifelse。

QAQQAQQAQ我一定重新做人,哭了(x

前三次OO作业小结的更多相关文章

  1. 【作业】HansBug的前三次OO作业分析与小结

    OO课程目前已经进行了三次的作业,容我在本文中做一点微小的工作. 第一次作业 第一次作业由于难度不大,所以笔者程序实际上写的也比较随意一些.(点击就送指导书~) 类图 程序的大致结构如下: 代码分析 ...

  2. 前三次OO作业总结

    一.作业总结 前三次的任务都是表达式求导.这是我在高中就思考过的问题,但是很久都没有付诸实践,直到学习了"类"这个强大的工具.还有正则表达式,如果能适当使用,则不失为一个字符串格式 ...

  3. 2018-北航-面向对象-前三次OO作业分析与小结

    基于度量的程序结构分析 由于平时使用了NetBrains出品的IDEA作为IDE,在分析程序的时候我使用了IDEA的插件Metrics Reloaded.然而在使用时发现不懂得很多分析项目的含义,因此 ...

  4. 2018-北航-面向对象第三次OO作业分析与小结

    1. 规格设计的发展历史 规格设计用于对程序设提供分解,抽象等的手段.在撰写代码规格的时候,需要对组成部件进行抽象. 在1960s,软件设计出现危机,例如Dijkstra提出了goto语句的种种危害, ...

  5. oo作业总结(一)

    概述 经历了三次oo作业的洗礼,让我对java语言的强大以及面向对象编程有了初步的理解(当然,我是小白).本文接下来就将对自己这三次作业的代码进行分析以及分享自己的心路历程. 基础知识点考核 针对前三 ...

  6. OO前三次作业分析

    一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...

  7. OO前三次作业思考(第一次OO——Blog)

    OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...

  8. OO前三次作业总结

    一.第一次作业 1.程序设计分析 ![img](s1.ax1x.com/2018/04/02/CSgoSU.png) 图1 第一次作业类图 ![name](https://images2018.cnb ...

  9. OO第三单元作业小结

    一.JML理论基础及应用工具链情况 理论基础 1.JML表达式 \result:表示方法执行后的返回值. \old(expr):表示一个表达式expr在相应方法执行前的取值. \foall:全称量词修 ...

随机推荐

  1. 前端跨域(一):CORS

    上周做了一个移动端表单提交的页面,其中涉及到了跨域问题,想来也是惭愧,因为之前一直都没有遇到过这个问题,因此都没有深入探索过,只是知道有哪几种方式,这次终于借这个机会可以把遗留的知识点补一补了. 1. ...

  2. CSS制作环形进度条

    参考来源 <Radial progress indicator using CSS>,该文核心是用纯CSS来做一个环形的进度条.纯css的意思就是连百分比这种数字,都是css生成的.文章作 ...

  3. 原来你是这样的setTimeout

    先上代码 console.log("start"); setTimeout(function(){ console.log("Hello"); },200); ...

  4. php中include和require的区别(整理)

      require 的使用方法如 require("MyRequireFile.php"); .这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 requi ...

  5. [Java Web学习]JDBC事务处理

    1. Spring中加入数据库的bean <bean id="dataSource" class="org.apache.commons.dbcp.BasicDat ...

  6. HQL包含中文查询失败

    jdbc:mysql://172.16.9.6:3306/school?useUnicode=true&characterEncoding=UTF-8配置文件中的url加上编码,一般mysql ...

  7. 用python来自动玩类似跳一跳的小游戏

    最近春节,qq上出了一个叫穿越福城的小游戏.游戏的玩法类似挑一挑,也是通过一个个木桩.只不过把跳的过程变成了搭梯子.按的时间越长,梯子越长.梯子过长或者过短小企鹅都会掉下去,游戏失败.我的目的是用py ...

  8. BOM模型中常用对象 定义计数器 网页跳转 网页前进后退

    今天上午学了的BOM模型中常用对象,了解了一部分的属性 For循环的规律 外层循环控制行 内层循环控制列 <!doctype html> <html> <head> ...

  9. 【转载】【SQL练习】经典SQL练习题

    出处 https://blog.csdn.net/mrbcy/article/details/68965271 准备数据 建表语句 CREATE TABLE students (sno VARCHAR ...

  10. BLE和2.4G实现通信

    1. 背景 客户的项目是无线控制灯具,目前采用2.4G芯片,一端是2.4G遥控器,一端是2.4G灯具.现在客户的需求是在不增加成本的条件下增加手机APP控制.因为BLE芯片一般会比纯2.4G芯片价格高 ...