2018-2019-20175322 实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告
实验内容
- 1.XP基础
- 2.XP核心实践
- 3.相关工具
实验要求
- 1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
- 2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
-
- 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
实验步骤
(一)编码标准
-
Java中的一般的命名规则有:
- 要体现各自的含义
- 包、类、变量用名词
- 方法名用动宾
- 包名全部小写,如:io,awt
- 类名第一个字母要大写,如:HelloWorldApp
- 变量名第一个字母要小写,如:userName
- 方法名第一个字母要小写:setName
- ...
-
安装alibaba插件
-
打开
Settings ->Plugins
-
在搜索框输入
alibaba
即可看到Alibaba Java Code Guidelines
插件,点击Install
进行安装,然后重启IDE生效,安装完成后如图:
-
在项目名称上单击右键,在弹出菜单上选择
编码规约扫描
,出现下图内容:
-
不规范的地方,有中文提示并且定位到了行,alibaba把问题分为block/critical/major三个等级,有些规则可以一键修复
-
-
代码问题:
- 在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用
if(conditions)statement;
- 所有的覆写方法,必须加@Override注解
- Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals
- 方法名,参数名,成员变量,局部变量都统一使用lowerCamelCase,必须遵循驼峰形式
- 不允许任何魔法值(即未经定义的常量)直接出现在代码中
- 所有的类都必须添加创建者信息
- 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释。注意与代码对齐
- 类、类属性、类方法的注释必须使用javadoc规范,使用/**内容/格式,不得使用//xxx方式和/xxx*/方式
- 类名使用UpperCamelCase风格,必须遵从驼峰形式,但以下情形例外:(领域模型的相关命名)DO / BO / DTO / VO / DAO
- 在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用
-
规范后的代码:
/**
* CodeStandard
* @author zyh20175322
* @date 2019/5/2
*/
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());
int n = 20;
if (buffer.capacity() < n){
buffer.append("1234567");
}
for (int i = 0; i < buffer.length(); i++){
System.out.println(buffer.charAt(i));
}
}
}
- 规范后显示`No suspicious code found. 1 files processed in File...`表明未发现可疑代码,规范成功
- code菜单
-
重写覆盖方法(Override Methods):
Ctrl + O
-
实现接口方法(Implements Methods):
Ctrl + I
-
Gengrate:
Alt + Insert
-
Surround With:
Ctrl+Alt+T
-
智能选择并实现(SmartType):
Ctrl + Shift + 空格
-
循环往上选择单词(Cyclic Expand Word):
Alt + /
-
循环往下选择单词 (Cyclic Expand Word)
Alt + Shift + /
-
方法展开 ( Expand)
Ctrl + 加号
-
方法折叠 (Collapse)
Ctrl + 减号
-
全部方法展开( Expand All )
Ctrl + Shift + 加号
-
全部方法折叠 ( Collapse All )
Ctrl + Shift + 减号
-
展开Java doc注释 ( Expand doc comments )
-
折叠Java doc注释 ( Collapse doc comments )
-
行注释 (Comment with Line Comment )
Ctrl + /
-
块注释 ( Comment with Block Comment )
Ctrl + Shift + /
-
格式化代码 (Reformat Code )
Ctrl + Alt + L
-
弹出格式化弹框 ( Show Reformat File Dialog )
Ctrl + Alt + Shift + L
-
重新整理代码 (Rearrange Code)
-
(二)Git中添加添加仓库成员及测试代码
- 要求:
- 在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后,下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例,测试成功后git add .; git commit -m "自己学号 添加内容";git push;
- 提交搭档项目git log的截图,包含上面git commit的信息,并加上自己的学号水印信息
- 步骤:
-
打开码云,进入仓库,点击
管理 -> 添加仓库成员 -> 邀请用户
-
效果:
-
搭档的Complex代码:
-
public class Complex { //a + bi
private double a;
private double b;
public Complex(){ //构造方法,置0
this.a = 0;
this.b = 0;
}
public Complex(double a, double b) { //构造方法,初始化一个复数
this.a = a;
this.b = b;
}
public double getA(){ //获取实部
return this.a;
}
public double getB(){ //获取虚部
return this.b;
}
public double setA(double a){ //设置实部
this.a = a;
return a;
}
public double setB(double b){ //设置虚部
this.b = b;
return b;
}
Complex ComplexAdd(Complex c){//复数相加
double a = c.getA();
double b = c.getB();
double newA = a + this.a;
double newB = b + this.b;
Complex Result = new Complex(newA,newB);
return Result;
}
Complex ComplexMinus(Complex c){//复数相减
double a = c.getA();
double b = c.getB();
double newA = a - this.a;
double newB = b - this.b;
Complex Result = new Complex(newA,newB);
return Result;
}
Complex ComplexMulti(Complex c){//复数相乘
double a = c.getA();
double b = c.getB();
double newA = a * this.a;
double newB = b * this.b;
Complex Result = new Complex(newA,newB);
return Result;
}
Complex ComplexDiv(Complex c){//复数相乘
double a = c.getA();
double b = c.getB();
double newA = a / this.a;
double newB = b / this.b;
Complex Result = new Complex(newA,newB);
return Result;
}
public String toString() {
String s = " ";
if (b > 0)
s = a + "+" + b + "i";
if (b == 0)
s = a + "";
if (b < 0)
s = a + " " + b + "i";
return s;
}
}
- 搭档测试代码:
import junit.framework.TestCase;
import org.junit.Test;
import static org.junit.Assert.*;
public class ComplexTest extends TestCase {
Complex c1 = new Complex(0, 3);
Complex c2 = new Complex(-1, -1);
Complex c3 = new Complex(2,1);
@Test
public void testgetRealPart() throws Exception {
assertEquals(-1.0, new Complex().setA(-1.0));
assertEquals(5.0, new Complex().setA(5.0));
assertEquals(0.0, new Complex().setA(0.0));
}
@Test
public void testgetImagePart() throws Exception {
assertEquals(-1.0, new Complex().setB(-1.0));
assertEquals(5.0, new Complex().setB(5.0));
assertEquals(0.0, new Complex().setB(0.0));
}
@Test
public void testComplexAdd() throws Exception {
assertEquals("-1.0+2.0i", c1.ComplexAdd(c2).toString());
assertEquals("2.0+4.0i", c1.ComplexAdd(c3).toString());
assertEquals("1.0", c2.ComplexAdd(c3).toString());
}
@Test
public void testComplexSub() throws Exception {
assertEquals("-1.0 -4.0i", c1.ComplexMinus(c2).toString());
assertEquals("2.0 -2.0i", c1.ComplexMinus(c3).toString());
assertEquals("3.0+2.0i", c2.ComplexMinus(c3).toString());
}
@Test
public void testComplexMulti() throws Exception {
assertEquals("-0.0 -3.0i", c1.ComplexMulti(c2).toString());
assertEquals("0.0+3.0i", c1.ComplexMulti(c3).toString());
assertEquals("-2.0 -1.0i", c2.ComplexMulti(c3).toString());
}
@Test
public void testComplexComplexDiv() throws Exception {
assertEquals("-0.0 -3.0i", c2.ComplexDiv(c1).toString());
assertEquals("-0.0 -3.0i", c2.ComplexDiv(c1).toString());
assertEquals("-2.0 -1.0i", c2.ComplexDiv(c3).toString());
}
}
- 测试结果:
(三)重构
- 要求:完成重构内容的练习,下载搭档的代码,至少进行三项重构,提交重构后代码的截图,加上自己的学号水印。提交搭档的码云项目链接
- 步骤:
-
添加创建者信息
-
给覆写方法加上@Override注解
-
方法名,参数名,成员变量,局部变量都统一使用lowerCamelCase,遵从驼峰形式
-
在if/else/for/while/do语句中必须使用大括号,即使只有一行代码
-
规范结果:
-