2017-2018-2 20165207实验二《Java面向对象程序设计》实验报告

2017-2018-2 20165207实验二《Java面向对象程序设计》实验报告

课程:Java程序设计 班级:1652 姓名:李天林 学号:20165207
实验日期:2018年4月16日 实验序号:二


实验内容

单元测试

  1. 要求:需求是在一个名为MyUtil的类中完成将百分制分数转成“优、良、中、及格、不及格”五级制成绩。在写好产品代码之后,我要写测试代码测试正常情况、异常情况以及边界情况,这个过程要用Junit来完成
  2. 按照需求写伪代码。用IDEA在新建的20165207exp2目录下新建项目,然后新建一个类MyUtil,写进去伪代码:
  3. 根据我之前写的伪代码编写产品代码,之前写好的伪代码就是对这个产品代码最好的注释:
  4. 我的源代码应放在src测试代码在test目录,所以写测试代码之前需要新建一个目录,以下为相关的操作。首先,右击项目选择new选择directory:
    然后给新建好的test设置环境变量,也就是让IDEA知道这里存的是我的测试代码。在test上右击然后MakeDirectoryas之后选择testSourceRoot,这样就把这个文件夹设置成了存放测试代码的源文件的文件夹:
  5. 在test目录中编写测试代码MyUtilTest,其中的测试用例分为测试正常testNormal测试边界testBoundary测试异常testException三部分:
    然后编译运行,得到了如下的结果:
    看来在我手工编的测试代码里,这几个测试用例都通过了。
  6. 然后用Junit辅助的TDD的方式重写这个例子(生成测试代码)。在这之前我先要安装插件让程序具备用Junit生成测试代码的能力。首先,在设置(setting)的插件(plugins)选项卡中选择左下角的Install JetBrains plugins:

    实际上我点的是它右边的browse in ……才找到的JunitGenerator V2.0然后安装完成是这样的
    插件安装完成之后,重启我的IDEA,再在灯泡上选择createTest创建测试代码
    其间我也遇到了无法解析关键字Junit的问题(记录在下方问题记录中),按照教程修改一下我的路径再把junit.jar加进去之后,junit和testcase就不再为红色了
  7. 编写好三种情况的测试代码之后,运行,没有红条,通过了测试。完成了第一个提交点

以TDD的方式研究StringBuffer

  1. 输入老师给的StringBufferDemo代码,老师的代码中调用了StringBuffer中的charAt、length、capcity这几个方法,我自然应该把容量、实际长度、获取相应位置的字符这几方面写进我的测试代码里。
  2. 按照StringBufferDemo中调用的方法,将其更改为我的产品代码
  3. 写测试代码,测试我相应的产品代码中对字符串追加结果、输出长度、输出实际容量、获取相应位置的字符这几个方法
    根据测试过程中出现的几个问题(写在了下方问题记录中)修改测试代码为下图
    测试成功,完成了第二个提交点

在设计模式中添加代码使之支持short类

根据要求,我的学号07%6=1,我需要对系统进行扩充使之支持Short类。
首先,通过阅读,我对设计工厂模式,有了一定的理解,其中,Data类是抽象类规定了它的子类有显示取值的功能,抽象类Factory规定它的子类要生成Data类,生成Data类过程中通过对子类的上转型操作来让返回的子类类具有Data类的子类重写的方法。
所以要支持Short的话,我应增加Data类的子类Short,再增加Factory类的子类shortFactory。这样工厂就具备了创建Short类的上转型对象使之获得显示short型变量的值的能力。
最后为了输出short的值,我还需要在主类中修改使用上面那些类的语句。UML图大致如下
在程序中添加代码如下:
测试运行得到输出结果5207:

以TDD的方式开发复数类

题目要求的方法包括两个重载的构造方法complex、四个分别为加减乘除的方法、以及重写的两个方法:输出复数的方法toString以及判断是否与另一个复数相等的方法Equals。按照要求编写出如下的测试代码,相当于为我的complex类给出一个标准:
然后,在complex类中加入要求的这些属性和方法(中间的调试错误的过程记录在了下面的问题记录里):


在提交点4,运行complexTest测试其中的方法结果是否正确。

使用UML图对程序进行建模

