2016-2017-2 20155322 实验三 敏捷开发与XP实践
2016-2017-2 20155322 实验三 敏捷开发与XP实践
实验内容
- XP基础
- XP核心实践
- 相关工具
实验知识点
敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。“敏捷流程”是一系列价值观和方法论的集合。从2001年开始,一些软件界的专家开始倡导“敏捷”的价值观和流程,他们肯定了流行做法的价值,但是强调敏捷的做法更能带来价值。
极限编程(eXtreme Programming,XP)是是一种全新而快捷的软件开发方法。XP团队使用现场客户、特殊计划方法和持续测试来提供快速的反馈和全面的交流:
- XP是以开发符合客户需要的软件为目标而产生的一种方法论
- XP是一种以实践为基础的软件工程过程和思想
- XP认为代码质量的重要程度超出人们一般所认为的程度
- XP特别适合于小型的有责任心的、自觉自励的团队开发需求不确定或者迅速变化的软件
- XP软件开发是什么样的通过 XP准则来表达:
- 沟通 :XP认为项目成员之间的沟通是项目成功的关键,并把沟通看作项目中间协调与合作的主要推动因素。
- 简单 :XP假定未来不能可靠地预测,在现在考虑它从经济上是不明智的,所以不应该过多考虑未来的问题而是应该集中力量解决燃眉之急。
- 反馈 :XP认为系统本身及其代码是报告系统开发进度和状态的可靠依据。系统开发状态的反馈可以作为一种确定系统开发进度和决定系统下一步开发方向的手段。
- 勇气:代表了XP认为人是软件开发中最重要的一个方面的观点。在一个软件产品的开发中人的参与贯穿其整个生命周期,是人的勇气来排除困境,让团队把局部的最优抛之脑后,达到更重大的目标。表明了XP对“人让项目取得成功”的基本信任态度。
- 编写代码一个重要的认识是“程序大多时候是给人看的”,编程标准使代码更容易阅读和理解,甚至可以保证其中的错误更少。编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。
实验步骤
实践一:Code菜单体验
- 在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下Code菜单,找出一项让自己感觉最好用的功能。提交截图,加上自己学号水印。
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));
}
}
我在菜单中找到一项比较好的功能叫optimize imports主要功能是删除无用和错误的import。

实践二:测试同伴Complex代码(加入不少于三个JUnit单元测试用例)
我找到了我同伴20155302的码云项目,找到了他的complex文件:
/**
* Created by 20155302 on 2017/4/27.
*/
public class Complex1{
private double r;
private double i;
public Complex(double r, double i) {
this.r = r;
this.i = i;
}
public static double getRealPart(double r) {
return r;
}
public static double getImagePart(double i) {
return i;
}
public Complex ComplexAdd(Complex c) {
return new Complex(r + c.r, i + c.i);
}
public Complex ComplexSub(Complex c) {
return new Complex(r - c.r, i - c.i);
}
public Complex ComplexMulti(Complex c) {
return new Complex(r * c.r - i * c.i, r * c.i + i * c.r);
}
public Complex ComplexDiv(Complex c) {
return new Complex((r * c.i + i * c.r)/(c.i * c.i + c.r * c.r), (i * c.i + r * c.r)/(c.i * c.i + c.r * c.r));
}
public String toString() {
String s = " ";
if (i > 0)
s = r + "+" + i + "i";
if (i == 0)
s = r + "";
if (i < 0)
s = r + " " + i + "i";
return s;
}
}
根据他的代码我写出如下测试:
/**
* Created by 20155322 on 2017/5/4.
*/
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.getRealPart(-1.0));
assertEquals(5.0, Complex.getRealPart(5.0));
assertEquals(0.0, Complex.getRealPart(0.0));
}
@Test
public void testgetImagePart() throws Exception {
assertEquals(-1.0, Complex.getImagePart(-1.0));
assertEquals(5.0, Complex.getImagePart(5.0));
assertEquals(0.0, Complex.getImagePart(0.0));
}
@Test
public void testgetPart() throws Exception {
assertEquals(4.0, Complex.getImagePart(4.0));
assertEquals(5.0, Complex.getImagePart(5.0));
assertEquals(1.0, Complex.getImagePart(1.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.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 -3.0i", c1.ComplexMulti(c2).toString());
assertEquals("-3.0+6.0i", c1.ComplexMulti(c3).toString());
assertEquals("-1.0 -3.0i", c2.ComplexMulti(c3).toString());
}
@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());
}
*/
}
测试结果如下:

