2018-2019-2 20175204 张湲祯 实验三《敏捷开发与XP实践》实验报告

2018-2019-2-20175204 张湲祯 实验三 《敏捷开发与XP实践》实验报告


实验三 Java面向对象程序设计

一.实验内容:

1.XP基础
2.XP核心实践
3.相关工具
4.编码标准:在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下Code菜单,找出一项让自己感觉最好用的功能。提交截图,加上自己学号水印。
5.搭档代码检验:在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后,下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例,测试成功后git add .; git commit -m "自己学号 添加内容";git push;
6.重构:完成重构内容的练习,下载搭档的代码,至少进行三项重构.


二.实验步骤

(一)编码标准

1.相关标准

具有说明性的名字
清晰的表达式
直截了当的控制流
可读的代码和注释
实现这些内容时一致所使用某些规则和惯用法

2.安装alibaba插件

参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD 安装alibaba 插件,解决代码中的规范问题。
打开Settings ->Plugins
在搜索框输入alibaba即可看到Alibaba Java Code Guidelines插件,点击Install进行安装,然后重启IDE生效:

3.在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下Code菜单,找出一项让自己感觉最好用的功能。提交截图,加上自己学号水印。

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));
}
}

4.使用:在项目名称上单击右键,在弹出菜单上选择编码规约扫描:

5.根据报错内容进行规范修改。

6.code相关功能

Override Methods ( 重写覆盖方法 ) Ctrl + O
Implements Methods( 实现接口方法 ) Ctrl + I
Gengrate ( 用于生成Construct、Getter/Setter、toString等) Alt + Insert
Surround With (使用if-else、for、while等语句包装代码段) Ctrl+Alt+T
SmartType ( 智能选择并实现 ) Ctrl + Shift + 空格
Cyclic Expand Word ( 循环往上选择单词 ) Alt + /
Cyclic Expand Word (Backwrad)( 循环往下选择单词 ) Alt + Shift + /
Expand ( 方法展开 ) Ctrl + 加号
Collapse ( 方法折叠 ) Ctrl + 减号
Expand Recursively ( 同上,方法展开 ) Ctrl + Alt + 加号
Collapse Recursively ( 同上,方法折叠 ) Ctrl + Alt + 减号
Expand All ( 全部方法展开 ) Ctrl + Shift + 加号
Collapse All ( 全部方法折叠 ) Ctrl + Shift + 减号
Expand doc comments ( 展开Java doc注释 )
Collapse doc comments ( 折叠Java doc注释 )
Insert Live Template ( 选择Live Templates模板 ) Ctrl + J
Surround with Live Template ( 选择Live Templates模板 ) Ctrl + Alt + J
Comment with Line Comment ( 行注释 ) Ctrl + /
Comment with Block Comment ( 块注释 ) Ctrl + Shift + /
Reformat Code( 格式化代码 ) Ctrl + Alt + L
Show Reformat File Dialog ( 弹出格式化弹框 ) Ctrl + Alt + Shift + L
Optimize Imports ( 去除未引用的包导入声明 ) Ctrl + Alt + O
Rearrange Code ( 重新整理代码 )


(二)搭档代码进行测试

1.将搭档拉入自己码云项目

2.下载搭档代码

public class Complex {
    double RealPart;
    double ImagePart;
    public Complex() {}
    public Complex(double R,double I) {
        RealPart = R;
        ImagePart = I;
    }
    public double getRealPart() {
        return RealPart;
    }
    public double getImagePart() {
        return ImagePart;
    }
    public boolean equals(Object obj) {
        if(this == obj)
            return true;
        if(obj == null)
            return false;
        if(getClass() != obj.getClass())
            return false;
        if(!(obj instanceof Complex))
            return false;
        else {
            Complex complex = (Complex) obj;
            if (complex.ImagePart == ((Complex) obj).ImagePart)
                return true;
            if (complex.RealPart == ((Complex) obj).RealPart)
                return true;
        }
        return false;
    }
    public  String toString() {
        String str = "";
        if (RealPart == 0&&ImagePart == 0)
            str = "0.0";
        else if (RealPart == 0&&ImagePart != 0)
            str = ImagePart + "" + "i";
        else if (RealPart != 0&&ImagePart == 0)
            str = RealPart + "";
        else if (RealPart !=0&&ImagePart > 0)
            str = RealPart + "" + "+" + ImagePart + "i";
        else if (RealPart !=0&&ImagePart < 0)
            str = RealPart + "" + ImagePart + "i";
        return str;
    }
    public Complex ComplexAdd(Complex a) {
        return new Complex(RealPart + a.getRealPart(),ImagePart + a.getImagePart());
    }
    public  Complex ComplexSub(Complex a) {
        return new Complex(RealPart - a.getRealPart(),ImagePart - a.getImagePart());
    }
    public Complex ComplexMulti(Complex a) {
        return new Complex(RealPart*a.getRealPart() - ImagePart*a.getImagePart(),RealPart*a.getImagePart() + ImagePart*a.getRealPart());
    }
    public Complex ComplexDiv(Complex a) {
        if(a.getRealPart() == 0&&a.getImagePart() == 0) {
            System.out.println("除数不能为0");
            return new Complex();
        }
        else
            return new Complex((RealPart*a.getRealPart() - ImagePart*a.getImagePart())/(a.getRealPart()*a.getRealPart()-a.getImagePart()*a.getImagePart()),(RealPart*a.getImagePart() + ImagePart*a.getRealPart())/(a.getRealPart()*a.getRealPart()-a.getImagePart()*a.getImagePart()));
    }
}

