2018-2019-2 20175306实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告
2018-2019-2 20175306实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告
实验内容
- XP基础
 - XP核心实践
 - 相关工具
 
实验要求
1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
实验步骤
(一)编码标准
编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。
安装alibaba插件
打开Settings ->Plugins在搜索框输入alibaba即可看到Alibaba Java Code Guidelines插件,点击Install进行安装,然后重启IDE生效:

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

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

例如这里就可以点击直接修复

代码出现的问题:
1.不允许任何魔法值(即未经定义的常量)直接出现在代码中。
2.包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式
3.所有的类都必须添加创建者信息。

规范后代码:
/**
 - CodeStandard
 -  - @author WJS20175306
 - @date 2019/4/29
 */
@SuppressWarnings("ALL")
public class CodeStandard {
    @SuppressWarnings("AlibabaUndefineMagicConstant")
    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());
        //noinspection AlibabaUndefineMagicConstant
        if (buffer.capacity() < 20) {
            buffer.append("1234567");
        }
        for (int i = 0; i < buffer.length(); i++) {
            System.out.println(buffer.charAt(i));
        }
    }
}
code的使用:参考: code篇
·Gengrate ( 用于生成Construct、Getter/Setter、toString、Test等) Alt + Insert

·Cyclic Expand Word ( 循环往上选择单词 ) Alt + /
·Cyclic Expand Word (Backwrad)( 循环往下选择单词 ) Alt + Shift + /代码标准中很重要的一项是如何给包、类、变量、方法等标识符命名,能很好的命名可以让自己的代码立马上升一个档次。Java中的一般的命名规则有:
· 要体现各自的含义
· 包、类、变量用名词
· 方法名用动宾
· 包名全部小写,如:io,awt
· 类名第一个字母要大写,如:HelloWorldApp
· 变量名第一个字母要小写,如:userName
· 方法名第一个字母要小写:setName
(二)版本控制
- 版本控制提供项目级的 undo(撤销) 功能: 没有什么事情是终结版本, 任何错误必须很容易回滚。 假设你在使用世界上最复杂的文字处理系统。 它具备了所有的能想到的功能,就是没有支持 DELETE(删除) 键。想象你打字的时候得多么的谨慎和缓慢吧, 特别是一篇超大的文档的快临近末尾的时候, 一个不小心就要重头再来(试想你选中所有的文字, 不小心按了 DELETE 键, 因为没有撤销功能,只好重新录入)。编辑文字和版本控制相同,任何时候都需要回滚,无论是一个小时, 一天, 还是一周, 这让你的团队工作自由快速的工作, 而且对于修正错误也非常自信。
 - 版本控制允许多人在同一代码上工作, 只要遵守一定的控制原则就行。 再也不会发生诸如一个人覆盖了另一个人编辑的代码,导致那个人的修改无效这样的情况。
 - 版本控制系统保存了过去所作的修改的历史记录。如果你遭遇到一些惊讶的代码,通过版本控制系统可以很容易找出是谁干的, 修改了什么, 修改的时间, 如果幸运的话,还能找出原因。
 - 版本控制系统还支持在主线上开发的同时发布多个软件版本。在软件发布的时候也不需要整个团队的停止工作,不需要冻结代码。
 - 版本控制也是项目级的时间机器,你可以选择任何一个时间, 精确地查看项目在当时的情况。 这对研究非常有用, 也是重现以前某个有问题的发布版本的基础。
 
(三)重构:就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。
- 一个完整的重构流程包括:
1.从版本控制系统代码库中Check out code
2.读懂代码(包括测试代码)
3.发现bad smell
4.Refactoring
5.运行所有的Unit Tests
6.往代码库中Check in code 
(四)实践
邀请搭档进入码云仓库:

搭档的Complex代码

对搭档代码进行测试:

