实验三 敏捷开发与XP实践

实验内容

  • XP基础
  • XP核心实践
  • 学会使用git
  • 学会代码的重构
  • 实现团队合作

团队分工

20155239:按照老师的实验三教程,逐步实验,编写代码,并用git上传,下载团队成员代码,改变并重新上传,总结撰写实验报告。

20155202:按照老师的实验三教程,逐步实验,编写代码,并用git上传,下载团队成员代码,改变并重新上传。

知识学习

(一)敏捷开发与XP

  • 软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护。
  • 人们在开发、运营、维护软件的过程中有很多技术、做法、习惯和思想体系。软件工程把这些相关的技术和过程统一到一个体系中,叫“软件开发流程”。软件开发流程的目的是为了提高软件开发、运营、维护的效率,并提高软件的质量、用户满意度、可靠性和软件的可维护性。
  • 光有各种流程的思想是不够的,我们还要有一系列的工具来保证这些思想能够在实践中有效率地运作。软件开发很重要的一点不是看你能对多少理论讲的头头是道,还要看你对相关工具应用的如何,比如Java中单元测试要和JUnit的应用结合起来,建模要和Umbrello或StarUML的应用结合起来。编程学习是一个习而学的过程。
  • 一个常见的公式是:软件工程=开发流程+工具
  • XP是一种更加灵活的开发方式和理念,通过迅速的反应及时充分修改程序,保证所有团队成员对资源和责任的共享;适用于“小而精”的团队开发。同时,其所倡导的“倾听”也是实现了程序开发“需求至上”的终极目标。

(二)编码标准

编程标准使代码更容易阅读和理解,甚至可以保证其中的错误更少。编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。程序的版式追求清晰、美观,是程序风格的重要因素。

代码标准中很重要的一项是如何给包、类、变量、方法等标识符命名,能很好的命名可以让自己的代码立马上升一个档次。标识符名字应当直观且可以拼读,可望文知意,不必进行“解码”,一般采用英文单词或其组合,便于记忆和阅读。

(三)结对编程

结对编程中的两个重要角色:驾驶员(Driver)是控制键盘输入的人,领航员(Navigator)起到领航、提醒的作用。

驾驶员:写设计文档,进行编码和单元测试等XP开发流程。领航员:审阅驾驶员的文档、驾驶员对编码等开发流程的执行;考虑单元测试的覆盖率;思考是否需要和如何重构;帮助驾驶员解决具体的技术问题。

驾驶员和领航员不断轮换角色,不要连续工作超过一小时,每工作一小时休息15分钟。领航员要控制时间。

(四)版本控制

版本控制提供项目级的 undo(撤销) 功能;

版本控制允许多人在同一代码上工作;

版本控制系统保存了过去所作的修改的历史记录;

git命令上传代码:

 $ cd /home/shiyanlou/Code/shiyanlou_cs212
# 修改代码文件
# 添加修改文件
$ git add 所有修改的文件
# 提交到环境中本地代码仓库
$ git commit -m '本次修改的描述'
# push到git.shiyanlou.com,无需输入密码
$ git push

(五)重构

重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。重构中一个非常关键的前提就是“不改变软件外部行为”,它保证了我们在重构原有系统的同时,不会为原系统带来新的BUG,以确保重构的安全。那么要如何保证不改变软件外部行为?这就要求重构后的代码要能通过单元测试。

当有臭味道(Bad Smell)的代码出现时,需要进行重构,例如代码重复、方法过长、参数列过长、条件逻辑过度复杂、分支语句等等,需要通过重构来优化代码。

实验过程

(一)git上传代码

敏捷开发中一个重要过程就是版本控制,可以通过git来进行下载、上传来控制开发中的不同版本,这在结对编程中尤为重要,若是团队中有人上传代码之后,团队其他人可以下载代码,修改完成后再上传,完成结对编程。

git实验过程:

下载最新代码(在实验楼中上线代码库之后,会自动执行git pull操作更新本地的代码)-->修改项目代码(例如可在项目中添加一个新的类实现新的功能)-->通过git上传修改完成后的项目

下面以HelloWord为例进行操作:

首先创建Helloword.java,编译通过确定无误后进行上传操作(注意:上传的代码需要保证其的正确性)。

通过git上传修改完成的项目,具体代码如下图所示。

(二)IDEA 代码标准化

在IDEA菜单项中有一个Code选项,可使用Code选项中的Reformate Code选项来格式化代码,使其符合标准。

(三)IDEA 重构

在IDEA的菜单项中有一个Refactor选项,里面包含了很多重构选项,如图:

也可直接在程序中右键,选中Refactor选项,里面有重构选项,如图:

1.重命名

可以根据命名标准来重命名不符合标准的变量、类名、方法名等。

其中Java中的一般的命名规则有:

  • 要体现各自的含义
  • 包、类、变量用名词
  • 方法名用动宾
  • 包名全部小写,如:io,awt
  • 类名第一个字母要大写,如:HelloWorldApp
  • 变量名第一个字母要小写,如:userName
  • 方法名第一个字母要小写:setName
  • ...

要给变量重命名时,首先选中要重命名的变量,右键选中Refactor选项中的Rename选项,界面变为:

输入要修改的变量名,根据变量名可知该变量指示名字,所以将"s"改为"name",具体如下:

2.封装

Java中一个重要的特性是封装,封装就是将方法和属性包围,只能通过定义好的接口来进行访问,做到信息隐藏。例如有一个教师类,有属性姓名、年龄和性别三个属性,以姓名属性为例进行封装,选中姓名属性,右键Refactor选项中的Encapsulate Field选项,该操作修改了属性的修饰符,添加get,set方法,具体如下:

