OO第一单元总结
OO第一次博客作业
前言:oo的三次作业让我很是自闭。但依旧希望不断继续学习面向对象的思想。
(1)基于度量来分析程序结构
oo第一次作业
第一次作业的难点主要在于用正则表达式处理输入的正则表达式。以及如何设计一个最简单的面向对象的程序构架。
类图:

度量:

点评:
缺点:
可以看出,第一次作业我并没有明确面向对象的真实意义,努力面向对象的同时,身体却情不自禁的选择了面向过程,因此我选择了将程序运行的主体Main函数直接放在了poly中。format也被直接写在了Polyy这个类中,现在看来,这也导致了polyy类中很多方法过于臃肿。
其次,没有完全理解正则表达式的作用,也就没有完全利用起来,下图的三个方法,当时的用处是用来判断非法情况,但是却是完全是使用的C语言方法去进行判断的。导致了大量的while以及代码重复。

更加合理的设计可能是。format类,ployy类,nape类,Main类。
优点:
在nape类的求导方法中,个人看来有两种选择
选择1:
使用nape.dervation()方法后,nape对象自身发生改变
选择2:
使用nape.dervation()方法后,nape对象自身不发生变化,但是返回一个是求导结果的Nape对象
但是通过os课程中助教大大的一篇函数式编程的文章(Functional Programming For The Rest Of Us),我体会到了函数式编程的优点。虽然oo是面向 对象编程而不是函数式编程。但是函数式编程中的一些特点如果部分用于面向对象中,也可以使得面向对象程序拥有函数式编程的优势。
即下图中的内容,原文引用自(Functional Programming For The Rest Of Us)。

也就是说,只要nape对象生成之后。外界无法再次修改Nape类中的成员变量。只能重新生成。或许在一个小型的程序中无法体现出这样做的优势。但是一旦程序变大,这样做将会使调试变得更见简单与方便。
故而经过反复衡量后我选择了第二种方式。

oo第二次作业
类图:

度量:

点评:
第二次作业我采用了三元组的实现方式。
优点:
易于实现。(摸)
缺点:
不易拓展。
oo第三次作业:
类图:


思路:构建表达式树。用中序遍历的方式进行递归求导
优点:开始使用继承,初步真实的体会到了什么时真正的面向对象。
缺点:可复用性依旧不是很强,应该在设立一套接口
(2)分析程序的bug
1.发现bug时理所当然的修改了眼前看到的冰山一角,修改了眼前,却没有看到后面的部分。以至于第一作业最后ddl时发现自己没有使用大整数,情急之下改出来的神仙代码。
从
coeff = Integer.parseInt(na.substring(0,temp - 1));
改成了
coefficient = new BigInteger(Integer.parseInt(na.substring(0,temp - 1))+"");
但是很明显可以看出,哪怕使用了大整数,依然是错误的,因为本质上范围依然不能超过int。
2.手误敲出来了bug,然后由于测试不周全没能测试到。
作业中出现过,对于常数项的输出,写成了system.out.println();
导致每一次输出常数时我就会产生换行。互测一下被hack了10多次
(3)发现别人程序的bug所采用的策略
在为互测的同学找bug时,我一般会先自己规划一些测试样例。对大家的代码(包括自己的代码进行统一测试),如果发现有人的代码出现了bug,就会打开他的代码去寻找他出现bug的原因。在这个途中,可能会发现他新的bug。以及其他人可能出现的bug。
当自己实在不能用手写的方式查出bug时,才会采用加特林突突突的方式。但是每当我找到一个bug,我就会去了解bug处的代码,尝试根据这个已知的bug去寻找他更多的非同质bug。哪怕不能找出,也可以为以后的测试提供一点方向。
(4)applying creational pattern
综合分析我的三次作业,前两次显得很不面向对象。而第三次比前两次稍好(但实际上应该是因为第三次不得不面向对象,否则太麻烦了...)在第三次作业中我主要使用了两重继承作为我的程序主要框架,但实际上还是不是很面向对象。可以使用接口的方式对程序进行改进。
浙公网安备 33010602011771号