• 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进行安装

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

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

    • 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)

    code菜单中的功能

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

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

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

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

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

    • 搭档的Complex代码如下:

    • 要测试的类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如下:

    4.重构

    • 重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。

    • 修改软件的四种动机:

      • 增加新功能;
      • 原有功能有BUG;
      • 改善原有程序的结构;
      • 优化原有系统的性能 。
    • 需要重构的地方:

      • 代码重复;
      • 方法过长;
      • 参数列过长;
      • 条件逻辑过度复杂;
      • 分支语句
    • 一个完整的重构流程应包括

      • 从版本控制系统代码库中Check out code
      • 读懂代码(包括测试代码)
      • 发现bad smell
      • Refactoring
      • 运行所有的Unit Tests
      • 往代码库中Check in code

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

    • 搭档代码如下:

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

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

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

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

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

    • 修改后的代码:

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

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

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

    4.重构

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

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

    解决

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

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

    • 然后点击复制链接

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


    (成功上传~~)

    四、代码托管

    五、实验体会与总结

    • 通过本次实验,我主要学习到了代码标准,代码重构等内容、了解了敏捷与XP开发的基本知识。在本次实验中,我认识到了代码的规范性的重要。在现实中,好的代码的功能效率都会大大增加,在代码规范性的实验中,我也认识到了,自己编写代码的格式很不规范,在之后要积极矫正。在本次实验中,我也进一步体会到了结对编程的优势,和小伙伴合作会使编程的效率大大提高。
  • 相关阅读:
    [极客大挑战 2019]BuyFlag
    [极客大挑战 2019]BabySQL
    [网鼎杯 2018]Fakebook
    C语言学习笔记_内存数据和字符串
    剑指OFFER_数据流中的中位数
    剑指OFFER_滑动窗口的最大值
    剑指OFFER_矩阵中的路径
    C语言学习笔记_指针相关知识
    剑指OFFER_机器人的运动范围
    剑指OFFER_剪绳子
  • 原文地址:https://www.cnblogs.com/wyf20175217/p/10765849.html
Copyright © 2020-2023  润新知