20155202 《Java程序设计》实验三(敏捷开发与XP实践)实验报告
代码托管
实验内容
-
XP基础
-
XP核心实践
-
相关工具
实验要求
1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
- 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
实验步骤
(一)敏捷开发与XP
- 软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护。
- 人们在开发、运营、维护软件的过程中有很多技术、做法、习惯和思想体系。软件工程把这些相关的技术和过程统一到一个体系中,叫“软件开发流程”。软件开发流程的目的是为了提高软件开发、运营、维护的效率,并提高软件的质量、用户满意度、可靠性和软件的可维护性。
- 光有各种流程的思想是不够的,我们还要有一系列的工具来保证这些思想能够在实践中有效率地运作。软件开发很重要的一点不是看你能对多少理论讲的头头是道,还要看你对相关工具应用的如何,比如Java中单元测试要和JUnit的应用结合起来,建模要和Umbrello或StarUML的应用结合起来。编程学习是一个习而学的过程。
- 一个常见的公式是:软件工程=开发流程+工具
XP是一种更加灵活的开发方式和理念,通过迅速的反应及时充分修改程序,保证所有团队成员对资源和责任的共享;适用于“小而精”的团队开发。同时,其所倡导的“倾听”也是实现了程序开发“需求至上”的终极目标。
(二)编码标准
- 编程标准使代码更容易阅读和理解,甚至可以保证其中的错误更少。编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。
- 关于程序的缩进,在IDEA中比较智能,它会帮你自动进行缩进,这样也使得程序的可读性大大增强。
- Java中的一般命名规则:
- 要体现各自的含义
- 包、类、变量用名词
- 方法名用动宾
- 包名全部小写,如:io,awt
- 类名第一个字母要大写,如:HelloWorldApp
- 变量名第一个字母要小写,如:userName
- 方法名第一个字母要小写:setName
- 在团队操作中,格式规范是为提高效率扫清障碍的做法;命名规范则具有很强灵活性,根据各团队不同的情况和习惯进行,不仅是方便自己,更是方便团队其他成员。
(三)结对编程
- 结对编程中的两个重要角色:驾驶员(Driver)是控制键盘输入的人,领航员(Navigator)起到领航、提醒的作用。
- 驾驶员:写设计文档,进行编码和单元测试等XP开发流程。领航员:审阅驾驶员的文档、驾驶员对编码等开发流程的执行;考虑单元测试的覆盖率;思考是否需要和如何重构;帮助驾驶员解决具体的技术问题。
- 驾驶员和领航员不断轮换角色,不要连续工作超过一小时,每工作一小时休息15分钟。领航员要控制时间。
(四)版本控制
- 版本控制提供项目级的 undo(撤销) 功能;
- 版本控制允许多人在同一代码上工作;
- 版本控制系统保存了过去所作的修改的历史记录;
- git命令上传代码:
$ cd /home/shiyanlou/Code/shiyanlou_cs212
# 修改代码文件
# 添加修改文件
$ git add 所有修改的文件
# 提交到环境中本地代码仓库
$ git commit -m '本次修改的描述'
# push到git.shiyanlou.com,无需输入密码
$ git push
(五)重构
重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。重构最主要的目标就是清楚“有臭味道”的代码,主要表现为重复代码。
在此介绍一下IDEA中如何进行重构:
- 右键你想重构的类
- 点
refactor
然后选Encapsulate Field...
点击refactor
重构
重构后模样:
- 对name重构
- 对全部重构
(六)实践项目
我和 20155239吕宇轩分工,把他拉入我项目,设他为管理者。
-
吕宇轩在他的电脑上输入git clone 我的项目地址,将我所上传的伪代码下载下来。
-
根据我的产品代码,写出他的测试代码。
-
我再对它进行修改以及重构,最终完成了Complex代码的编写:
-
产品代码:
public class ComplexNumber
{
double r,i;
public ComplexNumber(){
this.r=0;
this.i=0;
}
public ComplexNumber(double r, double i){
this.r=r;
this.i=i;
}
public double GetRealPart(){
return this.r;
}
public double GetImaginaryPart(){
return this.i;
}
public void SetRealPart(double r){
this.r=r;
}
public void SetImaginaryPart(double i){
this.i=i;
}
public ComplexNumber ComplexAdd(ComplexNumber a,ComplexNumber b)
{
ComplexNumber temp = new ComplexNumber();
temp.r = a.r + b.r;
temp.i = a.i + b.i;
return temp;
}
public ComplexNumber ComplexMinus(ComplexNumber a,ComplexNumber b)
{
ComplexNumber temp =new ComplexNumber();
temp.r=a.r - b.r;
temp.i =a.i - b.i;
return temp;
}
public ComplexNumber ComplexMulti(ComplexNumber a,ComplexNumber b)
{
ComplexNumber temp = new ComplexNumber();
temp.r = a.r*b.r-a.i*b.i;
temp.i = a.r*b.i+a.i*b.r;
return temp;
}
public void ComplexAdd(ComplexNumber c){
this.r=this.r+c.r;
this.i=this.i+c.i;
}
public void ComplexMinus(ComplexNumber c){
this.r=this.r-c.r;
this.i=this.i-c.i;
}
public void ComplexMulti(ComplexNumber c)
{
double temp=this.r;
this.r=this.r*c.r-this.i*c.i;
this.i =temp*c.i+this.i*c.r;
}
public void printComplexNumber(){
System.out.print(""+this.r+"+"+this.i+"i");
}
}
测试代码:
import junit.framework.TestCase;
import org.junit.Test;
/**
* Created by zx on 17-5-3.
*/
public class ComplexNumberTest extends TestCase {
@Test
public void test1() //测试代码
{
ComplexNumber cc=new ComplexNumber(4,5);
cc.printComplexNumber();
System.out.println();
ComplexNumber dd=new ComplexNumber(2,4);
dd.printComplexNumber();
System.out.println();
System.out.println("-----------------");
System.out.println();
ComplexNumber ff=new ComplexNumber();
ff=ff.ComplexMinus(cc,dd);
ff.printComplexNumber();
System.out.println();
}
@Test
public void test2() //测试代码
{
ComplexNumber cc=new ComplexNumber(3,5);
cc.printComplexNumber();
System.out.println();
ComplexNumber dd=new ComplexNumber(2,4);
dd.printComplexNumber();
System.out.println();
System.out.println("-----------------");
System.out.println();
ComplexNumber ff=new ComplexNumber();
ff=ff.ComplexAdd(cc,dd);
ff.printComplexNumber();
System.out.println();
}
@Test
public void test3() //测试代码
{
ComplexNumber cc=new ComplexNumber(1,5);
cc.printComplexNumber();
System.out.println();
ComplexNumber dd=new ComplexNumber(2,4);
dd.printComplexNumber();
System.out.println();
System.out.println("-----------------");
System.out.println();
ComplexNumber ff=new ComplexNumber();
ff=ff.ComplexMulti(cc,dd);
ff.printComplexNumber();
System.out.println();
System.out.println("-----------------");
}
}
密码学重构凯撒密码
-
代码如下:
import java.io.*;
import java.util.Scanner;
public class kaisa{
public static void main(String[] args){
System.out.print("请输入密钥:");
Scanner s=new Scanner(System.in);
int a=s.nextInt();
C(a);
}
public static void C(int n){
try{
char b[];
BufferedReader br2=new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入一段明文:");
String str2=br2.readLine();
b=str2.toCharArray();
System.out.println("密文为:");
int k=n;
for(int i=0;i<str2.length();i++){
char ch=(char)((b[i]-'a'+k)%26+'a');
System.out.print(ch);
}
System.out.println("密匙k="+k);
}catch(IOException e){
System.out.println(e.getMessage());
}
}
}
PSP(Personal Software Process)时间
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 15分钟 | 9% |
设计 | 15分钟 | 9% |
代码实现 | 110分钟 | 64% |
测试 | 10分钟 | 6% |
分析总结 | 20分钟 | 12% |
总结
- 本次实验较为简单,其中亮点是团队合作。
- 本次实验通过团队合作,我们不仅对团队开发这一概念有了深刻认识,更对XP这一思想有了初步的理解。我觉得之所以要在这个过程中提倡团队开发,首先,软件开发的过程复杂,而团队方式可以使其简单许多,团队操作在很大程度上可以实现优势的互补。这两个方面就需要两个分别擅长其中一项的人来进行合作。但是在我们以后做大项目的时候,团队开发将会给我们提供很多方便。
- 所以我很满意这次实验。