测试代码:
package 其它;
import junit.framework.TestCase;
import org.junit.Test;
public class HYComplexTest extends TestCase {
    HYComplex a = new HYComplex(2.0,4.0);
    HYComplex b = new HYComplex(0.0,-3.0);
    HYComplex c = new HYComplex(-5.0,0.0);
    @Test
    public void testgetRealpart(){
        assertEquals(2.0,a.getRealPart());
        assertEquals(0.0,b.getRealPart());
        assertEquals(-5.0,c.getRealPart());
    }
    @Test
    public void testgetImagePart(){
        assertEquals(4.0,a.getImagePart());
        assertEquals(-3.0,b.getImagePart());
        assertEquals(0.0,c.getImagePart());
    }
    @Test
    public void testMyComplexAdd(){
        String q = a.complexAdd(b).toString();
        String w = b.complexAdd(c).toString();
        String e = c.complexAdd(a).toString();
        assertEquals("2.0+1.0i",q);
        assertEquals("-5.0-3.0i",w);
        assertEquals("-3.0+4.0i",e);
    }
    @Test
    public void testMyComplexSub(){
        String r = a.complexSub(b).toString();
        String t = b.complexSub(c).toString();
        String y = c.complexSub(a).toString();
        assertEquals("2.0+7.0i",r);
        assertEquals("5.0-3.0i",t);
        assertEquals("-7.0-4.0i",y);
    }
    @Test
    public void testMyComplexMulti(){
        String u = a.complexMulti(b).toString();
        String i = b.complexMulti(c).toString();
        String o = c.complexMulti(a).toString();
        assertEquals("12.0-6.0i",u);
        assertEquals("15.0i",i);
        assertEquals("-10.0-20.0i",o);
    }
    @Test
    public void testMyComplexDiv(){
        String p = c.complexDiv(a).toString();
        assertEquals("-0.5+2.5i",p);
    }
    @Test
    public void testtoString(){
        assertEquals("2.0+4.0i",a.toString());
        assertEquals("-3.0i",b.toString());
        assertEquals("-5.0",c.toString());
    }
}
重构1:所有类都必须添加创建者信息

重构2:所有的覆写方法,必须加@Override注解

重构3:方法名,参数名,成员变量,局部变量都统一使用lowerCamelCase

重构4:在if/else/for/while/do语句中必须使用大括号,即使只有一行代码

重构后上传到搭档仓库的git log:

码云链接:
(五)java与密码学
1.实验要求:
参考 http://www.cnblogs.com/rocedu/p/6683948.html,以结对的方式完成Java密码学相关内容的学习,结合重构,git,代码标准。
2.实验过程:
我和搭档进行的是凯撒密码的实现。凯撒密码的加密和解密算法相当来说比较简单。
其加密过程如下:
若明文记为m,密文记为c,秘钥为k,加密变换记为Encrypt(k,m),解密变换记为Decrypt(k,m))。凯撒密码的加密过程可记为如下一个变换:
c≡m+k mod n (其中n为基本字符个数)
同样,解密过程可表示为:
m≡c+k mod n (其中n为基本字符个数)
加密代码为:
import java.util.Scanner;
public class JiaMi {
    public static void main(String[] args) {
        System.out.print("请输入明文:");
        Scanner a=new Scanner(System.in);
        String b=a.nextLine();
        System.out.print("请输入秘钥:");
        Scanner c=new Scanner(System.in);
        int key=c.nextInt();
        Encrypt(b, key);
    }
    public static void Encrypt(String str,int k){
        String s="";
        for (int i = 0; i < str.length(); i++) {
            char c=str.charAt(i);
            if(c>='a'&&c<='z'){
                c+=k%26;
                if(c<'a') {
                    c+=26;
                }
                if(c>'z') {
                    c-=26;
                }
            }else if(c>='A'&&c<='Z'){
                c+=k%26;
                if(c<'A') {
                    c+=26;
                }
                if(c>'Z') {
                    c-=26;
                }
            }
            s+=c;
        }
        System.out.println(str+" 加密为: "+s);
    }
}
解密代码为:
import java.util.Scanner;
public class JieMi {
    public static void main(String[] args) {
        System.out.print("请输入密文:");
        Scanner a=new Scanner(System.in);
        String b=a.nextLine();
        System.out.print("请输入秘钥:");
        Scanner c=new Scanner(System.in);
        int key=c.nextInt();
        Decrypt(b, key);
    }
    public static void Decrypt(String str,int k){
        String s="";
        for (int i = 0; i < str.length(); i++) {
            char c=str.charAt(i);
            if(c>='a'&&c<='z'){
                c-=k%26;
                if(c<'a') {
                    c+=26;
                }
                if(c>'z') {
                    c-=26;
                }
            }else if(c>='A'&&c<='Z'){
                c-=k%26;
                if(c<'A') {
                    c+=26;
                }
                if(c>'Z') {
                    c-=26;
                }
            }
            s+=c;
        }
        System.out.println(str+" 解密为: "+s);
    }
}
运行截图为:


