2017-2018-2 20165315 实验三《敏捷开发与XP实践》实验报告

一、编码标准

编写代码一个重要的认识是“程序大多时候是给人看的”,编程标准使代码更容易阅读和理解,甚至可以保证其中的错误更少。编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。
编码标准中的版式就是一个很好的例子,版式虽然不会影响程序的功能,但会影响可读性。程序的版式追求清晰、美观,是程序风格的重要因素。

--娄老师《敏捷开发与XP实践

  • 规定的规范缩进:

我们常见的是这样的代码:

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中利用插件可以轻松解决:

  • 打开 Settings ->Plugins -> Browse repositories...
  • 在搜索框输入alibaba即可看到Alibaba Java Code Guidelines插件,点击Install进行安装,然后重启IDE生效:

  • 在项目名称上单击右键,在弹出菜单上选择编码规约扫描即可扫描出不规范代码:

代码标准中很重要的一项是如何给包、类、变量、方法等标识符命名,能很好的命名可以让自己的代码立马上升一个档次。Java中的一般的命名规则有:

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

任务一:在IDEA中使用工具(Code->Reformate Code)格式化代码,并学习Code菜单的功能

  • 打开工具栏中的Code选项,选择Reformate Code功能,即可格式化代码

  • 通过学习Code菜单,现将基本功能总结如下:
    • Override Methods(Ctrl+O):重载基本类的方法;
    • Implement Methods(Ctrl+I):完成当前类接口或者抽象基本类的接口的方法;
    • Generate(Alt+Insert):创建类里面任何字段的 getter 与 setter 方法;
    • Surround With(Ctrl+Alt+T):使用if-elsetry-catchdo-while等包装代码段;
    • Insert Live Template(Ctrl+J):执行一些记不起来的 Live Template 缩写;
    • Comment with Line Comment(Ctrl+斜杠):注释(或反注释)当前行或者选择地代码块;
    • Comment with Block Comment(Ctrl+Shift+斜杠):用块注释标记(“ /* */”)把所选块包围起来
    • Reformat Code(Ctrl+Alt+L):将代码按标准格式缩进;
    • Move Statement Up/Down:向上/向下移动代码语句;
    • Move Line Up/Down:向上/向下移动光标所在行
    • ...

二、敏捷开发与XP

结对编程是XP中的重要实践。在结对编程模式下,一对程序员肩并肩、平等地、互补地进行开发工作。他们并排坐在一台电脑前,面对同一个显示器,使用同一个键盘、同一个鼠标一起工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起做单元测试,一起做集成测试,一起写文档等。
结对编程中有两个角色:

  • 驾驶员(Driver)是控制键盘输入的人。
  • 领航员(Navigator)起到领航、提醒的作用。

如何结对编程,为何要结对编程,大家参考一下结对编程和两人合作 ,重点是:

  • 驾驶员:写设计文档,进行编码和单元测试等XP开发流程;
  • 领航员:审阅驾驶员的文档、驾驶员对编码等开发流程的执行;考虑单元测试的覆盖率;思考是否需要和如何重构;帮助驾驶员解决具体的技术问题;
  • 驾驶员和领航员不断轮换角色,不要连续工作超过一小时,每工作一小时休息15分钟。领航员要控制时间;
  • 主动参与。任何一个任务都首先是两个人的责任,也是所有人的责任。没有“我的代码”、“你的代码”或“他/她的代码”,只有“我们的代码”;
  • 只有水平上的差距,没有级别上的差异。两人结对,尽管可能大家的级别资历不同,但不管在分析、设计或编码上,双方都拥有平等的决策权利。

--娄老师《敏捷开发与XP实践

任务二:在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后,下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例

  • 登录码云后,进入自己的项目,点击管理,进入后选择项目成员管理,将搭档加入自己的项目

  • 找到搭档的Complex代码如下:

  • 在IDEA的Git选项选择连接搭档的代码,下载后对照Complex代码写出不少于三个Junit测试类

  • 需要测试的类有:getRealPart()getImagePart()Add()Sub()Multi()Div(),将测试代码上传到搭档码云上

三、重构

重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。

--娄老师《敏捷开发与XP实践

重构中一个非常关键的前提就是“不改变软件外部行为”,它保证了我们在重构原有系统的同时,不会为原系统带来新的BUG,以确保重构的安全。

我们要修改软件,万变不离其宗,无非就是四种动机:

  • 增加新功能;
  • 原有功能有BUG;
  • 改善原有程序的结构;
  • 优化原有系统的性能 。

需要重构的代码有哪些呢?

IDEA提供的重构功能在Refactor选项中:

一个完整的重构流程包括:

  • 从版本控制系统代码库中Check out code
  • 读懂代码(包括测试代码)
  • 发现bad smell
  • Refactoring
  • 运行所有的Unit Tests
  • 往代码库中Check in code

