zoukankan      html  css  js  c++  java
  • 2018-2019-2-20175225 实验三 《敏捷开发与XP实践》实验报告

    一、实验内容与步骤

    1.安装、使用alibaba插件规范代码

    - 在IDEA的setting中找到plugins并搜索alibaba,点击install进行安装
    


    - 重启IDEA后,在代码中右击点击编码规约扫描就可以使用了
    对老师给的示例代码进行扫描后的结果如下:

    规范后的代码如下:

    public class CodeStandard {
        public static void main(String[] args) {
            StringBuffer buffer = new StringBuffer();
            buffer.append('S');
            buffer.append("tringBuffer");
            System.out.println(buffer.charAt(1));
            System.out.println(buffer.capacity());
            System.out.println(buffer.indexOf("tring"));
            System.out.println("buffer = " + buffer.toString());
            if (buffer.capacity() < 20) {
                buffer.append("1234567");
            }
            for (int i = 0; i < buffer.length(); i++) {
    
                System.out.println(buffer.charAt(i));
            }
        }
    }
    

    2.任务一:使用工具(Code->Reformate Code)格式化代码,并了解code菜单的功能

      - 使用工具(Code->Reformate Code)格式化代码
         - 在code中选择Reformate Code格式化代码
    

      - code菜单中的功能
         - Override Methods(ctrl+O):重载基本类的方法
    

         - Surround With(Ctrl+Alt+T):使用if-else、for、while等语句包装代码段
    

         - Comment with Line Comment(Ctrl+/):将本行变成注释
    

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

      - 搭档的Complex代码如下:
    
    package shiyan3;
    /**
     * @author zyr
     * @date  2019/4/30
    */
    public class Complex {
        // 定义属性并生成getter,setter
        double RealPart;
        double ImagePart;
        // 定义构造函数
        public Complex(){
            RealPart = 0;
            ImagePart = 1;
        }
        public Complex(double R,double I){
            ImagePart = I;
            RealPart = R;
        }
    
        //override Object
        public boolean Equals(Object obj){
            if(this == obj) {
                return true;
            }
            if(!(obj instanceof Complex)) {
                return false;
            }
            Complex complex = (Complex) obj;
            if(complex.RealPart != ((Complex) obj).RealPart) {
                return false;
            }
            if(complex.ImagePart != ((Complex) obj).ImagePart) {
                return false;
            }
    
            return true;
        }
        @Override
        public String toString()   {
            String string = "";
            if (ImagePart > 0)
                string =  RealPart + "+" + ImagePart + "i";
            if (ImagePart == 0)
                string =  RealPart + "";
            if (ImagePart < 0)
                string = RealPart + " " + ImagePart + "i";
            return string;
        }
        // 定义公有方法:加减乘除
        Complex ComplexAdd(Complex a) {
            double b=0,c=0;
            b = RealPart+a.RealPart;
            c = ImagePart+a.ImagePart;
            System.out.println("("+RealPart+"+"+ImagePart+"i) + ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
            return  new Complex(b,c);
        }
        Complex ComplexSub(Complex a) {
            double b=0,c=0;
            b = RealPart-a.RealPart;
            c = ImagePart-a.ImagePart;
            System.out.println("("+RealPart+"+"+ImagePart+"i) - ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
            return  new Complex(b,c);
        }
        Complex ComplexMulti(Complex a) {
            double b=0,c=0;
            b = RealPart*a.RealPart;
            c = ImagePart*a.ImagePart;
            System.out.println("("+RealPart+"+"+ImagePart+"i) * ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
            return  new Complex(b,c);
        }
        Complex ComplexDiv(Complex a) {
            if(a.RealPart==0||a.ImagePart==0) {
                System.out.println("被除数不能为0,错误");
                return new Complex();
            }
    
            double d = Math.sqrt(a.RealPart*a.RealPart)+Math.sqrt(a.ImagePart*a.ImagePart);
            double b=0,c=0;
            b = (RealPart*a.RealPart+ImagePart*a.ImagePart)/d;
            c = Math.round((RealPart*a.ImagePart-ImagePart*a.RealPart)/d);
            System.out.println("("+RealPart+"+"+ImagePart+"i) / ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
            return  new Complex(b,c);
        }
    }
    
      - 要测试的类testAd、testSub、testMulti、testDiv
      - 测试代码如下:
    
    package shiyan3;
    
    import junit.framework.TestCase;
    import org.junit.Test;
    public class ComplexTest1 extends TestCase {
        Complex complex = new Complex(1, 1);
        @Test
        public void testAdd() {
            assertEquals(new Complex(3.0, 3.0), complex.ComplexAdd(new Complex(2.0, 2.0)));
        }
        @Test
        public void testSub() {
            assertEquals(new Complex(-5.0, -2.0), complex.ComplexSub(new Complex(6.0, 3.0)));
        }
        @Test
        public void testMulti() {
            assertEquals(new Complex(3.0, 2.0), complex.ComplexMulti(new Complex(3.0, 2.0)));
        }
        @Test
        public void testDiv() {
            assertEquals(new Complex(1.0, 1.0), complex.ComplexDiv(new Complex(1.0, 1.0)));
            assertEquals(new Complex(0.0, 0.0), complex.ComplexDiv(new Complex(1.0, 0.0)));
            //边缘测试
        }
    }
    

    将测试代码传到搭档的码云,git log如下:

    4.任务三:重构

      - 重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。
      - 修改软件的四种动机:
         - 增加新功能
         - 原有功能有BUG
         - 改善原有程序的结构
         - 优化原有系统的性能
      - 需要重构的地方
         - 代码重复
         - 方法过长
         - 参数列过长
         - 条件逻辑过度复杂
         - 分支语句
      - 一个完整的重构流程应包括
         - 从版本控制系统代码库中Check out code
         - 读懂代码(包括测试代码)
         - 发现bad smell
         - Refactoring
         - 运行所有的Unit Tests
         - 往代码库中Check in code
      - 重构1:添加作者和日期
    

      - 重构2:重写Equals时的@override标志
    

      - 重构3:规范方法名
    


    修改后的代码

    package shiyan3;
    /**
     * @author zyr
     * @date  2019/4/30
    */
    public class Complex {
        // 定义属性并生成getter,setter
        double RealPart;
        double ImagePart;
        // 定义构造函数
        public Complex(){
            RealPart = 0;
            ImagePart = 1;
        }
        public Complex(double R,double I){
            ImagePart = I;
            RealPart = R;
        }
    
        //override Object
        public boolean Equals(Object obj){
            if(this == obj) {
                return true;
            }
            if(!(obj instanceof Complex)) {
                return false;
            }
            Complex complex = (Complex) obj;
            if(complex.RealPart != ((Complex) obj).RealPart) {
                return false;
            }
            if(complex.ImagePart != ((Complex) obj).ImagePart) {
                return false;
            }
    
            return true;
        }
        @Override
        public String toString()   {
            String string = "";
            if (ImagePart > 0)
                string =  RealPart + "+" + ImagePart + "i";
            if (ImagePart == 0)
                string =  RealPart + "";
            if (ImagePart < 0)
                string = RealPart + " " + ImagePart + "i";
            return string;
        }
        // 定义公有方法:加减乘除
        Complex ComplexAdd(Complex a) {
            double b=0,c=0;
            b = RealPart+a.RealPart;
            c = ImagePart+a.ImagePart;
            System.out.println("("+RealPart+"+"+ImagePart+"i) + ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
            return  new Complex(b,c);
        }
        Complex ComplexSub(Complex a) {
            double b=0,c=0;
            b = RealPart-a.RealPart;
            c = ImagePart-a.ImagePart;
            System.out.println("("+RealPart+"+"+ImagePart+"i) - ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
            return  new Complex(b,c);
        }
        Complex ComplexMulti(Complex a) {
            double b=0,c=0;
            b = RealPart*a.RealPart;
            c = ImagePart*a.ImagePart;
            System.out.println("("+RealPart+"+"+ImagePart+"i) * ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
            return  new Complex(b,c);
        }
        Complex ComplexDiv(Complex a) {
            if(a.RealPart==0||a.ImagePart==0) {
                System.out.println("被除数不能为0,错误");
                return new Complex();
            }
    
            double d = Math.sqrt(a.RealPart*a.RealPart)+Math.sqrt(a.ImagePart*a.ImagePart);
            double b=0,c=0;
            b = (RealPart*a.RealPart+ImagePart*a.ImagePart)/d;
            c = Math.round((RealPart*a.ImagePart-ImagePart*a.RealPart)/d);
            System.out.println("("+RealPart+"+"+ImagePart+"i) / ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
            return  new Complex(b,c);
        }
    }
    

    4.任务四:以结对的方式完成Java密码学相关内容的学习,结合重构,git,代码标准Java密码学相关内容的学习

    和搭档对各种算法进行学习研究后,我们选择了MD5算法:

    使用Java计算指定字符串的消息摘要,java.security包中的MessageDigest类提供了计算消息摘要的方法

    • 首先生成对象,执行其update()方法可以将原始数据传递给该对象,然后执行其digest( )方法即可得到消息摘要。具体步骤如下:

      • 生成MessageDigest对象:MessageDigest m=MessageDigest.getInstance("MD5");
      • 传入需要计算的字符串:m.update(x.getBytes("UTF8" ));
      • 计算消息摘要:byte s[ ]=m.digest( );
      • 处理计算结果(必要的话可以使用如下代码将计算结果s转换为字符串)
    String result="";
    for (int i=0; i<s.length; i++){
       result+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6);
    }
    
    • 产品代码:
    import java.io.UnsupportedEncodingException;
    import java.security.*;
    
    public class MD5Encrypt {
        public static void main(String args[]) throws Exception {
            String originalStr = args[0];
            MessageDigest m = null;
            try {
                m = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            try {
                m.update(originalStr.getBytes("UTF8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            byte byteStr[] = m.digest();
            GetResult getResult = new GetResult();
            for (int i = 0; i < byteStr.length; i++) {
                getResult.result += Integer.toHexString((0x000000ff & byteStr[i]) |
                        0xffffff00).substring(6);
            }
        }
    
        public static class GetResult {
            String result = "";
        }
    }
    

    • 测试类
    /*测试输入输出*/
    String str = new String(originalStr);
    System.out.println("明文:" + str);
    System.out.println("密文:" + getResult.result);
    

    代码托管

    实验体会与总结

    我通过本次实验学会了如何规范、格式化代码,如何将搭档加入自己的码云项目并进行合作编写代码,如何重构以及Java密码学相关知识。在自己上手实践操作过程中,加深了对平时不清楚的知识点的理解,也掌握了重构等新知识点。

  • 相关阅读:
    解决浏览器兼容改内容的函数
    iPhone 和Android应用,特殊的链接:打电话,短信,email
    ArrayList和LinkedList的区别
    关于HashTable,HashMap和TreeMap的几点心得
    Android开发--List与ArrayList区别
    Android 版本升级涉及到的数据库数据迁移问题
    深入理解Android的startservice和bindservice
    Android之Activity的四种启动模式
    控制反转与依赖注入
    vi/vim基本使用方法
  • 原文地址:https://www.cnblogs.com/zhangdeshuai/p/10812910.html
Copyright © 2011-2022 走看看