20145319 实验二 “Java面向对象程序设计”
程序设计过程
实验内容
-
初步掌握单元测试和TDD
-
理解并掌握面向对象三要素:封装、继承、多态
-
初步掌握UML建模
-
熟悉S.O.L.I.D原则
-
使用TDD设计实现复数类
编写代码
-
思路: 创建一个complex类,将赋值、加、减、乘、除一一封装,再编写complex test检验即可
-
伪代码:
设计SetApart为complex取得实数部的值 设计SetBpart为complex取得虚数部的值 设计toString()输出字符串 设计函数complex add()完成加法操作并return complex q 设计函数complex minus()完成减法return complex q 设计函数complex multiply()完成乘法并return
-
产品代码:
public class complex { private int a; private int b; public void SetApart(int a){ this.a=a; } public void SetBpart(int b){ this.b=b; } public String toString(){ if(b<0){ return a+""+b+"i";//a和b中要加入一个字符,不然输出时侯就会先输出a+b的值 }//问题儿童二代码中虽然输出结果看上去正确但是不利于检验 return a+"+"+b+"i"; } public complex add(complex y){ complex q=new complex(); q.a=y.a+a; q.b=y.b+b; return q; } public complex minus(complex y){ complex q=new complex(); q.a=a-y.a; q.b=b-y.b; return q; } public complex multiply(complex y){ complex q=new complex(); q.a=-y.b*b+y.a*a;//虚数部之积要取反录入 q.b=y.a*b+y.b*a; return q; } public complex devide(complex y){ complex q=new complex(); q.a/=a; q.b/=b; return q; } }
-
调试代码:
import org.junit.Test; import junit.framework.TestCase; class complexTest extends TestCase { @Test public void test() {//b为负数时,输出以及运算 complex x=new complex(); complex y=new complex(); complex z=new complex(); complex a=new complex(); x.SetApart(5); x.SetBpart(6); y.SetApart(2); y.SetBpart(-3); z=x.add(y); a=x.multiply(y); assertEquals("2-3i",y.toString()); assertEquals("7+3i", z.toString()); assertEquals("28-3i", a.toString()); } @Test public void test2(){//a为0时,输出以及运算 complex ab=new complex(); complex cd=new complex(); complex ef=new complex(); complex gd=new complex(); ab.SetApart(0); ab.SetBpart(5); cd.SetApart(1); cd.SetBpart(4); ef=ab.minus(cd); gd=ab.multiply(cd); assertEquals("0+5i", ab.toString()); assertEquals("1+4i", cd.toString()); assertEquals("-1+1i", ef.toString()); assertEquals("-20+5i", gd.toString()); } @Test public void test3(){//b为0时,输出以及运算 complex ab=new complex(); complex cd=new complex(); complex ef=new complex(); complex gt=new complex(); complex hi=new complex(); ab.SetApart(7); ab.SetBpart(0); cd.SetApart(5); cd.SetBpart(9); ef=ab.add(cd); gt=ab.minus(cd); hi=ab.multiply(cd); assertEquals("7+0i", ab.toString()); assertEquals("5+9i", cd.toString()); assertEquals("12+9i", ef.toString()); assertEquals("2-9i", gt.toString()); assertEquals("35+63i", hi.toString()); } @Test public void test4(){//a为0,输出以及运算 complex ab=new complex(); complex cd=new complex(); complex ef=new complex(); complex gt=new complex(); complex hi=new complex(); ab.SetApart(0); ab.SetBpart(3); cd.SetApart(0); cd.SetBpart(7); ef=ab.add(cd); gt=ab.minus(cd); hi=ab.multiply(cd); assertEquals("0+3i", ab.toString()); assertEquals("0+7i", cd.toString()); assertEquals("0+10i", ef.toString()); assertEquals("0-4i", gt.toString()); assertEquals("-21+0i", hi.toString()); } @Test public void test5(){//a、b均为负数…… complex ab=new complex(); complex cd=new complex(); complex ef=new complex(); complex gt=new complex(); complex hi=new complex(); ab.SetApart(-3); ab.SetBpart(-7); cd.SetApart(6); cd.SetBpart(-4); ef=ab.add(cd); gt=ab.minus(cd); hi=ab.multiply(cd); assertEquals("-3-7i", ab.toString()); assertEquals("6-4i", cd.toString()); assertEquals("3-11i", ef.toString()); assertEquals("-9-3i", gt.toString()); assertEquals("-46-30i", hi.toString()); } }
单元测试总结
- 在本次试验中,我们第一次接触到了一种测试代码的方法,单元测试,相比我们自己编写complextest代码,使用一堆if ……else if语句来说,单元测试无疑简单了许多,也不用担心自己再写test程序时if……else语句出现逻辑上的问题,只需要使用assertEquals("理想结果",调用函数);而且可以测试多组数据,只需要复制第一个Test块,然后修改赋值语句即可,而且代码本身看上去也更加简洁,比较方便检查
UML使用
PSP时间统计
耗时(min) | 百分比 | |
---|---|---|
需求分析 | 10 min | 4 |
设计 | 10 min | 4 |
代码设计 | 40 min | 16 |
测试 | 120min | 52 |
分析总结 | 60min | 24 |