任务三:下载搭档的代码,至少进行三项重构

  • 选择搭档的Rational代码
  • 找出此代码中存在的四个问题
    • 变量名不符合命名规则
    • 类名不符合命名规则
    • 类中的变量都是友好变量,改成私有变量更好
    • 定义了多余的变量
  • 根据上述问题,对搭档代码进行重构

四、Java密码学

Java安全体系结构总共分为4个部分:

  • JCA( Java Cryptography Architecture, Java加密体系结构):JCA提供基本的加密框架, 如证书、 数字签名、消息摘要和密钥对产生器;
  • JCE( Java Cryptography Extension, Java加密扩展包):JCE在JCA的基础上作了扩展, 提供了各种加密算法、 消息摘要算法和密钥管理等功能,JCE的实现主要在javax.crypto包( 及其子包) 中;
  • JSSE( Java Secure Sockets Extension, Java安全套接字扩展包):JSSE提供了基于SSL( Secure Sockets Layer,安全套接字层) 的加密功能。 在网络的传输过程中, 信息会经过多个主机(很有可能其中一台就被窃听) , 最终传送给接收者, 这是不安全的。这种确保网络通信安全的服务就是由JSSE来提供的;
  • JAAS( Java Authentication and Authentication Service, Java鉴别与安全服务):JAAS提供了在Java平台上进行用户身份鉴别的功能。

Java密码学算法:

  • 体验加解密--凯撒密码
  • Java对称加密--DES算法
  • Java非对称加密--RSA算法
  • 使用密钥协定创建共享密钥
  • Java摘要算法- MD5
  • Java混合密码系统

任务四:以结对的方式完成Java密码学相关内容的学习,结合重构,git,代码标准

和搭档对各种算法进行学习研究后,我们选择了MD5算法:

使用Java计算指定字符串的消息摘要,java.security包中的MessageDigest类提供了计算消息摘要的方法

  • 首先生成对象,执行其update()方法可以将原始数据传递给该对象,然后执行其digest( )方法即可得到消息摘要。具体步骤如下:

    • 生成MessageDigest对象:MessageDigest m=MessageDigest.getInstance("MD5");
    • 传入需要计算的字符串:m.update(x.getBytes("UTF8" ));
    • 计算消息摘要:byte s[ ]=m.digest( );
    • 处理计算结果(必要的话可以使用如下代码将计算结果s转换为字符串)
    String result="";
    for (int i=0; i<s.length; i++){
       result+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6);
    }
    
  • 编写代码如下:

  • 对源代码进行格式化与重构

产品代码:

import java.io.UnsupportedEncodingException;
import java.security.*;

public class MD5Encrypt {
    public static void main(String args[]) throws Exception {
        String originalStr = args[0];
        MessageDigest m = null;
        try {
            m = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        try {
            m.update(originalStr.getBytes("UTF8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        byte byteStr[] = m.digest();
        GetResult getResult = new GetResult();
        for (int i = 0; i < byteStr.length; i++) {
            getResult.result += Integer.toHexString((0x000000ff & byteStr[i]) |
                    0xffffff00).substring(6);
        }
    }

    public static class GetResult {
        String result = "";
    }
}
  • 编写测试类代码
/*测试输入输出*/
String str = new String(originalStr);
System.out.println("明文:" + str);
System.out.println("密文:" + getResult.result);

实验过程中遇到的问题及解决

  • 最开始不知道如何将搭档加入自己的项目,以为是建立一个项目,项目成员只有我和搭档两个人:

解决过程:
经过询问同学,知道了应该在自己项目的管理中邀请搭档成为该项目成员的开发者:

  • 在对搭档的代码进行重构时,花了一番心思,因为搭档对代码的编写非常细致,很少有需要重构的地方

解决过程:
经过对重构的仔细学习和对搭档代码的认真检查,还是找到了几处需要重构的地方:

实验体会与总结

我通过本次实验学会了如何规范、格式化代码,如何将搭档加入自己的码云项目并进行合作编写代码,如何重构以及Java密码学相关知识。

在自己上手实践操作过程中,加深了对平时不清楚的知识点的理解,也掌握了重构等新知识点。这次实验是第一次真正意义上的“结对编程”,让我深刻体会到了“众人拾柴火焰高”这句真理,实时观测搭档的代码使得编程效率大大提高。

PSP(Personal Software Process)时间

步骤 耗时 百分比
步骤 耗时 百分比
需求分析 30min 19%
设计 30min 19%
代码实现 60min 38%
测试 10min 6%
分析总结 30min 18%

码云链接

posted on 2018-05-03 19:19  yh666  阅读(276)  评论(2编辑  收藏  举报