3.对搭档代码进行测试

测试代码
 * Demo class
 *
 * @author 20175204 zyz
 * @date 2019/4/29
 */
import junit.framework.TestCase;
import org.junit.Test;
import org.testng.annotations.ITestAnnotation;


public class wzhComplexTest extends TestCase {
    wzhComplex a = new wzhComplex(2.0,5.0);
    wzhComplex b = new wzhComplex(1.0,-4.0);
    wzhComplex c = new wzhComplex(-3.0,2.0);
    wzhComplex d = new wzhComplex(-4.0,-3.0);
    wzhComplex e = new wzhComplex(0.0,0.0);
    @Test
    public void testgetRealPart() throws Exception {
        assertEquals(2.0,a.getRealPart());
        assertEquals(1.0,b.getRealPart());
        assertEquals(-3.0,c.getRealPart());
        assertEquals(-4.0,d.getRealPart());
        assertEquals(0.0,e.getRealPart());
    }
    @Test
    public void testgetImagePart() throws Exception {
        assertEquals(5.0,a.getImagePart());
        assertEquals(-4.0,b.getImagePart());
        assertEquals(2.0,c.getImagePart());
        assertEquals(-3.0,d.getImagePart());
        assertEquals(0.0,e.getImagePart());
    }
    @Test
    public void testequals() throws Exception {
        assertEquals(true,a.toString().equals(a.toString()));
        assertEquals(false,b.toString().equals(c.toString()));
        assertEquals(false,d.toString().equals(e.toString()));
    }
    @Test
    public void testtoString() throws Exception {
        assertEquals("2.0+5.0i",a.toString());
        assertEquals("1.0-4.0i",b.toString());
        assertEquals("-3.0+2.0i",c.toString());
        assertEquals("-4.0-3.0i",d.toString());
        assertEquals("0.0",e.toString());
    }
    @Test
    public void testwzhComplexAdd() throws Exception {
        assertEquals("3.0+1.0i",a.wzhComplexAdd(b).toString());
        assertEquals("-7.0-1.0i",c.wzhComplexAdd(d).toString());
        assertEquals("-4.0-3.0i",d.wzhComplexAdd(e).toString());
    }
    @Test
    public void testwzhComplexSub() throws Exception {
        assertEquals("1.0+9.0i",a.wzhComplexSub(b).toString());
        assertEquals("1.0+5.0i",c.wzhComplexSub(d).toString());
        assertEquals("-3.0+2.0i",c.wzhComplexSub(e).toString());
    }
    public void testwzhComplexMulti() throws Exception {
        assertEquals("22.0-3.0i",a.wzhComplexMulti(b).toString());
        assertEquals("18.0+1.0i",c.wzhComplexMulti(d).toString());
        assertEquals("0.0",b.wzhComplexMulti(e).toString());
    }
    public void testwzhComplexDiv() throws Exception {
        assertEquals("-1.4666666666666666+0.2i",a.wzhComplexDiv(b).toString());
        assertEquals("2.5714285714285716+0.14285714285714285i",c.wzhComplexDiv(d).toString());
        assertEquals("0.0",a.wzhComplexDiv(e).toString());
    }
}


(三)对搭档代码进行重构

1.对代码进行规约扫描

2.对代码不规范问题加以改正

1.单语句时if else 也需要加大括号

2.对于所覆写的方法,必须加@override进行注解

3.方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase,必须遵从驼峰形式

4.类需要添加创建者信息

3.重构之后的代码

 * Demo class
 *
 * @author 20175204 zyz
 * @date 2019/4/29
 */
