20162330 实验三 《敏捷开发与XP实践》 实验报告

时间:2021-12-03 17:10:32

2016-2017-2 实验报告目录:   1   2   3   4   5


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,通过学习这些实践,可以形成以测试为核心的开发流程。
    敏捷可以作为一种做事的方式,掌握好的在以后的工作中也会受益无穷。

(二)编码标准

  • 编写代码一个重要的认识是“程序大多时候是给人看的”,编程标准使代码更容易阅读和理解,甚至可以保证其中的错误更少。编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。

  • 编码标准中的版式反例:(该程序影响了可读性。程序的版式追求清晰、美观,是程序风格的重要因素。)
    20162330 实验三 《敏捷开发与XP实践》 实验报告

  • 代码标准中很重要的一项是如何给包、类、变量、方法等标识符命名,能很好的命名可以让自己的代码立马上升一个档次。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之后)
    20162330 实验三 《敏捷开发与XP实践》 实验报告

  • 在Code菜单中找出一项让自己感觉最好用的功能:
    我主要试用了Code中的Override Methods...功能,可以直接复写方法:
    20162330 实验三 《敏捷开发与XP实践》 实验报告
    其实还有一些其他的功能比较实用,比如可以给代码块增加条件循环语句的Surround with...功能,可以调整任何一行代码位置的Move Line Down Move Line Up功能,包括之前使用过的可以生成测试代码框架的Generate...功能等。
    20162330 实验三 《敏捷开发与XP实践》 实验报告

  • 2.在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后,下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例:
    20162330 实验三 《敏捷开发与XP实践》 实验报告
    20162330 实验三 《敏捷开发与XP实践》 实验报告
    【代码链接】

  • 3.完成重构内容的练习,下载搭档的代码,至少进行三项重构:
    (感觉在重构时考虑得太少,所以没有发现示例代码中需要改进的地方,只是尝试了一些基本功能)
    20162330 实验三 《敏捷开发与XP实践》 实验报告
    【代码链接】

  • 4.以结对的方式完成Java密码学相关内容的学习:
    (我选择在虚拟机上进行学习和测试,不懂的一些地方也已经向张旭升请教,感觉这方面内容并不熟练,理解至关重要)
    20162330 实验三 《敏捷开发与XP实践》 实验报告
    【代码链接】

【返回目录】

测试过程及遇到的问题:

  • 1.由于之前在IDEA删除了一些项目,我在IDEA中重新克隆项目时出现clone failed的问题:
    20162330 实验三 《敏捷开发与XP实践》 实验报告
    我打开克隆项目发现有但是不能运行:
    20162330 实验三 《敏捷开发与XP实践》 实验报告

  • 解决办法:通过搜索,我查找到正确的解决方法,这个错误是因为没有设置output的路径,在网上看到了两种方法:
    20162330 实验三 《敏捷开发与XP实践》 实验报告
    第一种方法:在Modules设置里勾选”Inherit project compile path” ,由于bin文件要设置绝对路径我就没有修改此路径,主要是用了第二种方法:设置Project中的”Project compiler output” 。
    20162330 实验三 《敏捷开发与XP实践》 实验报告
    设置好就可以正常运行了。
    20162330 实验三 《敏捷开发与XP实践》 实验报告

  • 2.在使用TDD进行单元测试时,不知道怎么添加Junit生成的方法框架中的测试代码,上一次实验是直接给出的期望测试代码,但是期望代码的格式框架我并没有掌握:
    20162330 实验三 《敏捷开发与XP实践》 实验报告
    20162330 实验三 《敏捷开发与XP实践》 实验报告

  • 解决办法:看了王彪上次的实验博客,掌握了基本Assert的框架,并询问了张旭升之后,可以写出基本的单元测试的代码:
    Assert的基本框架如下:

    import junit.framework.*;
    public class TestSimple extends TestCase{
    public TestSimple(String name){
    super(name);}
    public void testAdd(){
    assertEquals(2,1+1);}
    }

    首先要根据源代码找到测试类中应该被测试的方法,其次要使用assertEquals期望值的格式进行测试,这样的好处是:即使出现红条(实际值与期望值不符合)也会显示提示:
    20162330 实验三 《敏捷开发与XP实践》 实验报告
    之后只需弄清出错的原因并修改即可测试成功:
    20162330 实验三 《敏捷开发与XP实践》 实验报告

  • 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%

【返回目录】

参考资料:

【返回目录】