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


    一、实验报告封面

    课程:Java程序设计 班级:1753班 姓名:李浩然 学号:20175318

    指导教师:娄嘉鹏 实验日期:2019年4月27日

    实验时间:13:45 - 3:25 实验序号:实验三

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

    实验内容:

    • 1、XP基础
    • 2、XP核心实践
    • 3、相关工具

    实验要求:

    • 1、没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
    • 2、完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
    • 3、严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。

    二、实验内容及步骤

    (一)编码标准

    安装alibaba 插件,解决代码中的规范问题。具体流程如下:

    1.打开 Settings -> Plugins ,在搜索框输入alibaba即可看到Alibaba Java Code Guidelines插件,点击Install进行安装,然后重启IDE生效:

    2.使用比较简单:在项目名称上单击右键,在弹出菜单上选择编码规约扫描:

    出现下图内容:

    不规范的地方,有中文提示并且定位到了行,alibaba把问题分为block/critical/major三个等级,有些规则可以一键修复。

    Java中的一般的命名规则有:

    • 要体现各自的含义
    • 包、类、变量用名词
    • 方法名用动宾
    • 包名全部小写,如:io,awt
    • 类名第一个字母要大写,如:HelloWorldApp
    • 变量名第一个字母要小写 如:userName
    • 方法名第一个字母要小写:setName

    规范后的代码格式

    import java.util.concurrent.Callable;
    
    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));
            }
        }
    }
    

    任务一:在IDEA中使用工具(Code->Reformate Code)格式化代码,并学习Code菜单的功能

    IDEA中的Code菜单如下:

    几个比较常用的功能总结如下:

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

    • Implement Methods(Ctrl+I):完成当前类 implements 的(或者抽象基本类的)接口的方法;

    • Generate(Alt+Insert):创建类里面任何字段的 getter 与 setter 方法;

    • Surround With(Ctrl+Alt+T):使用if-else、try-catch、do-while等包装代码段;

    • Insert Live Template(Ctrl-J):执行一些记不起来的 Live Template 缩写;

    • Comment with Line Comment(Ctrl+斜杠)/Comment with Block Comment(Ctrl+Shift+斜杠):用 Ctrl+斜杠 与 Ctrl-Shift-/ 来注释(或反注释)代码行与代码块。 用Ctrl+斜杠单行注释标记(“ //… ”)来注释(或反注释)当前行或者选择地代码块。而 Ctrl+Shift+斜杠则可以用块注释标记(“ /* */”)把所选块包围起来。要反注释一个代码块就在块中任何一个地方按 Ctrl+Shift+斜杠 即可;

    • Reformat Code(Ctrl+Alt+L):将代码按标准格式缩进;

    • show reformat file dialog:按照格式自动对齐

    • Optimize imports:可以优化imports,去除不必要的imports

    • Move Line/statement Down/Up:将某行、表达式向下、向上移动一行

    (二)敏捷开发与XP

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

    搭档的Complex代码如下:

    需要测试的方法有:ComplexAdd(),ComplexSub(),ComplexMulti(),ComplexDiv()
    编写测试代码并上传到搭档码云项目上:

    import junit.framework.TestCase;
    import org.junit.Test;
    
    import static org.junit.Assert.*;
    
    public class ComplexTest extends TestCase {
        Complex c1 = new Complex(0.0, 2.0);
        Complex c2 = new Complex(-1.0, -1.0);
        Complex c3 = new Complex(1.0,2.0);
        @Test
        public void testgetRealpart() throws Exception{
            assertEquals(0.0,Complex.getRealPart(0.0));
            assertEquals(-1.0,Complex.getRealPart(-1.0));
            assertEquals(1.0,Complex.getRealPart(1.0));
        }
        @Test
        public void testgetImagePart() throws Exception{
            assertEquals(2.0,Complex.getImagePart(2.0));
            assertEquals(-1.0,Complex.getImagePart(-1.0));
            assertEquals(2.0,Complex.getImagePart(2.0));
        }
        @Test
        public void testComplexAdd() throws Exception{
            assertEquals("-1.0+1.0i",c1.ComplexAdd(c2).toString());
            assertEquals("1.0+4.0i",c1.ComplexAdd(c3).toString());
            assertEquals("0.0+1.0i",c2.ComplexAdd(c3).toString());
        }
        @Test
        public void testComplexSub() throws Exception{
            assertEquals("1.0+3.0i",c1.ComplexSub(c2).toString());
            assertEquals("-1.0",c1.ComplexSub(c3).toString());
            assertEquals("-2.0-3.0i",c2.ComplexSub(c3).toString());
        }
        @Test
        public void testComplexMulti() throws Exception{
            assertEquals("2.0-2.0i",c1.ComplexMulti(c2).toString());
            assertEquals("-4.0+2.0i",c1.ComplexMulti(c3).toString());
            assertEquals("1.0-3.0i",c2.ComplexMulti(c3).toString());
        }
    
        @Test
        public void testComplexDiv() throws Exception{
            assertEquals("-1.0-1.0i",c1.ComplexDiv(c2).toString());
            assertEquals("0.4+0.8i",c1.ComplexDiv(c3).toString());
            assertEquals("-0.6-0.6i",c2.ComplexDiv(c3).toString());
        }
    }
    


    (三)重构

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

    我们要修改软件,万变不离其宗,无非就是四种动机:

    • 增加新功能;
    • 原有功能有BUG;
    • 改善原有程序的结构;
    • 优化原有系统的性能 。

    需要重构的地方:
    代码重复、方法过长、参数列过长、条件逻辑过度复杂、分支语句

    一个完整的重构流程包括:

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

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

    如上代码存在以下几个问题:

    • 类名不符合命名规则;
    • 类中变量没有被封装;
    • 方法没有被封装;

    程序修改入下:

    任务四:以结对的方式完成Java密码学相关内容的学习,结合重构、git、代码标准等

    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平台上进行用户身份鉴别的功能。

    进行了学习之后,我与搭档选择了实现凯撒密码的加解密算法,并以结对的方式完成了代码编写的工作。

    凯撒密码算法:将字母表中的字母移动一定位置而实现加密。

    • 具体步骤:
      (1)根据凯撒密码特性设计算法
      (2)传入需要计算的字符串
      (3)处理计算结果

    • 伪代码:

    定义main方法
    传入参数
    参数判断,是否有非法输入,若有,抛出异常
    进行加解密,大小写区分
    输出结果
    
    • 产品代码:
      Caesaar.java
    public class Caesar {
    
        public static void main(String[] args) throws EadException {
            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);
                //自定义异常类
                try {
                    boolean exist = ((c > 64) && (c < 91)) || ((c > 96) && (c < 123) || c == 32 || c == 33);
                    if (exist == false) {
                        throw new EadException(s);
                    }
                } catch (EadException e) {
                    System.out.println(e.warnMess());
                }
                //小写字母
                if (c >= 'a' && c <= 'z') {
                    //移动key%26位
                    c += 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);
    
        }
    }
    

    EadException.java

    public class EadException extends Exception{
        String message;
        public EadException(String sourceString){
            message = "The input is not correct";
        }
        public String warnMess(){
            return message;
        }
    }
    

    最初代码:

    运行结果:

    代码规范截图:

    重构截图:

    (四)实验体会与总结

    通过本次实验,我主要学习到了代码标准,代码重构等内容。

    代码标准和重构的学习,使我注意到自己之前编写代码时的很多不规范之处,而且通过使用alibaba的实时编码扫描,使我在编写代码的同时,注意规范代码的标准格式,使写出的代码更加明了可观,类名和变量名的规范,也使我在编写代码时,减少了许多不必要的注释

    代码托管

    我的码云地址
    搭档的码云地址

    参考资料

    Java 密码学算法——娄老师的博客
    实验三 敏捷开发与XP实践——娄老师的博客
    Java代码重构的几种模式详解
    java 代码重构(系列讲解)
    IntelliJ IDEA使用技巧一览表

  • 相关阅读:
    经典isset,empty,is_null三个的用法与区别,最详细的讲解
    TP框架分页bootstrap冲突问题
    TP框架右下角运行时间
    TP6的跳转坑 和cmd报错 php版本和composer扩展坑
    TP5.1模板继承
    TP5.1模型关联
    Oracle语句
    ajaxform和ajaxgrid获取数据源、添加数据
    confirm和alert弹窗
    UEP-弹窗
  • 原文地址:https://www.cnblogs.com/L1079991001/p/10781103.html
Copyright © 2020-2023  润新知