20162330 实验三 《敏捷开发与XP实践》 实验报告
课程名称:《程序设计与数据结构》
学生班级:1623班
学生姓名:刘伟康
学生学号:20162330
实验时间:2017年5月12日
实验名称:《敏捷开发与XP实践》
指导老师:娄嘉鹏、王志强老师
主目录
实验内容:
1.XP基础
2.XP核心实践
3.相关工具
实验要求:
1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》、《Vim编辑器》 课程;
2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导;
3.严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施;
实验步骤:
(一)敏捷开发与XP
敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。
敏捷开发包括很多模式。其中,极限编程(eXtreme Programming,XP)是一种全新而快捷的软件开发方法。一项实践在XP环境中成功使用的依据通过
XP的法则
呈现,包括:快速反馈、假设简单性、递增更改、提倡更改、优质工作。
XP软件开发的基石是XP的活动
,包括:编码、测试、倾听、设计。
项目成员用户成功执行XP活动的技术通过XP实践
来呈现,包括编程、团队、过程相关的12条实践,我们关注其中的编码标准
,结对编程
,代码集体所有
,测试
,重构
等实践。上次实验已经讲过TDD,通过学习这些实践,可以形成以测试为核心的开发流程。
敏捷可以作为一种做事的方式,掌握好的在以后的工作中也会受益无穷。
(二)编码标准
编写代码一个重要的认识是“程序大多时候是给人看的”,编程标准使代码更容易阅读和理解,甚至可以保证其中的错误更少。编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。
编码标准中的版式反例:(该程序影响了可读性。程序的版式追求清晰、美观,是程序风格的重要因素。)
- 代码标准中很重要的一项是如何给包、类、变量、方法等标识符命名,能很好的命名可以让自己的代码立马上升一个档次。Java中的一般的命名规则有:
- 要体现各自的含义
- 包、类、变量用名词
- 方法名用动宾
- 包名全部小写,如:io,awt
- 类名第一个字母要大写,如:HelloWorldApp
- 变量名第一个字母要小写,如:userName
- 方法名第一个字母要小写:setName
可以参考邹欣老师写的代码规范与代码复审。
(三)结对编程
- 结对编程中有两个角色:
- 驾驶员(Driver)是控制键盘输入的人。
- 领航员(Navigator)起到领航、提醒的作用。
(四)版本控制
- 注意Git的使用
了解git pull
git add
git commit
git push
git status
git log
等命令行的用法和含义。
(五)重构
重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更。
一个完整的重构流程包括:
1.从版本控制系统代码库中Check out code
2.读懂代码(包括测试代码)
3.发现bad smell
4.Refactoring
5.运行所有的Unit Tests
6.往代码库中Check in code
(六)实践项目
1.在IDEA中使用工具(Code->Reformat Code)把示例代码重新格式化,再研究一下Code菜单;
2.在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后,下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例;
3.完成重构内容的练习,下载搭档的代码,至少进行三项重构;
4.以结对的方式完成Java密码学相关内容的学习。
5.实验报告中统计自己的PSP(Personal Software Process)时间
前期准备:
- 预先安装好IDEA,并配置好环境变量。
需求分析:
1.需要掌握单元测试和TDD;
2.需要理解并掌握Git的用法;
3.需要初步掌握IDEA中的一些菜单工具;
4.需要初步掌握Java密码学相关知识;
代码实现:
-
1.在IDEA中使用工具(Code->Reformat 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)); } }
可以看得出来以上的示例代码格式比较混乱,可读性较差,然而将它复制到IDEA中时,便被自动格式化了,这样一来用不用Reformat不都无所谓了吗?其实还是有细微差别的,如下图(左:直接复制到IDEA后,右:Reformat之后)
在Code菜单中找出一项让自己感觉最好用的功能:
我主要试用了Code
中的Override Methods...
功能,可以直接复写方法:
其实还有一些其他的功能比较实用,比如可以给代码块增加条件循环语句的Surround with...
功能,可以调整任何一行代码位置的Move Line Down
Move Line Up
功能,包括之前使用过的可以生成测试代码框架的Generate...
功能等。2.在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后,下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例:
【代码链接】3.完成重构内容的练习,下载搭档的代码,至少进行三项重构:
(感觉在重构时考虑得太少,所以没有发现示例代码中需要改进的地方,只是尝试了一些基本功能)
【代码链接】4.以结对的方式完成Java密码学相关内容的学习:
(我选择在虚拟机上进行学习和测试,不懂的一些地方也已经向张旭升请教,感觉这方面内容并不熟练,理解至关重要)
【代码链接】
测试过程及遇到的问题:
1.由于之前在IDEA删除了一些项目,我在IDEA中重新克隆项目时出现clone failed的问题:
我打开克隆项目发现有但是不能运行:解决办法:通过搜索,我查找到正确的解决方法,这个错误是因为没有设置output的路径,在网上看到了两种方法:
第一种方法:在Modules设置里勾选”Inherit project compile path” ,由于bin文件要设置绝对路径我就没有修改此路径,主要是用了第二种方法:设置Project中的”Project compiler output” 。
设置好就可以正常运行了。2.在使用TDD进行单元测试时,不知道怎么添加Junit生成的方法框架中的测试代码,上一次实验是直接给出的期望测试代码,但是期望代码的格式框架我并没有掌握:
-
解决办法:看了王彪上次的实验博客,掌握了基本Assert的框架,并询问了张旭升之后,可以写出基本的单元测试的代码:
Assert的基本框架如下:import junit.framework.*; public class TestSimple extends TestCase{ public TestSimple(String name){ super(name);} public void testAdd(){ assertEquals(2,1+1);} }
首先要根据源代码找到测试类中应该被测试的方法,其次要使用assertEquals期望值的格式进行测试,这样的好处是:即使出现红条(实际值与期望值不符合)也会显示提示:
之后只需弄清出错的原因并修改即可测试成功: -
3.在学习Java密码学相关内容时不理解凯撒密码(如下)的转换机制。
public static void main(String args[]) throws Exception{ String s=args[0]; int key=Integer.parseInt(args[1]); String es=""; for(int i=0;i<s.length( );i++) { char c=s.charAt(i); if(c>='a' && c<='z') // 是小写字母 { c+=key%26; //移动key%26位 if(c<'a') c+=26; //向左超界 if(c>'z') c-=26; //向右超界 } else if(c>='A' && c<='Z') // 是大写字母 { c+=key%26; if(c<'A') c+=26; if(c>'Z') c-=26; } es+=c; } System.out.println(es); }
-
解决办法:询问结对队友张旭升,了解到:
1.凯撒密码中只针对字母类型的明文进行加密,并且毫无遗漏;
2.如果给空格或者其他字符串类型的(数字、符号等)加密,会以明文形式输出;
3.之所以输入明文“Hello World!”,取密钥4,运行:java Caesar "Hello World!" 4
将输出“Lipps Asvph!”的结果,是因为凯撒密码是以字母对应的ASCII码为机制进行加密的,所以比较容易破解。
在看了ASCII码表之后,理解起来就容易多了。
分析总结:
对于本周的实验,我的投入较少,就是感觉每次环境配置问题消耗的时间有些多,导致真正学习实现代码时,感觉有些缺少动力了,所以效率就低了下来。
不得不说,本周的密码学内容有些难度,看完之后总体感觉有点懵,这是一块很有技术含量的内容,实践理解在先。其次,我觉得对于IDEA中的重构,我的掌握程度不够,重构的目的是消除有臭味道的代码。这个概念非常宽泛,不仅包括代码重复,还有方法过长、参数列过长、条件逻辑过度复杂、分支语句等等方面。这其中的每一点都应该纳入以后编程时的考虑内容。
希望自己可以及时调整状态,找回之前的一些学习动力。
PSP(Personal Software Process)时间统计:
步骤 耗时 百分比 需求分析 40min 16% 设计 40min 16% 代码实现 80min 32% 测试 60min 24% 分析总结 30min 12%