@SuppressWarnings("ALL")
public class wzhComplex {
    double RealPart;
    double ImagePart;
    public wzhComplex() {}
    public wzhComplex(double R,double I) {
        RealPart = R;
        ImagePart = I;
    }
    public double getRealPart() {
        return RealPart;
    }
    public double getImagePart() {
        return ImagePart;
    }
    @Override
    public boolean equals(Object obj) {
        if(this == obj) {
            return true;
        }
        if(obj == null) {
            return false;
        }
        if(getClass() != obj.getClass()) {
            return false;
        }
        if(!(obj instanceof wzhComplex)) {
            return false;
        } else {
            wzhComplex wzhComplex = (wzhComplex) obj;
            if (wzhComplex.ImagePart == ((wzhComplex) obj).ImagePart) {
                return true;
            }
            if (wzhComplex.RealPart == ((wzhComplex) obj).RealPart) {
                return true;
            }
        }
        return false;
    }
    @Override
    public  String toString() {
        String str = "";
        if (RealPart == 0&&ImagePart == 0) {
            str = "0.0";
        } else if (RealPart == 0&&ImagePart != 0) {
            str = ImagePart + "" + "i";
        } else if (RealPart != 0&&ImagePart == 0) {
            str = RealPart + "";
        } else if (RealPart !=0&&ImagePart > 0) {
            str = RealPart + "" + "+" + ImagePart + "i";
        } else if (RealPart !=0&&ImagePart < 0) {
            str = RealPart + "" + ImagePart + "i";
        }
        return str;
    }
    public wzhComplex wzhComplexAdd(wzhComplex a) {
        return new wzhComplex(RealPart + a.getRealPart(),ImagePart + a.getImagePart());
    }
    public  wzhComplex wzhComplexSub(wzhComplex a) {
        return new wzhComplex(RealPart - a.getRealPart(),ImagePart - a.getImagePart());
    }
    public wzhComplex wzhComplexMulti(wzhComplex a) {
        return new wzhComplex(RealPart*a.getRealPart() - ImagePart*a.getImagePart(),RealPart*a.getImagePart() + ImagePart*a.getRealPart());
    }
    public wzhComplex wzhComplexDiv(wzhComplex a) {
        if(a.getRealPart() == 0&&a.getImagePart() == 0) {
            System.out.println("除数不能为0");
            return new wzhComplex();
        }
        else {
            return new wzhComplex((RealPart*a.getRealPart() - ImagePart*a.getImagePart())/(a.getRealPart()*a.getRealPart()-a.getImagePart()*a.getImagePart()),(RealPart*a.getImagePart() + ImagePart*a.getRealPart())/(a.getRealPart()*a.getRealPart()-a.getImagePart()*a.getImagePart()));
        }
    }
}

(四)Java密码学相关内容的学习

1.Java与密码学

Java安全体系结构总共分为4个部分:
-JCA( Java Cryptography Architecture, Java加密体系结构):JCA提供基本的加密框架, 如证书、 数字签名、消息摘要和密钥对产生器。
-JCE( Java Cryptography Extension, Java加密扩展包):JCE在JCA的基础上作了扩展, 提供了各种加密算法、 消息摘要算法和密钥管理等功能。JCE的实现主要在javax.crypto包( 及其子包) 中
-JSSE( Java Secure Sockets Extension, Java安全套接字扩展包):JSSE提供了基于SSL( Secure Sockets Layer,安全套接字层) 的加密功能。 在网络的传输过程中, 信息会经过多个主机(很有可能其中一台就被窃听) , 最终传送给接收者, 这是不安全的。这种确保网络通信安全的服务就是由JSSE来提供的。
-JAAS( Java Authentication and Authentication Service, Java鉴别与安全服务):JAAS提供了在Java平台上进行用户身份鉴别的功能。

2.体验加解密---凯撒密码

1.凯撒密码的加密算法:
明文记为m,密文记为c,加密变换记为E(k1,m)(其中k1为密钥),解密变换记为D(k2,m)(k2为解密密钥)(在这里k1=k2,不妨记为k)。凯撒密码的加密过程可记为如下一个变换:
c≡m+k mod n (其中n为基本字符个数)
同样,解密过程可表示为:
m≡c+k mod n (其中n为基本字符个数)
2.重构算法代码

 * Demo class
 *
 * @author 20175204 zyz
 * @date 2019/5/4
 */
public class kaisa {
    public static void main(String[] args) throws Exception{
        String s=args[0];
        int key=Integer.parseInt(args[1]);
        String es="";
        for(int i=0;i<s.length( );i++)
        {  char c=s.charAt(i);
            if(c>='a' && c<='z')
            /** 是小写字母 */
            { c+=key%26;
             /**移动key%26位 */
                if(c<'a') {
                    c+=26;
             /**向左超界 */
                }
                if(c>'z') {
                    c-=26;
             /**向右超界 */
                }
            }
            else if(c>='A' && c<='Z')
             /**是大写字母 */
            {  c+=key%26;
                if(c<'A') {
                    c+=26;
                }
                if(c>'Z') {
                    c-=26;
                }
            }
            es+=c;
        }
        System.out.println(es);
    }
}


