20165223 实验三 敏捷开发与XP实践

目录

一、实验报告封面

北京电子科技学院(BESTI)

实 验 报 告

课程 Java程序设计 班级 1652班
姓名 蔡霓 学号 20165223
成绩 指导教师 娄嘉鹏
实验日期 2018年4月28日 实验密级 非密级
预习程度 已预习 实验时间 13:45 - 15:25
必修/选修 选修 实验序号

实验名称:敏捷开发与XP实践

实验内容

  1. XP基础
  1. XP核心实践
  1. 相关工具

实验要求

1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》 《Vim编辑器》课程

2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导

3.严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。

返回目录

二、具体实验内容

(一)代码规范格式化

  1. 参考 IDEA简易教程-代码规范 安装alibaba 插件,解决代码中的规范问题。
  1. 在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));
    }
}

(1)实验步骤

  • 打开IDEA,在SettingsPluginsBrowse repositories...中的搜索框输入alibaba
  • 看到Alibaba Java Code Guidelines插件,点击Install进行安装,然后重启IDE生效
  • 新建类:CodeStandard.java,输入题目给出的代码
  • 使用工具 Code → Reformate Code ,按提示修改并格式化代码
  • 了解Code菜单功能
名称 快捷键 功能
Override Methods Ctrl + O 重写覆盖方法
Implements Methods Ctrl + I 实现接口方法
Gengrate Alt + Insert 生成Construct、Getter/Setter、toString等
Surround With Ctrl + Alt +T 生成包围代码
Unwarp/Remove Ctrl + Shift + Delete 取消代码包围
Cyclic Expand Word Alt + / 循环往上选择单词
Cyclic Expand Word Backwrad 循环往下选择单词
Comment with Line Comment Ctrl + / 行注释
Comment with Block Comment Ctrl + Shift + / 块注释
Reformat Code Ctrl + Alt + L 格式化代码
Move Statement Down Ctrl + Shift + ↓ 方法、代码下移
Move Statement Up Ctrl + Shift + ↑ 方法、代码上移

(2)实验代码

  • CodeStandard.java
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));
    }
}

(3)实验截图

返回目录

(二)添加搭档项目

1.在码云上把自己的学习搭档加入自己的项目中

2.确认搭档的项目加入自己后,下载搭档实验二的Complex代码

3.加入不少于三个JUnit单元测试用例,测试成功后git add .; git commit -m "自己学号 添加内容";git push;

4.提交搭档项目git log的截图,包含上面git commit的信息,并加上自己的学号水印信息。

(1)实验步骤

  • 以开发者的身份在码云上将学习搭档加入自己的项目中

  • 下载搭档实验二的Complex代码,加入JUnit单元测试用例
  • 提交搭档项目git log的截图

(2)实验代码

  • Complex
public class Complex {
    // 定义属性并生成getter,setter
    double RealPart;
    double ImagePart;

    // 定义构造函数
    public Complex(double R, double I) {
        this.RealPart = R;
        this.ImagePart = I;
    }

    ;

    public Complex() {
    }

    ;

    //Override Object
    /*public boolean equals(Object obj){

    }

    public String toString();
    //Override Object
    public boolean equals(Object obj)
    public String toString()*/


}
class FourOperations{
    // 定义公有方法:加减乘除
    //Complex a = new Complex();
    // Complex b = new Complex();

