实验三 敏捷开发与XP实践
课程:Java程序设计
班级:1652
姓名:孔月
学号:20165208
指导教师:娄嘉鹏
实验日期:2018.4.28
实验名称:敏捷开发与XP实践
实验内容及要求:
- XP基础
- XP核心实践
- 相关工具
实验内容、步骤与体会
目录:
- (一)在IDEA中使用工具格式化代码,并学习Code菜单的功能
- (二)下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例
- (三)下载搭档的代码,至少进行三项重构
- (四)以结对的方式完成Java密码学相关内容的学习,结合重构、git、代码标准等
(一)在IDEA中使用工具格式化代码,并学习Code菜单的功能
- Alibaba Java Code Guidelines的安装IDEA界面打开 Settings ->Plugins -> Browse repositories...,在搜索框输入alibaba即可看到Alibaba Java Code Guidelines插件,点击Install进行安装,然后重启IDEA生效。
下载完成后开始进行代码规范操作
以下为老师所给的源代码
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菜单相关内容
Override Methods
:重载基本类的方法Implement Methods
:完成当前类implements的(或者抽象基本类的)接口的方法Generate
:创建类里面任何字段的 getter 与 setter 方法;Surround With
:使用if-else、try-catch、do-while等多种语句对代码段进行包装Code->Comment with Line Comment
此行改写为注释Code->Comment with Block Comment
此行添加注释Reformat Code
:将代码按标准格式缩进show reformat file dialog
:按照格式自动对齐Optimize imports
:优化imports,去除不必要的importsMove Line/statement Down/Up
:将某行、表达式向下、向上移动一行
相较来说对我最实用的是Reformat Code
和 Code->Comment with Block Comment
(二)下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例
import java.util.Scanner;
import java.lang.String;
public class Complex {
double shibu;
double xubu;
public Complex(double shibu,double xubu){
this.shibu=shibu;
this.xubu=xubu;
}
public static double getShibu(double shibu) {
return shibu;
}
public static double getXubu(double xubu) {
return xubu;
}
public boolean equals(Object obj){
if(this == obj) {
return true;
}
if(!(obj instanceof Complex)) {
return false;
}
Complex complex = (Complex) obj;
if(complex.shibu != ((Complex) obj).shibu) {
return false;
}
if(complex.xubu != ((Complex) obj).xubu) {
return false;
}
return true;
}
Complex ComplexAdd(Complex a){
double shibu2=shibu+a.shibu;
double xubu2=xubu+a.xubu;
return new Complex(shibu2,xubu2);
}
Complex ComplexSub(Complex b){
double shibu2=shibu - b.shibu;
double xubu2=xubu - b.xubu;
return new Complex(shibu2,xubu2);
}
Complex ComplexMulti(Complex c){
double shibu2=(shibu * c.shibu)-(xubu*c.xubu);
double xubu2=(xubu * c.xubu)+(xubu * c.shibu);
return new Complex(shibu2,xubu2);
}
Complex ComplexDiv(Complex d){
double shibu2=(shibu * d.xubu+xubu * d.shibu) / (d.xubu * d.xubu+d.shibu * d.shibu);
double xubu2=(xubu*d.xubu+shibu*d.shibu)/(d.shibu*d.shibu+ d.xubu*d.xubu);
return new Complex(shibu2,xubu2);
}
public String toString(){
String s="";
if(xubu>0)
s=shibu+"+"+xubu+"i";
if(xubu<0)
s=shibu+xubu+"i";
if (xubu==0)
s=""+shibu;
return s;
}
}
以上为搭档的产品代码,根据其写下了测试代码
import junit.framework.TestCase;
import org.junit.Test;
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, Complex.getShibu(-1.0));
assertEquals(5.0, Complex.getShibu(5.0));
assertEquals(0.0, Complex.getShibu(0.0));
}
@Test
public void testgetImagePart() throws Exception {
assertEquals(-1.0, Complex.getXubu(-1.0));
assertEquals(5.0, Complex.getXubu(5.0));
assertEquals(0.0, Complex.getXubu(0.0));
}
@Test
public void testComplexComplexDiv() throws Exception {
assertEquals("-1.5 -1.5i", c1.ComplexDiv(c2).toString());
assertEquals("1.2+0.6i", c1.ComplexDiv(c3).toString());
assertEquals("-0.6 -0.6i", c2.ComplexDiv(c3).toString());
}
@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.ComplexSub(c2).toString());
assertEquals("-2.0+2.0i", c1.ComplexSub(c3).toString());
assertEquals("-3.0 -2.0i", c2.ComplexSub(c3).toString());
}
@Test
public void testComplexMulti() throws Exception {
assertEquals("3.0 -6.0i", c1.ComplexMulti(c2).toString());
assertEquals("-3.0+9.0i", c1.ComplexMulti(c3).toString());
assertEquals("-1.0 -3.0i", c2.ComplexMulti(c3).toString());
}
}
测试过程中也有出现问题,我发现他的代码出现了和我当时一样的错误,即,在检测时只能通过3个测试用例,根据反馈查错发现原代码在 s=shibu+xubu+"i";
中默认将前两个变量先进行了求和运算,未起到原有目的,后改进为 s=shibu+" "xubu+"i";
即可进行运算。
测试代码通过截图如下
(三)下载搭档的代码,至少进行三项重构
我选择的搭档代码为求组合数递归的,具体代码如下:
public class aka20165211 {
public static void main(String[] args) {
int [] tmp=new int[args.length];
for (int i=0;i<args.length;i++){
tmp[i]=Integer.parseInt(args[i]);
}
if(tmp[0]<tmp[1]){
System.out.println("error!");
}
else{
System.out.println(C(tmp[0],tmp[1]));
}
}
private static int C(int n,int m){
if(m==1)
return n;
else if(m==n)
return 1;
else
return C(n-1,m-1)+C(n-1,m);
}
}
观察后发现,代码整体简洁明了,主要有以下小问题
- 类名不符合命名规则,无法通过类名得知代码具体功能;
- 代码格式不规范
- 除了以上需要重构的地方外我发现它的分类标准还存在一些小遗漏,更改填充后的效果如下图。
最终运行效果如图
(四)以结对的方式完成Java密码学相关内容的学习,结合重构、git、代码标准等
我们选择的是MD5加密算法的编程实现,根据老师的博客中所写的java.security包中的MessageDigest类提供了计算消息摘要的方法,首先生成对象,执行其update()方法可以将原始数据传递给该对象,然后执行其digest( )方法即可得到消息摘要。
我和我的结对伙伴在参考了老师的博客后,协作进行了此次实验,具体代码如下
import java.security.MessageDigest;
public class MD5 {
public static String MD5(String key) throws Exception {
byte[] cipher = key.getBytes();
MessageDigest clear = MessageDigest.getInstance("MD5");
clear.update(cipher);
byte s[] = clear.digest();
StringBuffer str = new StringBuffer();
for (int i = 0; i < s.length; i++) {
int a = ((int) s[i]) & 0xff;
if (a < 16) {
str.append("0");
}
str.append(Integer.toHexString(a));
}
return str.toString();
}
public static void main(String args[]) throws Exception {
String str1 = new String("dingyi");
System.out.println("原始:" + str1);
System.out.println("MD5后:" + MD5(str1));
String str2 = new String("kongyue");
System.out.println("原始:" + str2);
System.out.println("MD5后:" + MD5(str2));
String str3 = new String("abc");
System.out.println("原始:" + str3);
System.out.println("MD5后:" + MD5(str3));
}
}
运行截图如下
问题总结与体会
- 问题1:如何将自己的搭档加入到自己的项目中
- 解决方法1:进入自己的项目页面,点击管理,添加项目成员,选择开发者发送邀请。
- 问题2:如何将自己的代码上传到结对伙伴的项目中,保证上传者为自己
- 解决方案:首先对于将结对伙伴的代码克隆到自己的电脑中的操作为打开IDEA在功能栏中选择File->New->Project from Version Control,克隆完成后在原有基础上进行修改,修改完成后单击选择git,Commit file,选择commit。
- 体会:本次实验相对来说比上一次的简单些,让我印象深刻的主要是后两个实验,实验三是在我观察分析结对伙伴的代码时发现对方的代码真的很简洁明了,能被更正的地方很少,相较来说我本人的代码则有很多地方需要更正与重构的,这次结对让我认识到了自己的不足,同时也通过这次实验让我学到了很多有关代码规范的要求,也矫正了写代码的一些不好的习惯。而实验四则是要求写一篇有关密码学的代码,按照计划是我写测试代码,队友写产品代码,然而按照单元测试的方法我的代码不能成功运行,后更正为了在产品代码中直接进行检测最终进行输出。
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 15 min | 11.1% |
设计 | 30 min | 22.2% |
代码实现 | 45 min | 33.3% |
测试 | 20 min | 14.8% |
分析总结 | 25 min | 18.5% |