实验感悟:
本次实验让我学会了对代码的规范修改,突然发现自己的代码还有很多的不足,不够规范,虽然有些问题不必非要体现出来,但是当规范后显得更加正式。还有对代码的重构,在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更,非常强大。最后学到了将代码上传到搭档的码云里,感觉不一样。
2018-2019-2 20175306实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告的更多相关文章
- 20175314 实验三 敏捷开发与XP实践
		
20175314 实验二 Java面向对象程序设计 一.实验内容 XP基础 XP核心实践 相关工具 二.实验步骤 (一)代码格式化 创建"175314.exp3"项目,在该项目下创 ...
 - 20165230 《Java程序设计》实验三 敏捷开发与XP实践 实验报告
		
20165230 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: 指导教 ...
 - 2017-2018-2 20165228 实验三《敏捷开发与XP实践》实验报告
		
2017-2018-2 20165228 实验三<敏捷开发与XP实践>实验报告 相关知识点 (一)敏捷开发与XP 通过 XP准则来表达: 沟通 :XP认为项目成员之间的沟通是项目成功的关键 ...
 - 2016-2017-2 20155339 《Java面向对象程序设计》实验三敏捷开发与XP实践实验报告
		
2016-2017-2 20155339 <Java面向对象程序设计>实验三敏捷开发与XP实践实验报告 实验内容 XP基础 XP核心实践 相关工具 实验内容 一.在IDEA中使用工具(Co ...
 - 2018-2019-2 20175217 实验三《敏捷开发与XP实践》实验报告
		
一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:吴一凡 学号:20175217 指导教师:娄嘉鹏 实验日期:2019年4月25日 实验时间:--- 实验序号:实验三 实验名称:敏捷开 ...
 - 2018-2019-20175205 实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告
		
2018-2019-20175205 实验三敏捷开发与XP实践<Java开发环境的熟悉>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>&l ...
 - 2018-2019-2  20175227张雪莹《Java程序设计》实验三 《敏捷开发与XP实践》
		
2018-2019-2 20175227张雪莹<Java程序设计> 实验三 <敏捷开发与XP实践> 实验报告封面 课程:Java程序设计 班级:1752班 姓名:张雪莹 学号: ...
 - #实验三 敏捷开发与XP实践---实验报告
		
一.实验三 敏捷开发与XP实践-1 1.实验要求 -实验三 敏捷开发与XP实践 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成I ...
 - 20165223 实验三 敏捷开发与XP实践
		
目录 一.实验报告封面 二.具体实验内容 (一)敏捷开发与XP实践-1 代码规范格式化 (二)敏捷开发与XP实践-2 添加搭档项目 (三)敏捷开发与XP实践-3 搭档代码重构 (四)敏捷开发与XP实践 ...
 
随机推荐
- CMakeList 编写规则 -1
			
CMAKE 常见指令 CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(XXX) SET(CMAKE_BUILD_TYPE Release) SET(CMAKE_ ...
 - redhat配置java环境
			
1.检查是否有旧版本的jdk java -version java version "1.4.2" gij (GNU libgcj) version (Red Hat -) Cop ...
 - Mint UI 之 Swipe 组件
			
#为什么不显示内容? 一定要指定 mt-swipe 元素的宽和高. <mt-swipe :auto="4000" class="swipe"> &l ...
 - 用pyqt5做一个能python程序能插入图片的ide
			
之前只是放到github上了,现在一想应该开源,大家想继续做好这个ide的都能从这里起步. #注意在.py文件相同目录下放一个1.png做测试图片 #本质就是用html来实现图片 #写在前面的话:这个 ...
 - jquery panel加载(dialog加载类似)
			
项目情况: 主页面用引用了公共头文件(包含easui.min.js),使用easyui的dialog(href方式)打开窗口(被打开的窗口页面是纯html片段,无body元素等,也引入了公共头文件), ...
 - Remove duplicates
			
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...
 - Linux下Git安装及配置
			
转载自:https://blog.csdn.net/u013256816/article/details/54743470:加了一些自己的注释. yum安装 这里采用的是CentOS系统,如果采用yu ...
 - 安装hue-3.11.0
			
1) 配置HDFS HttpFS和WebHDFS 如果HDFS是HA方式部署的,则只能使用HttpFS,而不能用WebHDFS. 2) 安装依赖: apr-iconv-1.2.1 confuse-3. ...
 - storyBoard中取消键盘第一响应
			
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; } ...
 - (回文串 )Best Reward -- hdu -- 3613
			
http://acm.hdu.edu.cn/showproblem.php?pid=3613 Best Reward Time Limit: 2000/1000 MS (Java/Others) ...