zoukankan      html  css  js  c++  java
  • 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相关功能有所更多的了解,也对所编写的代码有了更好的规范,更加符合相关标准,养成一个良好的编程习惯。

  • 相关阅读:
    jdb应用 远程调试
    maven POM总结
    jvm
    jdbc取出表名 名称
    nginx配置openssl证书
    DNS A记录 CNAME NS记录等的区别
    linux文件目录类命令|--cd指令
    linux文件目录类命令--ls命令
    linux文件目录类命令--pwd命令
    linux 帮助指令
  • 原文地址:https://www.cnblogs.com/zyzgl/p/10793640.html
Copyright © 2011-2022 走看看