3.提取方法

上述封装完成后的代码第21和22行代码违反了DRY原则操作,代码重复,若是需要打印,每次都需要写这么一大串代码,可以将这个提取为一个方法,选中代码,右键Refactor选项中的Encapsulate Method选项,具体为:

当然重构还有其他选项,例如Pull Members Up选项是将子类中的方法上提到父类,而Pull Members Down选项则是将父类的方法下推到子类中,具体就不举例了。

实验过程中遇到的问题和解决方法

1.在java程序编译过程中,之前也有遇到过,在cmd中输入“javac HelloWord”时提醒“错误:仅当显性请求注释处理时才接受类名称 “HelloWord””,原因是因为在javac下时必须要把程序的完整名称写下,包括后缀,所以写成“javac HelloWord.java”即可。这其实是一个很低级的错误,但是由于之前也犯过,所以记下提醒自己。

2.在git生成公钥和私钥后,输入"ssh -T git@git.oschina.net"后,老是提醒"git Permission denied (publickey)."错误,查找很多资料之后发现是没有将本地生成的公钥加入到码云上的公钥库中,所以访问失败。

总结

这次实验相对来说比较简单,更多的是基础工具的熟悉,例如git的使用方法和需要注意的地方,另外就是IDEA关于代码格式化和代码重构的深入了解,在和张旭同学的结对学习下,学会了很多,很满意这次实验。

PSP(Personal Software Process)时间

步骤 耗时 百分比

需求分析 15分钟 9%

设计 15分钟 9%

代码实现 110分钟 64

%

测试 10分钟 6%

分析总结 20分钟 12%

20155239 《Java程序设计》实验三(敏捷开发与XP实践)实验报告的更多相关文章

  1. 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...

  2. 20165230 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    20165230 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: 指导教 ...

  3. 20155207王雪纯 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    20155207王雪纯 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...

  4. 2016-2017-2 20155339 《Java面向对象程序设计》实验三敏捷开发与XP实践实验报告

    2016-2017-2 20155339 <Java面向对象程序设计>实验三敏捷开发与XP实践实验报告 实验内容 XP基础 XP核心实践 相关工具 实验内容 一.在IDEA中使用工具(Co ...

  5. 20162311 实验三 敏捷开发与XP实践 实验报告

    20162311 实验三 敏捷开发与XP实践 实验报告 实验内容 一.研究学习IDEA中的Code菜单 使用Code ->Reformate Code功能将以下代码格式化 public clas ...

  6. 20165308实验三 敏捷开发与XP实践实验报告

    实验三 敏捷开发与XP实践实验报告 实验目的 安装 alibaba 插件,解决代码中的规范问题.再研究一下Code菜单,找出一项让自己感觉最好用的功能. 在码云上把自己的学习搭档加入自己的项目中,确认 ...

  7. 20155220 实验三 敏捷开发与XP实践 实验报告

    20155220 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...

  8. # 20155224 实验三 敏捷开发与XP实践 实验报告

    20155224 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...

  9. 20155226 实验三 敏捷开发与XP实践 实验报告

    20155226 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...

  10. 20155311 实验三 敏捷开发与XP实践 实验报告

    20155311 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 xp核心工具 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...

随机推荐

  1. python取当前时间前后一定间隔的时间点

    当前时间 datetime.datetime.now() 时间间隔 datetime.timedelta(参数=数值) #参数:weeks,days,hours,minutes,seconds,mic ...

  2. Python文件基础操作(IO入门1)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6422270.html 本文出自:[Edwin博客园] Python文件基础操作(IO入门1) 1. pyth ...

  3. 1、Android-活动(上)

    1.1.活动是什么 活动(Activity)是最容易吸引用户的地方,他是一种可以包含用户界面的组件 主要用于和用户进行交互 一个用户可以包含零个或多个活动,不包含活动的程序少见 1.2.活动的基本用法 ...

  4. 5 个强大的 HTML5 API

    HTML5提供了一些非常强大的JavaScript和HTML API,来帮助开发者构建精彩的桌面和移动应用程序.本文将介绍5个新型的API,希望对你的开发工作有所帮助. 1.  全屏API(Fulls ...

  5. random模块 参生随机数

    记得要import random模块 随机整数: >>> import random >>> random.randint(0,99) 21 随机选取0到100间的 ...

  6. 基于LNMP的小米电子商务网站平台

    项目参考:http://www.cnblogs.com/along21/p/7822228.html 基于LNMP的小米电子商务网站平台 1.环境 setenforce 0 #关闭selinux sy ...

  7. vue每次请求加头部(shiro+vue)

    前后台分离,全局请求加头部 设置全局请求为ajax请求 _axios.interceptors.request.use( function(config) { var accessToken = lo ...

  8. String系列01 - String 60%

    1.String简介 String类实现CharSequence接口.(同时,实现Serializable, Comparable 接口). String类使用final修饰符,为final类,不可被 ...

  9. 串行通讯协议--起止式异步通讯协议(UART)

    起止式异步通讯协议: 特点与格式: 起止式异步协议的特点是一个字符一个字符传输,并且传送一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求.其格式如图3 所示.每一个字符的前面都有 ...

  10. Lua库-string库

    string.len(s) string.rep(s,n) string.lower(s) string.upper(s) string.sub(s,i);//截取s第i个开始的后缀 string.s ...