之前我在工厂模式中添加short类时,对其用UML图进行建模
然后下面是实验二教程中用来说明多态的例子,Dog和Cat分别是抽象类Animal的子类,各自实现了Animal的“叫”的方法

问题记录

  1. 最开始编写我的MyUtilTest代码时,测试代码是自己手工编的,这里程序提示有错误:
    提示不能够从静态的上下文中引用非静态方法,按照这个提示我回到之前写的MyUtil中在方法前的修饰语句中加入static,程序不再报告错误。这个问题提示我基础中的漏洞以后应当注意。
  2. 找不到JunitGenerator:
    ,我后来点上一级的browse Repository找到的。
    但是解决了安装问题之后在生成的MyUtilTest2的代码中关键字Junit和Testcase是无法解析的,都是显示红颜色(找到正确的方法之前忘记截图了,故没有图片)。当时比较焦急,我没有继续看老师的教程,我觉得是缺少了某几个包文件于是就在自己的电脑上重装了一遍IDEA,但重装之后这几个关键字还是红色的。然后,我又在网上搜索这种情况,但基本上都不能解决我的问题。浪费好一段时间之后我发现老师在博客下面就写了要导入Junit.jar包的情况只是我的路径略有不同
  3. 在使用TDD的方式研究SringBuffer时,我在测试charAt方法时遇到了问题。程序报告中actual部分是S,except部分也是S,看起来是一样的但是不能通过
    ,后来我意识到charAt方法返回的是一个字符型变量也就是说它匹配的是单引号括起来的字符S,而不是我写的"S"
  4. 下面的问题出现在对复数类complex进行除法测试中。到提交刚结束时我才想明白问题出在哪里。最开始我让测试程序调用除法方法计算(1+2i)/(3+3i),但是程序计算出来的结果和我在纸上计算出来的正确结果不一样,测试结果一直是红色的,就是……这样子:
    可能是当时有些慌张,分析程序分析的特别蠢,我以为是0.5被程序读成了0。想了一会之后,我觉得在complex类的除法方法里加一条输出语句可以让我更接近事实一些
    然后在运行一次complexTest程序好像有一个了不得的事情
    计算复数除法时,有类似于多项式分式或者无理数分式分母有理化的技巧。比方说复数被除数是a+bi,复数除数是c+di,计算结果就等于分式
(a+bi)/(c+di)

这个分式分子分母同乘(c-di)就能够得到除法的结果

(ac-bd)/(c^2+d^2)+(ad+bc)i/(c^2+d^2)

在程序中我创建了一个新的复数对象b来表示上面分子分母同乘的(c-di)。
在我的测试用例(1+2i)/(3+3i)中,复数对象b就应该代表的是(3-3i)。在上面截下来的运行结果里可以看到,第二次assertEquals时,这个b对象就不对了,算出来的结果自然就不是1/6而是0.5。

看来还得回去分析程序,在提交刚结束的时候,我觉得问题就出现在我创建新复数对象b的方式上:
我希望b的实部与被除数的实部相等,b的虚部与被除数的虚部相反。于是先把被除数a的引用赋给了b,然后再把b的虚部取相反数。但这种操作其实就是把a当成b操作,a不是在和一个能给自己“有理化”的另一个和自己不一样的复数b相乘,而是在和自己乘。

我意识到了操作引用不当给我带来的问题,不再使用这种方法创建对象b:
单独测试了除法,输出正确,测试也通过了:


然后,这是我的与云班课无缘的提交点4和5的截图



总结

这次影响我实验完成时间主要有几个问题,在static的环境里调用非static的方法,因为新的对象没有创建时只能通过类名调用static方法,调用非stati是非法的;对对象的引用进行不当的赋值操作导致我的程序无法正确进行计算;还有就是博客里面的要求读的不认真。这几个问题大多涉及基础,我对前面几章的内容本身就掌握不牢或者有些淡忘,提示我要经常复习。另外除了调错的能力之外,这次实验我还有一些我认为有用的收获,比如用TDD的方式设计程序先给出一个标准,与直接设计程序相比可以避免设计力度过度或者不够,以及“工厂”的设计模式来满足S.O.L.I.D的原则

posted @ 2018-04-18 21:03  ltl0501  阅读(255)  评论(1编辑  收藏  举报