    Complex ComplexAdd(Complex a,Complex b){
        Complex answer=new Complex();
        answer.RealPart=a.RealPart+b.RealPart;
        answer.ImagePart=a.ImagePart+b.ImagePart;
        return answer;
    }
    Complex ComplexSub(Complex a,Complex b){
        Complex answer=new Complex();
        answer.RealPart=a.RealPart-b.RealPart;
        answer.ImagePart=a.ImagePart-b.ImagePart;
        return answer;
    }
    Complex ComplexMulti(Complex a,Complex b){
        Complex answer=new Complex();
        answer.RealPart=(a.RealPart*b.RealPart)-(a.ImagePart*b.ImagePart);
        answer.ImagePart=(a.RealPart*b.ImagePart)+(a.ImagePart*b.RealPart);
        return answer;
    }
    Complex ComplexDiv(Complex a,Complex b){
        Complex answer=new Complex();
        double fenmu = b.RealPart*b.RealPart+b.ImagePart+b.ImagePart;
        answer.RealPart=(a.RealPart*b.RealPart+a.ImagePart*b.ImagePart)/fenmu;
        answer.ImagePart=(a.ImagePart*b.RealPart-a.RealPart*b.ImagePart)/fenmu;
        return answer;
    }
}

  • 测试代码ComplexTest
import org.junit.Test;

import static org.junit.Assert.*;

public class ComplexTest {
    @Test
    public void testComplexAdd() throws Exception {
        assertEquals(5,2+3);
        System.out.println();
    }
    @Test
    public void testComplexSub() throws Exception {
        assertEquals(6,9 - 3);
    }
    @Test
    public void testComplexMulti() throws Exception {
        assertEquals(6,2 * 3);
    }
    @Test
    public void testComplexDiv() throws Exception {
        assertEquals(2,6 / 3);
    }
}

(3)实验截图

返回目录

(三)搭档代码重构

完成重构内容的练习,下载搭档的代码,至少进行三项重构,提交重构后代码的截图,加上自己的学号水印。提交搭档的码云项目链接。

(1)实验步骤

  • 下载搭档的代码Age.java,进行三项重构

(2)实验代码

  • 原代码:
import java.lang.*;
import java.sql.*;

public class Age {
    public static void main(String args[]) {
        Connection con = null;
        Statement sql;
        ResultSet rs;
        String name1 = new String("");
        String name2 = new String("");
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (Exception e) {
        }
        String uri = "jdbc:mysql://localhost:3306/world?useSSL=true";
        String user = "root";
        String password = "";
        // String sqlStr="select * from country where LifeExpectancy ";
        try {
            con = DriverManager.getConnection(uri, user, password);
        } catch (SQLException e) {
        }
        try {
            sql = con.createStatement();
            rs = sql.executeQuery("select * from country");
            float age1 = 0;
            float age2 = 100;

            while (rs.next()) {
                float LifeExpectancy = rs.getFloat(8);
                String Name = rs.getString(2);
                if (LifeExpectancy >= age1) {
                    age1 = LifeExpectancy;
                    name1 = Name;
                } else if (LifeExpectancy <= age2 && LifeExpectancy != 0.0) {
                    age2 = LifeExpectancy;
                    name2 = Name;
                }
            }
            System.out.println("寿命最长的国家为:" + name1 + ",平均寿命" + age1+"岁");
            System.out.println("寿命最短的国家为:" + name2 + ",平均寿命" + age2+"岁");
            con.close();
        } catch (SQLException e) {
            System.out.println(e);

        }


    }
}

  • 重构代码:
import java.lang.*;
import java.sql.*;
public class zbyProgram {
    public static void main(String args[]) {
        Connection con = null;
        Statement sql;
        ResultSet rs;
        String longest_name = new String("");
        String shortest_name = new String("");
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (Exception e) {
        }
        String uri = "jdbc:mysql://localhost:3306/world?useSSL=true";
        String user = "root";
        String password = "";
        // String sqlStr="select * from country where LifeExpectancy ";
        try {
            con = DriverManager.getConnection(uri, user, password);
        } catch (SQLException e) {
        }
        try {
            sql = con.createStatement();
            rs = sql.executeQuery("select * from country");
            float longest_age = 0;
            float shortest_age = 100;
            while (rs.next()) {
                float LifeExpectancy = rs.getFloat(8);
                String Name = rs.getString(2);
                if (LifeExpectancy >= longest_age) {
                    longest_age = LifeExpectancy;
                    longest_name = Name;
                } else if (LifeExpectancy <= shortest_age && LifeExpectancy != 0.0) {
                    shortest_age = LifeExpectancy;
                    shortest_name = Name;
                }
            }
            System.out.println("寿命最长的国家为:" + longest_name + ",平均寿命" + longest_age+"岁");
            System.out.println("寿命最短的国家为:" + shortest_name + ",平均寿命" + shortest_age+"岁");
            con.close();
        } catch (SQLException e) {
            System.out.println(e);
        }
    }
}

