2018-2019-2 20175217 实验三《敏捷开发与XP实践》实验报告

一、实验报告封面

  • 课程:Java程序设计 班级:1752班 姓名:吴一凡 学号:20175217
  • 指导教师:娄嘉鹏 实验日期:2019年4月25日
  • 实验时间:--- 实验序号:实验三
  • 实验名称:敏捷开发与XP实践
  • 实验内容:
    • XP基础
    • XP核心实践
    • 相关工具
  • 实验要求:
    • 没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
    • 完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
    • 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。

二、实验内容及步骤

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

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

1591805-20190424210845038-830006327.png

  • 重启IDEA后,在代码中右击点击编码规约扫描就可以使用了

1591805-20190424211214029-1245757099.png

  • 然后就可以在下方看到一些不规范的地方,出现的问题分为block、critical、major三个级别,根据提示信息就可以规范代码了

1591805-20190424211751101-98111293.png

  • Java中的一般的命名规则有:
    • 要体现各自的含义
    • 包、类、变量用名词
    • 方法名用动宾
    • 包名全部小写,如:io,awt
    • 类名第一个字母要大写,如:HelloWorldApp
    • 变量名第一个字母要小写,如:userNamege
    • 方法名第一个字母要小写:setName
  • 规范后的代码:
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格式化代码(Ctrl+Alt+L)

1591805-20190424233940733-960899221.png

code菜单中的功能

  • Override Methods(ctrl+O):重载基本类的方法

1591805-20190424234537573-6300728.png

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

1591805-20190424235053039-381779844.png

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

1591805-20190424235559029-519957884.png

  • Comment with Block Comment(Ctrl+Shift+/):将选中的代码块变成注释

1591805-20190424235649821-440436864.png

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

  • 搭档的Complex代码如下:

1591805-20190425164726249-704515888.png

  • 要测试的类getRealgetImaginarytoStringequalscomplexAddcomplexSubcomplexMulticomplexDiv
  • 测试代码如下:
import junit.framework.TestCase;

public class Complex_pTest extends TestCase {
    Complex_p a=new Complex_p(2,3);
    Complex_p b=new Complex_p(0,1);
    Complex_p c=new Complex_p(-1,-2);
    public void testGetReal() {
        assertEquals(2.0,a.getReal());
        assertEquals(0.0,b.getReal());
        assertEquals(-1.0,c.getReal());
    }

    public void testGetImaginary() {
        assertEquals(3.0,a.getImaginary());
        assertEquals(1.0,b.getImaginary());
        assertEquals(-2.0,c.getImaginary());
    }

    public void testToString1() {
        assertEquals("2.0+3.0i",a.toString());
        assertEquals("1.0i",b.toString());
        assertEquals("-1.0-2.0i",c.toString());
    }
    public void testComplexAdd() {
        assertEquals("2.0+4.0i",a.ComplexAdd(b).toString());
        assertEquals("1.0+1.0i",a.ComplexAdd(c).toString());
        assertEquals("-1.0-1.0i",b.ComplexAdd(c).toString());
    }

    public void testComplexSub() {
        assertEquals("2.0+2.0i",a.ComplexSub(b).toString());
        assertEquals("1.0+3.0i",b.ComplexSub(c).toString());
        assertEquals("-3.0-5.0i",c.ComplexSub(a).toString());
    }

    public void testComplexMulti() {
        assertEquals("-3.0+2.0i",a.ComplexMulti(b).toString());
        assertEquals("4.0-7.0i",a.ComplexMulti(c).toString());
        assertEquals("2.0-1.0i",b.ComplexMulti(c).toString());
    }

    public void testComplexDiv() {
        assertEquals("-1.4-4.0i",a.ComplexDiv(c).toString());
        assertEquals("-0.2-1.0i",b.ComplexDiv(c).toString());
    }
}
  • 然后将测试代码传到搭档的码云里,git log如下:

1591805-20190425213520635-500745856.png

4.重构

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

下载搭档的代码,至少进行三项重构

  • 搭档代码如下:

1591805-20190426093158941-1330869358.png

  • 重构1:重写toString时的@override标志

1591805-20190426093337839-743575956.png

  • 重构2:添加作者和日期