实践三:重构练习
根据老师给的教学我对搭档的代码进行了重构练习,首先我找到的代码如下:
/**
* Created by dell on 2017/4/19.
*/
public class ClassTest1 {
public static void main(String [] args) {
//定义一个数组,比如
int arr[] = {1,2,3,4,5,6,7,8};
//打印原始数组的值
for(int a:arr){
System.out.print(a + " ");
}
System.out.println();
// 添加代码删除上面数组中的5
for(int a = 4; a <= (arr.length-2); a++){
arr[a] = arr[a+1];
}
arr[7] = 0;
//打印出 1 2 3 4 6 7 8 0
for(int a:arr){
System.out.print(a + " ");
}
System.out.println();
// 添加代码再在4后面5
for(int a = (arr.length-2); a >= 4; a--){
arr[a+1] = arr[a];
}
arr[4] = 5;
//打印出 1 2 3 4 5 6 7 8
for(int a:arr){
System.out.print(a + " ");
}
System.out.println();
}
}
然后,我通过refactor->Extract->Method来实现对部分变量的封装,也同时对于重复的部分循环语句进行了封装,结果如下:
/**
* Created by mac on 2017/5/4.
*/
public class RefactorTest {
@Override
public String toString() {
return "RefactorTest{}";
}
public static void main(String [] args) {
//定义一个数组,比如
int arr[] = {1,2,3,4,5,6,7,8};
//打印原始数组的值
PrintOut(arr);
PrintLn();
// 添加代码删除上面数组中的5
for(int a = 4; a <= (arr.length-2); a++){
arr[a] = arr[a+1];
}
arr[7] = 0;
//打印出 1 2 3 4 6 7 8 0
PrintOut(arr);
PrintLn();
// 添加代码再在4后面5
for(int a = (arr.length-2); a >= 4; a--){
arr[a+1] = arr[a];
}
arr[4] = 5;
//打印出 1 2 3 4 5 6 7 8
PrintOut(arr);
PrintLn();
}
private static void PrintLn() {
System.out.println();
}
private static void PrintOut(int[] arr) {
for(int a:arr){
System.out.print(a + " ");
}
}
}
实践四:Java密码学相关内容的学习
根据老师提供的Java密码学算法,我和结对伙伴对DES算法进行了详细的了解和学习。针对老师提供的Java代码,我们根据实践三中所学到的重构知识对老师的源码进行了重构,下面是老师的解密算法sDEC:
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public class SDec{
public static void main(String args[]) throws Exception{
// 获取密文
FileInputStream f=new FileInputStream("SEnc.dat");
int num=f.available();
byte[ ] ctext=new byte[num];
f.read(ctext);
// 获取密钥
FileInputStream f2=new FileInputStream("keykb1.dat");
int num2=f2.available();
byte[ ] keykb=new byte[num2];
f2.read(keykb);
SecretKeySpec k=new SecretKeySpec(keykb,"DESede");
// 解密
Cipher cp=Cipher.getInstance("DESede");
cp.init(Cipher.DECRYPT_MODE, k);
byte []ptext=cp.doFinal(ctext);
// 显示明文
String p=new String(ptext,"UTF8");
System.out.println(p);
}
}
我们的重构如下:
/**
* Created by mac on 2017/5/4.
*/
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public class SDec {
public static void main(String args[]) throws Exception {
// 获取密文
FileInputStream f = getFileInputStream("SEnc.dat");
int num = getAvailable(f);
byte[] ctext = getBytes(num);
f.read(ctext);
// 获取密钥
FileInputStream f2 = getFileInputStream("keykb1.dat");
int num2 = getAvailable(f2);
byte[] keykb = getBytes(num2);
f2.read(keykb);
SecretKeySpec k = new SecretKeySpec(keykb, "DESede");
// 解密
Cipher cp = Cipher.getInstance("DESede");
cp.init(Cipher.DECRYPT_MODE, k);
byte[] ptext = getBytes(ctext, cp);
// 显示明文
String p = getUtf8(ptext);
System.out.println(p);
}
private static byte[] getBytes(byte[] ctext, Cipher cp) throws IllegalBlockSizeException, BadPaddingException {
return cp.doFinal(ctext);
}
private static String getUtf8(byte[] ptext) throws UnsupportedEncodingException {
return new String(ptext, "UTF8");
}
private static byte[] getBytes(int num) {
return new byte[num];
}
private static int getAvailable(FileInputStream f) throws IOException {
return f.available();
}
private static FileInputStream getFileInputStream(String name) throws FileNotFoundException {
return new FileInputStream(name);
}
}
实验心得与体会:
本次实验老师给我们介绍了什么叫敏捷开发与XP实践,结合上一次提到的测试驱动开发,感觉知识点的衔接很流畅,有种环环相扣的感觉,对于理解非常有帮助。
本次实验还有一个好处就是,让我们了解了通过Java来实现密码学算法,由于Java庞大的通用API积累,使用起来确实比C语言这种面向过程的语言方便了不少。
PSP(Personal Software Process)时间
| 步骤 | 耗时(min) | 百分比(%) |
|---|---|---|
| 需求分析 | 30 | 18 |
| 设计 | 50 | 28 |
| 代码实现 | 30 | 18 |
| 测试 | 30 | 18 |
| 分析总结 | 30 | 18 |
参考资料
2016-2017-2 20155322 实验三 敏捷开发与XP实践的更多相关文章
- 20145213《Java程序设计》实验三敏捷开发与XP实践
20145213<Java程序设计>实验三敏捷开发与XP实践 实验要求 1.XP基础 2.XP核心实践 3.相关工具 实验内容 1.敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法 ...
- 20162311 实验三 敏捷开发与XP实践 实验报告
20162311 实验三 敏捷开发与XP实践 实验报告 实验内容 一.研究学习IDEA中的Code菜单 使用Code ->Reformate Code功能将以下代码格式化 public clas ...
- 20155229实验三 《Java面向对象程序设计实验三 敏捷开发与XP实践 》实验报告
实验题目 1.在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下Code菜单,找出一项让自己感觉最好用的功能. 2.下载搭档实验二的Complex代 ...
- 20145301 实验三 "敏捷开发与XP实践"
20145301 实验三 "敏捷开发与XP实践" 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.22 实验名称:敏捷开发与XP实践 一.实验 ...
- 20162307 实验三 敏捷开发与XP实践
实验三 <敏捷开发与XP实践> 北京电子科技学院(BESTI) 实 验 报 告 课程:程序设计与数据结构 班级:1623 姓名:张韵琪 学号:20162307 指导教师:娄佳鹏老师.王志强 ...
- 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告
20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...
- JAVA课程实验报告 实验三 敏捷开发与XP实践
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:韩玉琪 学号:20135317 成绩: 指导教师:娄嘉 ...
- 20145225《Java程序设计》 实验三 "敏捷开发与XP实践"
20145225<Java程序设计> 实验三 "敏捷开发与XP实践" 实验报告 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 git 上 ...
- 20145215实验三 敏捷开发与XP实践
20145215实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软 ...
随机推荐
- codeforces 420D Cup Trick
codeforces 420D Cup Trick 题意 题解 官方做法需要用到线段树+平衡树(? 如果数据小的话似乎可以用莫队).然后代码好长好长.我补了一个只要用到树状数组的做法. 代码 #inc ...
- 项目管理利器-Maven(Windows安装)
什么是Maven? 安装Maven环境: 下载地址:https://maven.apache.org/download.cgi Maven3.3+JDK1.7以上版本 下载windows版本 解压到本 ...
- MySQL面试宝典
==============================================# 参数==============================================auto ...
- ubuntu ibus 输入法总在左下角不跟随光标的处理
sudo apt-get install ibus-gtk ibus-gtk3 ibus-qt4 参考文章
- AI-Info-Micron:用内存解决方案演化神经网络智能
ylbtech-AI-Info-Micron:用内存解决方案演化神经网络智能 1.返回顶部 1. 用内存解决方案演化神经网络智能 我们的大脑每天会进行数千次极其复杂的操作.无论是提醒我们小心被炉子烫到 ...
- 5 个强大的 HTML5 API
HTML5提供了一些非常强大的JavaScript和HTML API,来帮助开发者构建精彩的桌面和移动应用程序.本文将介绍5个新型的API,希望对你的开发工作有所帮助. 1. 全屏API(Fulls ...
- Sublime插件WakaTime使用
1.安装WakaTime插件 ctrl+shift+p-->输入pi-->回车-->输入wakaTime-->回车(进行安装) 安装好后会显示输入api key的输入栏 (也可 ...
- PAT——1042. 字符统计
请编写程序,找出一段给定文字中出现最频繁的那个英文字母. 输入格式: 输入在一行中给出一个长度不超过1000的字符串.字符串由ASCII码表中任意可见字符及空格组成,至少包含1个英文字母,以回车结束( ...
- python codecs模块 ---处理数据写入文件时会有编码不统一的问题
我们用open方法打开文件有时候会有一些问题,因为open打开文件只能写入str类型,而不会管字符串是什么编码方式. 示例: >>> fr = open('test.txt','a' ...
- SSAS中CUBE的多对多关系既可以出现在中间事实表上也可以出现在中间维度表上
开发过SSAS中CUBE的朋友,肯定都知道维度用法中的多对多关系, 这篇文章不想详细阐述多对多关系在CUBE中的结构,详情请在网上寻找CUBE多对多关系的介绍资料. 下面是是一个典型的CUBE中多对多 ...