(3)实验截图

返回目录

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

1.参考《Java 密码学算法》,以结对的方式完成Java密码学相关内容的学习,结合重构,git,代码标准。

2.提交学习成果码云链接和代表性成果截图,要有学号水印。

(1)实验步骤

  • 非对称加密-RSA算法1,创建RSA公钥和私钥
  • 非对称加密-RSA算法2,获取公钥私钥,并进行加密,获取密文
  • 非对称加密-RSA算法3,使用私钥文件对密文进行解密

(2)实验代码

  • CaeserCipher.java代码:
import java.util.*;
import java.lang.*;

public class CaeserCipher {//凯撒密码

    public static void main(String[] args) {
        System.out.println("输入一串字符串作为明文(回车结束):");
        Scanner input = new Scanner(System.in);
        String m = input.next();//读入一行字符串,以回车为标志
        System.out.println("输入密钥:");
        int k = input.nextInt();
        int key = k % 26;//防止密钥超界
        Arithmetic output = new Arithmetic();
        String c = output.encrpty(m, k);
        System.out.println("加密后的密文为:" + c);
        System.out.println("解密后的明文为:" + output.decrypt(c, key));
    }
}

  • Arithmetic.java代码:
import java.lang.*;

public class Arithmetic {//加密和解密算法

    public String encrpty(String m, int k) {
        StringBuilder result = new StringBuilder();
        char[] mi = m.toCharArray();
        int n = mi.length;
        for (int c : mi) {
            if (c >= 'a' && c <= 'z') {
                c += k; // 移动key%26位
                if (c < 'a')
                    c += 26; // 向左超界
                if (c > 'z')
                    c -= 26; // 向右超界
            }
            // 如果字符串中的某个字符是大写字母
            else if (c >= 'A' && c <= 'Z') {
                c += k; // 移动key%26位
                if (c < 'A')
                    c += 26;// 同上
                if (c > 'Z')
                    c -= 26;// 同上
            }
            result.append((char) c);
        }
        return result.toString();
    }

    public String decrypt(String m, int k) {
        StringBuilder result = new StringBuilder();
        char[] mi = m.toCharArray();
        int n = mi.length;
        for (int c : mi) {
            if (c >= 'a' && c <= 'z') {
                c -= k; // 向前移动k位
                if (c < 'a')
                    c += 26; // 向左超界
                if (c > 'z')
                    c -= 26; // 向右超界
            }
            // 如果字符串中的某个字符是大写字母
            else if (c >= 'A' && c <= 'Z') {
                c -= k; // 向前移动3位
                if (c < 'A')
                    c += 26;// 同上
                if (c > 'Z')
                    c -= 26;// 同上
            }
            result.append((char) c);
        }
        return result.toString();
    }
}

(3)实验截图

返回目录

三、实验总结

  • 代码托管

我的代码20165223
搭档代码20165218

  • 参考资料
  1. Intellj IDEA 简易教程-代码规范
  2. 实验三 敏捷开发与XP实践
  3. 积极主动敲代码,使用JUnit学习Java
  4. Java 密码学算法

返回目录

四、PSP时间

实验步骤 耗时 百分比
题目分析 30min 15%
思路设计 60min 30%
代码实现 60min 30%
调试测试 20min 10%
实验总结 30min 15%

返回目录

posted @ 2018-05-05 19:54  乐十六君  阅读(199)  评论(0编辑  收藏  举报