1591805-20190426093446294-914485516.png

  • 重构3:对类中的变量和方法进行封装

1591805-20190426093538050-1020561711.png

  • 重构4:规范方法名(首字母小写)

1591805-20190426093900844-96680684.png

  • 重构5:精简过长的方法

1591805-20190426093943610-1858672734.png

  • 修改后的代码:

1591805-20190426094035590-1950209116.png

5.密码学

RSA算法

  • RSA算法,通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册

  • 加密过程:

1) 随机选取两个不相等的质数p和q
2) 计算p和q的乘积
n:n=pxq
3) 计算欧拉函数φ(n)。(程序里我用的是u(n))
φ(n)=(p-1)x(q-1)
4) 随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。
5) 计算e对于φ(n)的模反元素d。
6) 将n和e封装成公钥,n和d封装成私钥。
公钥:(e,n) 私钥:(d,n)
7) 密文c=明文m^公钥e mod 公钥n:
C=m^e mod n

  • 解密过程

1) 前面6个步骤相同
2) 明文m=密文c^私钥d mod私钥n:
M=c^d mod n

编程步骤

1.创建密钥对

  • 创建密钥对生成器

KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");

  • 初始化密钥生成器

kpg.initialize(1024);

  • 生成密钥对

KeyPair kp=kpg.genKeyPair( );

  • 获取公钥和私钥
PublicKey pbkey=kp.getPublic( );
PrivateKey prkey=kp.getPrivate( );

1591805-20190505171654036-1782833863.png

2.加密

  • 获取公钥
FileInputStream f=new FileInputStream("Skey_RSA_pub.dat");
ObjectInputStream b=new ObjectInputStream(f);
RSAPublicKey  pbk=(RSAPublicKey)b.readObject( );
  • 获取公钥的参数(e, n)
BigInteger e=pbk.getPublicExponent();
BigInteger n=pbk.getModulus();
  • 获取明文整数(m)
String s="Hello World!";
byte ptext[]=s.getBytes("UTF8");
BigInteger m=new BigInteger(ptext);
  • 执行计算
BigInteger c=m.modPow(e,n);

1591805-20190505171906208-1791339855.png

3.解密

  • 读取密文
BufferedReader in= 
new BufferedReader(new InputStreamReader(
new FileInputStream("Enc_RSA.dat")));
String ctext=in.readLine();
BigInteger c=new BigInteger(ctext);
  • 获取私钥
FileInputStream f=new FileInputStream("Skey_RSA_priv.dat");
ObjectInputStream b=new ObjectInputStream(f);
RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );
  • 获取私钥的参数(d, n)
BigInteger d=prk.getPrivateExponent( );
BigInteger n=prk.getModulus( ); 
  • 执行计算
BigInteger m=c.modPow(d,n);
  • 计算明文整型数对应的字符串
byte[] mt=m.toByteArray();
for(int i=0;i<mt.length;i++){
System.out.print((char) mt[i]);
}

1591805-20190505172217139-1966204485.png

4.重构

1591805-20190505173850456-936703209.png

三、实验过程中遇到的问题及解决方法

问题:在把测试代码上传到搭档码云的过程中出现没有权限的错误:

1591805-20190425213716280-1028006168.png

解决

  • git clone 搭档码云地址,将搭档的项目添加到自己的项目中

1591805-20190425213839344-1975899474.png

  • 然后登录搭档的码云仓库,点击管理,在仓库成员管理中找到开发者,然后点击邀请用户

1591805-20190425214642291-1002889700.png

  • 然后点击复制链接

1591805-20190425214728644-414726607.png

  • 然后登录自己的码云,点击同意就可以上传了

1591805-20190425214842540-460301174.png
(成功上传~~)

四、代码托管

五、实验体会与总结

  • 通过本次实验,我主要学习到了代码标准,代码重构等内容、了解了敏捷与XP开发的基本知识。在本次实验中,我认识到了代码的规范性的重要。在现实中,好的代码的功能效率都会大大增加,在代码规范性的实验中,我也认识到了,自己编写代码的格式很不规范,在之后要积极矫正。在本次实验中,我也进一步体会到了结对编程的优势,和小伙伴合作会使编程的效率大大提高。

转载于:https://www.cnblogs.com/wyf20175217/p/10765849.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值