3.Java对称加密-DES算法

(1) 获取密钥生成器
KeyGenerator kg=KeyGenerator.getInstance("DESede");
(2) 初始化密钥生成器
kg.init(168);
(3) 生成密钥
SecretKey k=kg.generateKey( );
(4) 通过对象序列化方式将密钥保存在文件中
FileOutputStream f=new FileOutputStream("key1.dat");
ObjectOutputStream b=new ObjectOutputStream(f);
b.writeObject(k);

 * Demo class
 *
 * @author 20175204 zyz
 * @date 2019/5/4
 */
import java.io.*;
import javax.crypto.*;
public class Skey_DES{
    public static void main(String args[])
            throws Exception{
        KeyGenerator kg=KeyGenerator.getInstance("DESede");
        kg.init(168);
        SecretKey k=kg.generateKey( );
        FileOutputStream  f=new FileOutputStream("key1.dat");
        ObjectOutputStream b=new  ObjectOutputStream(f);
        b.writeObject(k);
    }
}


(5) 获取密钥
FileInputStream f=new FileInputStream("key1.dat");
ObjectInputStream b=new ObjectInputStream(f);
Key k=(Key)b.readObject( );
(6) 获取主要编码格式
byte[ ] kb=k.getEncoded( );
(7) 保存密钥编码格式
FileOutputStream f2=new FileOutputStream("keykb1.dat");
f2.write(kb);

 * Demo class
 *
 * @author 20175204 zyz
 * @date 2019/5/4
 */
import java.io.*;
import java.security.*;
public class Skey_kb{
    public static void main(String args[]) throws Exception{
        FileInputStream f=new FileInputStream("key1.dat");
        ObjectInputStream b=new ObjectInputStream(f);
        Key k=(Key)b.readObject( );
        byte[ ] kb=k.getEncoded( );
        FileOutputStream  f2=new FileOutputStream("keykb1.dat");
        f2.write(kb);
        // 打印密钥编码中的内容
        for(int i=0;i<kb.length;i++){
            System.out.print(kb[i]+",");
        }
    }
}


(8)加密HelloWorld

 * Demo class
 *
 * @author 20175204 zyz
 * @date 2019/5/4
 */
import java.io.*;
import java.security.*;
import javax.crypto.*;
public class SEnc{
    public static void main(String args[]) throws Exception{
        String s="Hello World!";
        FileInputStream f=new FileInputStream("key1.dat");
        ObjectInputStream b=new ObjectInputStream(f);
        Key k=(Key)b.readObject( );
        Cipher cp=Cipher.getInstance("DESede");
        cp.init(Cipher.ENCRYPT_MODE, k);
        byte ptext[]=s.getBytes("UTF8");
        for(int i=0;i<ptext.length;i++){
            System.out.print(ptext[i]+",");
        }
        System.out.println("");
        byte ctext[]=cp.doFinal(ptext);
        for(int i=0;i<ctext.length;i++){
            System.out.print(ctext[i] +",");
        }
        FileOutputStream f2=new FileOutputStream("SEnc.dat");
        f2.write(ctext);
    }
}


(9)对密文进行解密

 * Demo class
 *
 * @author 20175204 zyz
 * @date 2019/5/4
 */
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public class SDec{
    public static void main(String[] args) throws Exception{
        // 获取密文
        FileInputStream f=new FileInputStream("SEnc.dat");
        int num=f.available();
        byte[ ] ctext=new byte[num];
        f.read(ctext);
        // 获取密钥
        FileInputStream  f2=new FileInputStream("keykb1.dat");
        int num2=f2.available();
        byte[ ] keykb=new byte[num2];
        f2.read(keykb);
        SecretKeySpec k=new  SecretKeySpec(keykb,"DESede");
        // 解密
        Cipher cp=Cipher.getInstance("DESede");
        cp.init(Cipher.DECRYPT_MODE, k);
        byte []ptext=cp.doFinal(ctext);
        // 显示明文
        String p=new String(ptext,"UTF8");
        System.out.println(p);
    }
}


4.Java非对称加密-RSA算法

1.公私钥的产生

2.加密

3.解密


5.使用密钥协定创建共享密钥

1.创建DH公钥和私钥
2.创建共享密钥


6.Java摘要算法- MD5

(四)实验体会

通过本次实验,对idea相关功能有所更多的了解,也对所编写的代码有了更好的规范,更加符合相关标准,养成一个良好的编程习惯。

posted @ 2019-04-30 00:07  20175204张湲祯  阅读(171)  评论(0编辑  收藏  举报