实 验 报 告
课程:移动平台应用开发实践 班级:201592 姓名:王鹤 学号:20159202
成绩: 指导教师:娄嘉鹏 实验日期:2015.10.18
实验密级: 预习程度: 实验时间:
仪器组次: 必修/选修:选修 实验序号:3
实验名称:敏捷开发与XP实践
实验目的与要求:
1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导。
3. 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
实验仪器:
名称 |
型号 |
数量 |
PC |
|
1 |
虚拟机 |
实验楼 |
1 |
一、实验内容:
1. XP基础
2. XP核心实践
3. 相关工具
二、实验步骤:
(一)敏捷开发与XP
软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护。 人们在开发、运营、维护软件的过程中有很多技术、做法、习惯和思想体系。软件工程把这些相关的技术和过程统一到一个体系中,叫“软件开发流程”。软件开发流程的目的是为了提高软件开发、运营、维护的效率,并提高软件的质量、用户满意度、可靠性和软件的可维护性。 光有各种流程的思想是不够的,我们还要有一系列的工具来保证这些思想能够在实践中有效率地运作。软件开发很重要的一点不是看你能对多少理论讲的头头是道,还要看你对相关工具应用的如何,比如Java中单元测试要和JUnit的应用结合起来,建模要和Umbrello或StarUML的应用结合起来。编程学习是 一个常见的公式是:软件工程=开发流程+工具。常见的开发流程有:
- RUP(Rational Unified Process)
- PSP(Personal Software Process )
- TSP(Team Software Process )
- Agile Process
- ……
XP软件开发的基石是XP的活动,包括:编码、测试、倾听、设计。
(二)编码标准
编程最基本的标准是使代码更容易阅读和理解,甚至可以保证其中的错误更少。编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。
程序没有最基本的缩进,让人读起来很费劲,这个问题在Eclipse中比较容易解决,在这里我随意打开一个代码,单击Eclipse菜单中的source
->Format
或用快捷键Ctrl+Shift+F
就可以按Eclipse规定的规范缩进,效果如下:
代码标准中很重要的一项是如何给包、类、变量、方法等标识符命名,能很好的命名可以让自己的代码立马上升一个档次。Java中的一般的命名规则有:
- 要体现各自的含义
- 包、类、变量用名词
- 方法名用动宾
- 包名全部小写,如:io,awt
- 类名第一个字母要大写,如:HelloWorldApp
- 变量名第一个字母要小写,如:userName
- 方法名第一个字母要小写:setName
(三)结对编程
结对编程是XP中的重要实践。在结对编程模式下,一对程序员肩并肩、平等地、互补地进行开发工作。他们并排坐在一台电脑前,面对同一个显示器,使用同一个键盘、同一个鼠标一起工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起做单元测试,一起做集成测试,一起写文档等。
(四)版本控制
不论是对于团队还是个体,版本控制都提供了很多好处。
- 版本控制提供项目级的undo(撤销)功能:没有什么事情是终结版本, 任何错误必须很容易回滚。 假设你在使用世界上最复杂的文字处理系统。 它具备了所有的能想到的功能,就是没有支持 DELETE(删除) 键。想象你打字的时候得多么的谨慎和缓慢吧,特别是一篇超大的文档的快临近末尾的时候, 一个不小心就要重头再来(试想你选中所有的文字, 不小心按了 DELETE 键, 因为没有撤销功能,只好重新录入)。编辑文字和版本控制相同,任何时候都需要回滚,无论是一个小时, 一天, 还是一周, 这让你的团队工作自由快速的工作, 而且对于修正错误也非常自信。
- 版本控制允许多人在同一代码上工作,只要遵守一定的控制原则就行。 再也不会发生诸如一个人覆盖了另一个人编辑的代码,导致那个人的修改无效这样的情况。
- 版本控制系统保存了过去所作的修改的历史记录。如果你遭遇到一些惊讶的代码,通过版本控制系统可以很容易找出是谁干的, 修改了什么, 修改的时间, 如果幸运的话,还能找出原因。
- 版本控制系统还支持在主线上开发的同时发布多个软件版本。在软件发布的时候也不需要整个团队的停止工作,不需要冻结代码。
- 版本控制也是项目级的时间机器,你可以选择任何一个时间, 精确地查看项目在当时的情况。 这对研究非常有用, 也是重现以前某个有问题的发布版本的基础。
使用方法如下:
3. 进入到实验环境中修改代码,完成后需要依次执行下述命令即可提交:我们可以先用git status
查看一下代码状态,显示有未跟踪的代码,并建议用git add <file>...
添加,我们使用git add HelloWorld.*
把要提交的文件的信息添加到索引库中。当我们使用git commit
时,git将依据索引库中的内容来进行文件的提交。这只是在本地操作,关闭实验环境,会删除代码的,如果想把代码保存到远程托管服务器中,需要使用git push
,实验完成前,使用git push保存。
开通我的代码库功能,进入页面完善信息,设置专属用户名:20159202,则我的代码库链接为 http://git.shiyanlou.com/20159202wh。
(五)重构
重构的第一项功能就是Rename
,可以给类、包、方法、变量改名字。 例如这有个ABC
类:这个类,类名,方法名和方法的参数名都有问题,没有注释的话是无法理解代码的。我们可以使用Eclipse中的重构功能来改名。
原始代码与修改后的代码对比:
将类名修改为更具有可读性的MyMath1,方法是选择Eclipse中菜单中的Refactor
->Rename...
:
进行合理封装,定义一个类Student,
如下图:
上个代码犯的毛病是不会封装,该用类的地方都用了结构体,可用
Eclipse中菜单中的Refactor
->Encapsulate Field进行封装,
,如下图:
造成代码重复,正常的重构可以使用Eclipse中的Extract Method...
,重构的方法是用java中提供给每个类中的专门的toString方法,我们使用Eclipse中Source
->Generate toString():
给Student
类产生一个toString
方法,相应代码:
这样重构后有什么好处?重构有什么问题吗?
我们要修改软件,万变不离其宗,无非就是四种动机:
- 增加新功能;
- 原有功能有BUG;
- 改善原有程序的结构;
- 优化原有系统的性能 。
(六)实践项目
1. 以结对编程的方式编写一个软件,Blog中要给出结对同学的Blog网址。
【游戏】贪吃蛇
设计结构图:
通过分析该程序基本需要以下几个类:Snake(蛇)、Egg(食物)、Yard(窗口)、Dir(方向)
部分代码:
运行结果:
2.记录TDD和重构的过程,测试代码不要少于业务代码,Eclipse中refactor
菜单下的重构技能不要少于5个
3.团队代码要使用git在实验楼中托管,要使用结对同学中的一个同学的账号托管。
4. 程序要有GUI界面,参考用户界面和用户体验
5.程序功能从豌豆荚游戏中选择一款用Java实现。
6.实验报告中统计自己的PSP(Personal Software Process)时间
步骤 | 耗时 | 百分比 |
需求分析 | 1h | 16.7% |
设计 | 1h | 16.7% |
代码实现 | 2.5h | 41.7% |
测试 | 1h | 16.7% |
分析总结 | 0.5h | 8.3% |
(七)实验中的感悟:
这次试验比较复杂,首先是大量学科知识的学习,包括:1.敏捷开发与xp的具体知识2.编码标准的学习3.结对编程的具体过程4.版本控制5.重构6.实践项目。实验步骤也比较复杂。
我在这次实验中感觉到最困难的就是在最后一个团队实践的步骤感觉很困难。主要是因为我们整个团队之前并没有开发java游戏的经验,第一次开始这样的实验,遇到了很多困难。首先是在构思上,我们小组确定了连连看的实践方案后还是遇到了不少问题,后来借鉴了一部分网上的代码,我们自己再修改了相应部分的代码,完成了实验。
其次是在这次的java实践中学到了关于重构的很多知识。
一个完整的重构流程包括:从版本控制系统代码库中Check out code;读懂代码(包括测试代码);发现bad smell;Refactoring;运行所有的Unit Tests;往代码库中Check in code。
实验中的问题及解决
对Eclipse中refactor的Encapsulate Filed功能的使用,开始选中这个功能总是提示错误:
后查看实验资料发现,其可操作的Java对象是对成员变量可用,所以需要选中成员变量,再次选中此选项即可进行重构。