20145219 《Java程序设计》实验三 敏捷开发与XP实践
实验内容
- XP基础
- XP核心实践
- 相关工具
实验步骤
-
敏捷开发与XP
1.敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。“敏捷流程”是一系列价值观和方法论的集合。
2.
软件工程=开发流程+工具
3.常见的开发流程有:
·RUP(Rational Unified Process) ·PSP(Personal Software Process ) ·TSP(Team Software Process ) ·Agile Process ……
4.极限编程(eXtreme Programming,XP)是一种全新而快捷的软件开发方法:
·XP是以开发符合客户需要的软件为目标而产生的一种方法论 ·XP是一种以实践为基础的软件工程过程和思想 ·XP认为代码质量的重要程度超出人们一般所认为的程度 ·XP特别适合于小型的有责任心的、自觉自励的团队开发需求不确定或者迅速变化的软件
5.XP准则:
·沟通 :XP认为项目成员之间的沟通是项目成功的关键,并把沟通看作项目中间协调与合作的主要推动因素。 ·简单 :XP假定未来不能可靠地预测,在现在考虑它从经济上是不明智的,所以不应该过多考虑未来的问题而是应该集中力量解决燃眉之急。 ·反馈 :XP认为系统本身及其代码是报告系统开发进度和状态的可靠依据。系统开发状态的反馈可以作为一种确定系统开发进度和决定系统下一步开发方向的手段。 ·勇气:代表了XP认为人是软件开发中最重要的一个方面的观点。在一个软件产品的开发中人的参与贯穿其整个生命周期,是人的勇气来排除困境,让团队把局部的最优抛之脑后,达到更重大的目标。表明了XP对“人让项目取得成功”的基本信任态度。
实践在XP环境中成功使用的依据通过XP的法则呈现,包括:快速反馈、假设简单性、递增更改、提倡更改、优质工作。
6.XP软件开发的基石是XP的活动,包括:编码、测试、倾听、设计。
7.我们关注的XP实践:编码标准,结对编程,代码集体所有,测试,重构等。
-
编码标准
1.编程标准使代码更容易阅读和理解,保证其中的错误更少。
2.编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。
3.在记事本中编写java程序时,程序没有最基本的缩进,看起来很不方便:
使用IDEA时,将原本没有缩进的代码直接粘贴至其编写代码的区域就会自动缩进,方便快捷、可读性强:
然后,再根据代码逻辑加入一些空行(例如,遇见for语句、if语句、print语句等),让程序更有逻辑性:
4.Java中的一般的命名规则:
·要体现各自的含义 ·包、类、变量用名词 ·方法名用动宾 ·包名全部小写,如:io,awt ·类名第一个字母要大写,如:HelloWorldApp ·变量名第一个字母要小写,如:userName ·方法名第一个字母要小写:setName ...
5.标识符名字应当望文知意,一般采用英文单词或其组合。标识符的长度“min-length && max-information”的原则,可以通过去元音法把变量名变短;全局变量用具有说明性的名字,局部变量用短名字:单字符的名字,常见的如i,j,k等用作局部变量。
-
结对编程
1.结对编程中有两个角色:
·驾驶员:写设计文档,进行编码和单元测试等XP开发流程。 ·领航员:审阅驾驶员的文档、驾驶员对编码等开发流程的执行;考虑单元测试的覆盖率;思考是否需要和如何重构;帮助驾驶员解决具体的技术问题。 ·驾驶员和领航员不断轮换角色,不要连续工作超过一小时,每工作一小时休息15分钟。领航员要控制时间。 ·主动参与。任何一个任务都首先是两个人的责任,也是所有人的责任。没有“我的代码”、“你的代码”或“他/她的代码”,只有“我们的代码”。 ·只有水平上的差距,没有级别上的差异。两人结对,尽管可能大家的级别资历不同,但不管在分析、设计或编码上,双方都拥有平等的决策权利。
-
版本控制
1.XP的集体所有制意味着每个人都对所有的代码负责;这一点,反过来又意味着每个人都可以更改代码的任意部分。集体所有制的一个主要优势是提升了开发程序的速度,因为一旦代码中出现错误,任何程序员都能修正它。这意味着代码要放到一个大家都能方便获取的地方,我们叫代码仓库。
2.版本控制提供项目级的 undo(撤销)功能:没有什么事情是终结版本, 任何错误必须很容易回滚。
3.版本控制允许多人在同一代码上工作,只要遵守一定的控制原则就行。不会发生诸如一个人覆盖了另一个人编辑的代码,导致那个人的修改无效这样的情况。
4.版本控制系统保存了过去所作的修改的历史记录。如果你遭遇到一些惊讶的代码,通过版本控制系统可以很容易找出是谁干的,修改了什么,修改的时间,还能找出原因。
5.版本控制系统还支持在主线上开发的同时发布多个软件版本。在软件发布的时候也不需要整个团队的停止工作,不需要冻结代码。
6.git上传基本步骤:
·修改代码文件 ·添加修改文件 ·git add 所有修改的文件 ·提交到环境中本地代码仓库 ·git commit -m '本次修改的描述' ·push到你的项目中 ·git push
使用git克隆其他用户代码仓库只需要知道对方的仓库链接。
7.例如:
(1)安装好Git后测试是否安装正确。打开cmd,在安装目录下输入
git
。
(2)向Git@OSC提交代码时,需要用户名和邮箱信息,需要使用如下命令进行配置:
git config --global user.name "用户名"
git config --global user.email "xxxxxxxx@xxxx.com"
这些配置都会存放在用户所在目录下的.gitconfig文件中。
(3)切换到要上传文件有src这一层的目录下,在空白处右击选择`Git Bash Here`,这是就会弹出Git命令行,并且自动切换到当前所在目录。
(4)输入`git init`在该目录下生成一个.git的隐藏目录,表明该目录归git进行管理了。
(5)输入`git add .`把该目录下的所有文件全部提交到缓冲区。
(6)输入`git commit -m "文件描述 commit"`命令,将代码提交到HEAD。
(7)输入`ssh-keygen -t rsa -C "xxxxxxx@xxxx.com"`然后一路回车,会在当前用户文件夹下生成.ssh 文件夹,里边有个 id_rsa.pub文件(我的在C盘用户目录下),用记事本打开,复制其中的全部内容。
(8)打开http://git.oschina.net/keys页面,在该页面中添加公钥。
(9)在http://git.oschina.net/projects/new中添加一个新项目。
(10)测试联通性:输入命令`ssh -T git@git.oschina.net`。
(11)连接成功后,将交项目到git仓库中了,输入`git remote add origin http://git.oschina.net/用户名/项目名.git`
(12)然后输入`git push origin master`将文件提交到服务器上。
注意:往代码库提交的代码一定编译、运行、测试都没有问题的代码!
-
重构
1.重构(Refactor)就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更。
2.IDEA菜单中有个
refactor
菜单,可以帮助我们进行代码重构。·功能1:Rename,可以给类、包、方法、变量改名字,使代码在没有注释的情况下也可以被了解基本信息。修改方法是选择IDEA中菜单中的
Refactor->Rename
。
·功能2:封装。修改方法是选择菜单中的
Refactor->Refactor this->Encapsulate Field...
每次打印学生信息都这么写代码违反了DRY原则,造成代码重复,正常的重构可以使用IDEA中的`Extract->Method...`
由于Java中所有的类都有个专门的toString方法,还可以使用IDEA中`Code->Generate->toString()...` 给Student类产生一个toString方法。
3.修改软件的四种动机:
·增加新功能;
·原有功能有BUG;
·改善原有程序的结构;
·优化原有系统的性能 。
4.Bad Smell与相应的重构手法:
5.Refactor菜单中的重构手法的应用时机:
6.一个完整的重构流程:
·从版本控制系统代码库中Check out code
·读懂代码(包括测试代码)
·发现bad smell
·Refactoring
·运行所有的Unit Tests
·往代码库中Check in code
-
实践项目
-
-
以结对编程的方式修改一个代码,Blog中要给出结对同学的Blog网址,可以拍照展现结对编程情况,可以参考一下其他学校的作业。
-
记录TDD和重构的过程,refactor菜单下的重构技能不要少于5个。
-
团队代码要使用git在实验楼中托管,要使用结对同学中的一个同学的账号托管。
-
实验报告中统计自己的PSP(Personal Software Process)时间。
步骤:
1.建立小组;
2.下载同组成员代码;
3.下载代码的命名格式不正确,重新命名并上传代码;
4.下载代码违反了DRY原则,造成代码重复,使用
Refactor->Extract->Method...
改进并上传代码;
-
5.下载代码,使用`Refactor->Refactor this->Variable`改进并上传代码;
实验中的问题和解决过程
- 问题:练习重构时,使用IDEA给Student类产生一个toString方法的结果与老师的实验步骤的结果并不一样,虽然产生了一个toString()方法,但是最后的System.out.println()那一句还是原来样子,并没有改变成
System.out.println(s.toString());
。 - 解决:我不太清楚IDEA中转换的原理到底是什么,最后我手动改变了这一句。
PSP(Personal Software Process)时间
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 40min | 16.70% |
设计 | 80min | 33.35% |
代码实现 | 80min | 33.35% |
测试 | 20min | 8.30% |
分析总结 | 20min | 8.30% |