20165219 《Java程序设计》实验三(敏捷开发与XP实践)实验报告
一、实验报告封面
课程:Java程序设计 班级:1652班 姓名:王彦博 学号:20165219 成绩:
指导教师:娄嘉鹏 实验日期:2018年4月30日 实验时间:15:45 - 17:20
实验序号:实验三 实验名称:敏捷开发与XP实践
实验内容:
-
XP基础
-
XP核心实践
-
相关工具
实验要求:
1 没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程;
2 完成实验、撰写实验报告,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等);
3 实验报告中统计自己的PSP(Personal Software Process)时间;
4 严禁抄袭。
二、实验内容及步骤
(一)alibaba 插件与Code菜单
Move Line/statement Down/Up:将某行、表达式向下、向上移动一行
suround with:用 try-catch,for,if等包裹语句
comment with line/block comment:把选中它区域变成注释
show reformat file dialog:按照格式自动对齐
Optimize imports:优化imports
Insert Live Template:插入 Live Template 缩写
例如:comment with line/block comment,把代码中选中的部分变成注释 
(二)Complex代码添加测试用例
同伴代码
1public class Complex { 2 // 定义属性并生成getter,setter 3 private double r; 4 private double i; 5 6 // 定义构造函数 7 public Complex(double r, double i) { 8 this.r = r; 9 this.i = i; 10 } 11 12 public static double getRealPart(double r) { 13 return r; 14 } 15 16 public static double getImagePart(double i) { 17 return i; 18 } 19 20 //Override Object 21 public boolean equals(Object obj) { 22 23 Complex complex = (Complex) obj; 24 if (complex.r != r) { 25 return false; 26 } 27 if (complex.i != i) { 28 return false; 29 } 30 return true; 31 } 32 33 public String toString() { 34 String str = new String(); 35 if (i == 0) str = r + ""; 36 else if (i < 0) str = r + "" + i + "i"; 37 else str = r + "" + "+" + i + "i"; 38 return str; 39 } 40 41 // 定义公有方法:加减乘除 42 Complex ComplexAdd(Complex a) { 43 return new Complex(r + a.r, i + a.i); 44 } 45 46 Complex ComplexSubtract(Complex a) { 47 return new Complex(r - a.r, i - a.i); 48 } 49 50 Complex ComplexMultiply(Complex a) { 51 return new Complex(r * a.r - i * a.i, r * a.i + i * a.r); 52 } 53 54 Complex ComplexDivide(Complex a) { 55 return new Complex((r * a.r + i * a.i) / (a.r * a.r + a.i * a.i), (i * a.r - r * a.i) / (a.r * a.r + a.i * a.i)); 56 } 57} 58
添加测试用例
1import junit.framework.TestCase; 2import org.junit.Test; 3import static org.junit.Assert.*; 4public class ComplexTest extends TestCase { 5 Complex a=new Complex(1,2); 6 Complex b=new Complex(-2,-1); 7 Complex d=new Complex(4,-2); 8 @Test 9 public void testequals(){ 10 assertEquals(false,a.equals(b)); 11 assertEquals(false,b.equals(c)); 12 assertEquals(true,new Complex(1.0,2.0).equals(a)); 13 } 14 15 @Test 16 public void testAdd(){ 17 assertEquals(new Complex(-1,1),a.ComplexAdd(b)); 18 assertEquals(new Complex(5,0),a.ComplexAdd(c)); 19 } 20 @Test 21 public void testSubtract(){ 22 assertEquals(new Complex(3,3),a.ComplexSubtract(b)); 23 assertEquals(new Complex(-3,4),a.ComplexSubtract(c)); 24 } 25 @Test 26 public void testMultiply(){ 27 assertEquals(new Complex(0,-5),a.ComplexMultiply(b)); 28 assertEquals(new Complex(17,4),new Complex(3,2.5).ComplexMultiply(c)); 29 } 30 @Test 31 public void testDivide(){ 32 assertEquals(new Complex(0,0.5),a.ComplexDivide(c)); 33 assertEquals(new Complex(-2,-1),b.ComplexDivide(new Complex(1,0))); 34 } 35} 36
测试通过的截图

git log的截图 

(三)重构
Rename可以给类、包、方法、变量改名字,增加代码的可读性。

Refactor->Encapsulate Field...用来封装成员变量

Source->Generate toString()...用来产生一个toString方法
(四)以结对方式完成Java密码学的学习
凯撒密码的密钥是3,算法是将普通字母表中的字母用密钥对应的字母替换
凯撒密码的加密过程可记为如下一个变换:
c≡m+k mod n (其中n为基本字符个数)
同样,解密过程可表示为:
m≡c+k mod n (其中n为基本字符个数)
成果如下:

重构 将Code,Rename为Caesar,并为p赋初值0 
三、实验体会
通过本次实验,又一次体会到了结对编程的魅力,通过学习重构代码,也理解了,代码的规范性以及可读性的重要意义。
四、PSP
步骤
耗时
百分比
需求分析
20min
8%
设计
60min
25%
代码实现
120min
50%
测试
10min
4%
分析总结
30min
13%