实验三 敏捷开发与XP实践
实验内容
XP基础
XP核心实践
相关工具
实验步骤
(一)敏捷开发与XP
软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护。
敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。“敏捷流程”是一系列价值观和方法论的集合。敏捷开发包括很多模式:
其中,极限编程(eXtreme Programming,XP)是是一种全新而快捷的软件开发方法。XP团队使用现场客户、特殊计划方法和持续测试来提供快速的反馈和全面的交流。
XP是以开发符合客户需要的软件为目标而产生的一种方法论;XP是一种以实践为基础的软件工程过程和思想;XP认为代码质量的重要程度超出人们一般所认为的程度;XP特别适合于小型的有责任心的、自觉自励的团队开发需求不确定或者迅速变化的软件。
一项实践在XP环境中成功使用的依据通过XP的法则呈现,包括:快速反馈、假设简单性、递增更改、提倡更改、优质工作。XP软件开发的基石是XP的活动,包括:编码、测试、倾听、设计。
(二)编码标准
编程标准使代码更容易阅读和理解,甚至可以保证其中的错误更少。编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。程序的版式追求清晰、美观,是程序风格的重要因素。
程序没有最基本的缩进,让人读起来很费劲,这个问题在Eclipse中比较容易解决,我们单击Eclipse菜单中的source->Format 或用快捷键Ctrl+Shift+F就可以按Eclipse规定的规范缩进。代码标准中很重要的一项是如何给包、类、变量、方法等标识符命名,能很好的命名可以让自己的代码立马上升一个档次。Java中的一般的命名规则有:
- 要体现各自的含义
- 包、类、变量用名词
- 方法名用动宾
- 包名全部小写,如:io,awt
- 类名第一个字母要大写,如:HelloWorldApp
- 变量名第一个字母要小写,如:userName
- 方法名第一个字母要小写:setName
- ...
标识符名字应当直观且可以拼读,可望文知意,不必进行“解码”,一般采用英文单词或其组合,便于记忆和阅读。
代码标准:
(三)结对编程
结对编程是XP中的重要实践。在结对编程模式下,一对程序员肩并肩、平等地、互补地进行开发工作。
结对编程中有两个角色:
驾驶员(Driver)是控制键盘输入的人。写设计文档,进行编码和单元测试等XP开发流程。
领航员(Navigator)起到领航、提醒的作用。审阅驾驶员的文档、驾驶员对编码等开发流程的执行;考虑单元测试的覆盖率;思考是否需要和如何重构;帮助驾驶员解决具体的技术问题。
驾驶员和领航员不断轮换角色,不要连续工作超过一小时。领航员要控制时间。任何一个任务都首先是两个人的责任,也是所有人的责任。两人结对,尽管可能大家的级别资历不同,但不管在分析、设计或编码上,双方都拥有平等的决策权利。
(四)版本控制
XP的集体所有制意味着每个人都对所有的代码负责;这一点,反过来又意味着每个人都可以更改代码的任意部分。
版本控制(Version Control)的好处:
版本控制提供项目级的 undo(撤销) 功能。
版本控制允许多人在同一代码上工作, 只要遵守一定的控制原则就行。
版本控制系统还支持在主线上开发的同时发布多个软件版本。
版本控制也是项目级的时间机器,你可以选择任何一个时间, 精确地查看项目在当时的情况。
流行的版本控制工具有CVS,SVN,Git等,Git是Linus除了Linux操作系统外的另外一个重要发明。
git命令上传代码:
$ cd /home/shiyanlou/Code/shiyanlou_cs212
# 修改代码文件
# 添加修改文件
$ git add 所有修改的文件
# 提交到环境中本地代码仓库
$ git commit -m '本次修改的描述'
# push到git.shiyanlou.com,无需输入密码
$ git push
下面给出一个HelloWorld的例子:
1.首先进入工作目录,创建一个新的项目,编译运行通过后上传新建代码。值得注意的是,往代码库提交的代码一定编译、运行、测试都没有问题的代码。
2.我们可以先用git status查看一下代码状态,显示有未跟踪的代码,并建议用git add ...添加,我们使用git add HelloWorld.* 把要提交的文件的信息添加到索引库中。当我们使用git commit时,git将依据索引库中的内容来进行文件的提交。这只是在本地操作,关闭实验环境,会删除代码的,如果想把代码保存到远程托管服务器中,需要使用git push,实验完成前,一定不要忘了使用git push,否则就是相当于你在Word中编辑了半天文件最后却没有保存。如下图所示:
注意:HelloWorld.class是不应该保存在代码库中的,我们只要有HelloWorld.java就行。
运行过程如下图所示:
在码云上的运行结果如下所示:
(五)重构
重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。重构中一个非常关键的前提就是“不改变软件外部行为”,它保证了我们在重构原有系统的同时,不会为原系统带来新的BUG,以确保重构的安全。
下面以Eclipse这个IDE的重构为例:
1.重构的第一项功能就是Rename,可以给类、包、方法、变量改名字。修改方法是,用鼠标单击要改的名字,选择Eclipse中菜单中的Refactor->Rename,具体如下所示:
2.重构的下一项功能为封装,例如有个学生类,有姓名、年龄和编号三个属性,下面要对姓名属性进行封装,进行Refactor->Encapsulate Field操作。该操作修改了属性的修饰符,增加了属性的get和set方法,并修改了调用方法,具体如下所示:
另外,每次打印学生信息都这么写代码违反了DRY原则,造成代码重复。方法一可以可以使用Eclipse中的Extract Method来创建一个toString()方法,另一个是使用Eclipse中Source->Generate toString()来产生一个toString()方法用于打印,结果如下所示:
一个完整的重构流程包括:
- 从版本控制系统代码库中Check out code
- 读懂代码(包括测试代码)
- 发现bad smell
- Refactoring
- 运行所有的Unit Tests
- 往代码库中Check in code
(六)实践项目
1.结对伙伴:http://www.cnblogs.com/lxy1997/p/6820928.html
2.任务很简单,两人用git来下载已完成项目代码,并下载到本地,修改完成后通过git上传到服务器中,这些在上面的内容中已经展示完成。
本次实验的 PSP(Personal Software Process) 时间:
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 40min | 18.2% |
设 计 | 50min | 22.7% |
代码实现 | 60min | 27.3% |
测 试 | 30min | 13.6% |
分析总结 | 40min | 18.2% |