实验三

实验报告

一、实验内容与步骤

1.安装alibaba 插件,解决代码中的规范问题

  • file->setting->plugins 搜索 alibaba
    3-1.png
  • 重启IDEA,可使用编码规约扫描
    3-11.png

Code->Reformate Code重新格式化,研究一下Code菜单

3.10.png

  • Comment with Block Comment(Ctrl+Shift+/):将选中的代码块变成注释
    3-12.png
  • Comment with Line Comment(Ctrl+/):将本行变成注释
    3-13.png

2.下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例

import java.text.DecimalFormat;

public class Complex {
    double Real=0;
    double Imaginary=0;
    public Complex(){}
    public Complex(double Real,double Imaginary){
        this.Real=Real;
        this.Imaginary=Imaginary;

    }
    public double getReal(){
        return Real;
    }
    public double getImaginary(){
        return Imaginary;
    }
    public String toString(){
        String s = "";
        double r=Real;
        double i=Imaginary;
        if(r==0&&i==0){
            s="0";
        }
        else if(r==0&&i!=0){
            s=i+"i";
        }
        else if(r!=0&&i<0){
            s=r+""+i+"i";
        }
        else if(r!=0&&i==0){
            s=r+"";
        }
        else
        {
            s=r+"+"+i+"i";
        }
        return s;
    }
    public boolean equals(Object obj){//重写equals方法,使其不用来对比字符序列
        if(this==obj){
            return true;
        }
        else
            return false;
    }
    DecimalFormat df = new DecimalFormat( "0.0");
    public Complex ComplexAdd(Complex a){
        return new Complex(Real+a.getReal(),Imaginary+a.getImaginary());
    }
    public Complex ComplexSub(Complex a){
        return new Complex(Real-a.getReal(),Imaginary-a.getImaginary());
    }
    public Complex ComplexMulti(Complex a){
        double r=Real*a.getReal()-Imaginary*a.getImaginary();
        double i =Imaginary*a.getReal()+Real*a.getImaginary();
        return new Complex(Double.valueOf(df.format(r)),Double.valueOf(df.format(i)));
    }
    public Complex ComplexDiv(Complex a){
        double r=(Real * a.Imaginary + Imaginary * a.Real) / (a.Imaginary * a.Imaginary + a.Real * a.Real);
        double i=(Imaginary * a.Imaginary + Real * a.Real) / (a.Real * a.Real + a.Real * a.Real);
        return new Complex(Double.valueOf(df.format(r)),Double.valueOf(df.format(i)));
    }
}
  • 要测试的类getRealgetImaginarytoStringequalscomplexAddcomplexSubcomplexMulticomplexDiv
  • 测试代码
import junit.framework.TestCase;

public class Complex_pTest extends TestCase {
    Complex_p a=new Complex_p(2,3);
    Complex_p b=new Complex_p(0,1);
    Complex_p c=new Complex_p(-1,-2);
    public void testGetReal() {
        assertEquals(2.0,a.getReal());
        assertEquals(0.0,b.getReal());
        assertEquals(-1.0,c.getReal());
    }

    public void testGetImaginary() {
        assertEquals(3.0,a.getImaginary());
        assertEquals(1.0,b.getImaginary());
        assertEquals(-2.0,c.getImaginary());
    }

    public void testToString1() {
        assertEquals("2.0+3.0i",a.toString());
        assertEquals("1.0i",b.toString());
        assertEquals("-1.0-2.0i",c.toString());
    }
    public void testComplexAdd() {
        assertEquals("2.0+4.0i",a.ComplexAdd(b).toString());
        assertEquals("1.0+1.0i",a.ComplexAdd(c).toString());
        assertEquals("-1.0-1.0i",b.ComplexAdd(c).toString());
    }

    public void testComplexSub() {
        assertEquals("2.0+2.0i",a.ComplexSub(b).toString());
        assertEquals("1.0+3.0i",b.ComplexSub(c).toString());
        assertEquals("-3.0-5.0i",c.ComplexSub(a).toString());
    }

    public void testComplexMulti() {
        assertEquals("-3.0+2.0i",a.ComplexMulti(b).toString());
        assertEquals("4.0-7.0i",a.ComplexMulti(c).toString());
        assertEquals("2.0-1.0i",b.ComplexMulti(c).toString());
    }

    public void testComplexDiv() {
        assertEquals("-1.4-4.0i",a.ComplexDiv(c).toString());
        assertEquals("-0.2-1.0i",b.ComplexDiv(c).toString());
    }
}

shanyan3-2.png

重构

重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。

  • 修改软件的四种动机:
    增加新功能;
    原有功能有BUG;
    改善原有程序的结构;
    优化原有系统的性能 。
  • 需要重构的地方:
  1. 代码重复;
  2. 方法过长;
  3. 参数列过长;
  4. 条件逻辑过度复杂;
  5. 分支语句
  • 一个完整的重构流程应包括
  1. 从版本控制系统代码库中Check out code
  2. 读懂代码(包括测试代码)
  3. 发现bad smell
  4. Refactoring
  5. 运行所有的Unit Tests
  6. 往代码库中Check in code
  • 搭档代码
import java.text.DecimalFormat;//引入DecimalFormat包取一位整数和一位小数


public class Complex {
    double Real=0;
    double Imaginary=0;
    public Complex(){}
    public Complex(double Real,double Imaginary){
        this.Real=Real;
        this.Imaginary=Imaginary;

    }
    public double getReal(){
        return Real;
    }
    public double getImaginary(){
        return Imaginary;
    }
    public String toString(){
        String s = "";
        double r=Real;
        double i=Imaginary;
        if(r==0&&i==0){
            s="0";
        }
        else if(r==0&&i!=0){
            s=i+"i";
        }
        else if(r!=0&&i<0){
            s=r+""+i+"i";
        }
        else if(r!=0&&i==0){
            s=r+"";
        }
        else
        {
            s=r+"+"+i+"i";
        }
        return s;
    }
    public boolean equals(Object obj){//重写equals方法,使其不用来对比字符序列
        if(this==obj){
            return true;
        }
        else
            return false;
    }
    DecimalFormat df = new DecimalFormat( "0.0");
    public Complex ComplexAdd(Complex a){
        return new Complex(Real+a.getReal(),Imaginary+a.getImaginary());
    }
    public Complex ComplexSub(Complex a){
        return new Complex(Real-a.getReal(),Imaginary-a.getImaginary());
    }
    public Complex ComplexMulti(Complex a){
        double r=Real*a.getReal()-Imaginary*a.getImaginary();
        double i =Imaginary*a.getReal()+Real*a.getImaginary();
        return new Complex(Double.valueOf(df.format(r)),Double.valueOf(df.format(i)));
    }
    public Complex ComplexDiv(Complex a){
        double r=(Real * a.Imaginary + Imaginary * a.Real) / (a.Imaginary * a.Imaginary + a.Real * a.Real);
        double i=(Imaginary * a.Imaginary + Real * a.Real) / (a.Real * a.Real + a.Real * a.Real);
        return new Complex(Double.valueOf(df.format(r)),Double.valueOf(df.format(i)));
    }
}
  • 重构1:添加作者和日期
    4-0.png
  • 重构2:重写toString时的@Override标志
    4-1.png
  • 重构3:对类中的变量和方法进行封装
    4-2.png

三、实验体会与总结

  • 通过本次实验,我学习到了代码标准,代码重构等,还了解了敏捷与XP开发的基本知识和代码的规范性的重要。
posted @ 2019-05-05 12:13  20175233  阅读(186)  评论(0)    收藏  举报