20175316 盛茂淞 2018-2019-2 《Java程序设计》实验三《敏捷开发与XP实践》 实验报告

实验内容与要求

1.XP基础

极限编程(Extreme Programming,XP)是一种全新而快捷的软件开发方法。XP团队使用现场客户、特殊计划方法和持续测试来提供快速的反馈和全面的交流:html

  • XP是以开发符合客户须要的软件为目标而产生的一种方法论
  • XP是一种以实践为基础的软件工程过程和思想
  • XP认为代码质量的重要程度超出人们通常所认为的程度
  • XP特别适合于小型的有责任心的、自觉自励的团队开发需求不肯定或者迅速变化的软件
    XP软件开发的基石是XP的活动,包括:编码、测试、倾听、设计。java

    2.XP核心实践

3.相关工具

敏捷开发与XP实践-1

实验目的与要求:

  • http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成IDEA
  • 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD 安装alibaba 插件,解决代码中的规范问题。
  • 在IDEA中使用工具(Code->Reformate Code)把下面代码从新格式化,再研究一下Code菜单,找出一项让本身感受最好用的功能。提交截图,加上本身学号水印。
public class CodeStandard {
public static void main(String [] args){
StringBuffer buffer = new StringBuffer();
buffer.append('S');
buf![](https://img2018.cnblogs.com/blog/1272669/201905/1272669-20190502160118003-975536005.png)

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

实验步骤

编程标准使代码更容易阅读和理解。编程标准包含:具备说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。git

  • Settings ->Plugins -> Browse repositories...——安装alibaba
  • 在项目名称上单击右键,在弹出菜单上选择编码规约扫描
  • 不规范的地方,有中文提示而且定位到了行,alibaba把问题分为block/critical/major三个等级。根据报错提示,进行了修改。算法

  • Code->Reformate Code
  • 从新格式化以后
    编程

  • 我发现Code->Surround with...功能很好用,例如咱们想改变本身代码的部分逻辑结构,加个if语句,直接用这个功能就行了,先选择范围
  • Surround后
    app

敏捷开发与XP实践-2

实验目的与要求:

  • 在码云上把本身的学习搭档加入本身的项目中,确认搭档的项目加入本身后,下载搭档实验二的Complex代码,加入很多于三个JUnit单元测试用例,测试成功后git add .; git commit -m "本身学号 添加内容";git push;
  • 提交搭档项目git log的截图,包含上面git commit的信息,并加上本身的学号水印信息。ide

    实验内容

  • 搭档代码
public class Complex {
    double RealPart;
    double ImagePart;
    public Complex(){}
    public Complex(double R,double I){
        RealPart=R;
        ImagePart=I;
    }
    public boolean equals(Complex a){
        if(a.RealPart==this.RealPart&&a.ImagePart==this.ImagePart){
            return true;
        }
        else {
            return false;
        }
    }
    public String toString(){
        return "Complex{"+RealPart+","+ImagePart+"}";
    }
}
  • 加入很多于三个JUnit单元测试用例,而且测试成功
Complex:
public class Complex {
    double RealPart;
    double ImagePart;
    public Complex(){}
    public Complex(double R,double I){
        RealPart=R;
        ImagePart=I;
    }
    public boolean equals(Complex a){
        if(a.RealPart==this.RealPart&&a.ImagePart==this.ImagePart){
            return true;
        }
        else {
            return false;
        }
    }
    public String toString(){
        return "Complex{"+RealPart+","+ImagePart+"}";
    }
    Complex ComplexAdd(Complex a) {
        return new Complex(this.RealPart + a.RealPart,this.ImagePart + a.ImagePart);
    }
    Complex ComplexSub(Complex a){
        return new Complex(this.RealPart - a.RealPart,this.ImagePart - a.ImagePart);
    }
    Complex ComplexMulti(Complex a){
        return new Complex(this.RealPart*a.RealPart-this.ImagePart*a.ImagePart,
                this.ImagePart*a.RealPart+this.RealPart*a.ImagePart);
    }
    Complex ComplexDiv(Complex a){
        double change = a.RealPart*a.RealPart + a.ImagePart*a.ImagePart;
        Complex b = new Complex(a.RealPart / change, - a.ImagePart / change);
        return this.ComplexMulti(b);
    }
}
ComplexTest:
public class Complex {
    double RealPart;
    double ImagePart;
    public Complex(){}
    public Complex(double R,double I){
        RealPart=R;
        ImagePart=I;
    }
    public boolean equals(Complex a){
        if(a.RealPart==this.RealPart&&a.ImagePart==this.ImagePart){
            return true;
        }
        else {
            return false;
        }
    }
    public String toString(){
        return "Complex{"+RealPart+","+ImagePart+"}";
    }
    Complex ComplexAdd(Complex a) {
        return new Complex(this.RealPart + a.RealPart,this.ImagePart + a.ImagePart);
    }
    Complex ComplexSub(Complex a){
        return new Complex(this.RealPart - a.RealPart,this.ImagePart - a.ImagePart);
    }
    Complex ComplexMulti(Complex a){
        return new Complex(this.RealPart*a.RealPart-this.ImagePart*a.ImagePart,
                this.ImagePart*a.RealPart+this.RealPart*a.ImagePart);
    }
    Complex ComplexDiv(Complex a){
        double change = a.RealPart*a.RealPart + a.ImagePart*a.ImagePart;
        Complex b = new Complex(a.RealPart / change, - a.ImagePart / change);
        return this.ComplexMulti(b);
    }
}

上传码云

  • git push
  • git log

敏捷开发与XP实践-3

实验目的与要求:

  • http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成IDEA
  • 完成重构内容的练习,下载搭档的代码,至少进行三项重构,提交重构后代码的截图,加上本身的学号水印。提交搭档的码云项目连接。工具

    实验内容及结果截图:

    重构方法:

  • refactor->Rename给类、包、方法、变量更名字
  • refactor->Encapsulate Field封装
  • Source->Generate toString()toString()方法
  • refactor->Extract Method提炼出重复的代码单元测试

    重构后代码

class xmnew {
    private int num;
    private String name;
    private int java;

    public int getNum() {
        return num;
    }
    @Override
    public String toString() {
        return "xmnew{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", java=" + java +
                '}';
    }
    public void setNum(int num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getJava() {
        return java;
    }

    public void setJava(int java) {
        this.java = java;
    }
}
public class xmnewTest {

    public static void main(String[] args) {
        studentdark student = new studentdark();
        student.setName("caoge");
        student.setNum(5312);
        student.setJava(94);
        System.out.println("学号为"+ student.getNum() +",姓名为"+ student.getName() +"java成绩为"+ student.getJava());
    }
}

运行截图

敏捷开发与XP实践-4

实验目的与要求:

  • 参考 http://www.cnblogs.com/rocedu/p/6683948.html,以结对的方式完成Java密码学相关内容的学习,结合重构,git,代码标准。
  • 提交学习成果码云连接和表明性成果截图,要有学号水印。学习

    实验步骤:

  • 获取密钥生成器KeyGenerator kg=KeyGenerator.getInstance("DESede");
  • Java中KeyGenerator类中提供了建立对称密钥的方法。KeyGenerator类预约义了一个静态方法getInstance( ),方法getInstance( )的参数为字符串类型,指定加密算法的名称。
  • 初始化密钥生成器kg.init(168);该步骤通常指定密钥的长度。咱们写的是“DESede”,则能够是112或168位,其中112位有效。
  • 生成密钥SecretKey k=kg.generateKey( );密钥可用于之后的加密和解密。
  • 经过对象序列化方式将密钥保存在文件中
FileOutputStream f=new FileOutputStream("key1.dat");
ObjectOutputStream b=new ObjectOutputStream(f);
b.writeObject(k);
  • ObjectOutputStream类中提供的writeObject方法能够将对象序列化,以流的方式进行处理。这里将文件输出流做为参数传递给ObjectOutputStream类的构造器,这样建立好的密钥将保存在文件key1.data中。
  • 从文件中获取密钥
FileInputStream f=new FileInputStream("key1.dat");
ObjectInputStream b=new ObjectInputStream(f);
Key k=(Key)b.readObject( );
  • 建立密码器
Cipher cp=Cipher.getInstance("DESede");
  • KeyGenerCipher类是一个工厂类,它不是经过new方法建立对象,而是经过其中预约义的一个静态方法getInstance( )获取Cipher对象。getInstance( )方法的参数是一个字符串,该字符串给出Cipher对象应该执行哪些操做。
  • 初始化密码器
    cp.init(Cipher.ENCRYPT_MODE, k);该方法包括两个参数,第一个参数指定密码器准备进行加密仍是解密,若传入Cipher.ENCRYPT_MODE则进入加密模式。第二个参数则传入加密或解密所使用的密钥,即第1步从文件中读取的密钥对象k。
  • 获取等待加密的明文
String s="Hello World!";
byte ptext[]=s.getBytes("UTF8");
  • 执行加密
byte ctext[]=cp.doFinal(ptext);
  • 处理加密结果
FileOutputStream f2=new FileOutputStream("SEnc.dat");
f2.write(ctext);
  • 这里将加密结果保存在文件Senc.dat中。

加密结果:

码云连接

https://gitee.com/SANFENs/Teamwork

实验体会与总结

  • java课程已过去一半,可是java实验仍是依然的灵活,让咱们能够在课下使用课余时间来学习完成,这仍然是其余实验课无法比拟的,所以咱们须要把握住这种学习的机会,将java课学好,让学习的过程更有意义。
相关文章
相关标签/搜索