zoukankan      html  css  js  c++  java
  • 2017-2018-2 20165315 实验三《敏捷开发与XP实践》实验报告

    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%

    码云链接

  • 相关阅读:
    MOSS 搜索服务,内容源无法停止的错误
    在服务器场中安装moss sp1
    基于CodeSmith代码生成之数据访问层
    IMVSynchronization接口说明
    [Best Practice]WSPBuilder和QuickPart合作进行Web Partk可视化开发与部署的好方法
    vs2008快捷键生成
    转帖:vs2008使用jquery智能提示
    [Best Practice]如何在SharePoint团队开发中利用WSPBuilder
    规划备用访问映射 (Windows SharePoint Services)
    转帖:[Best Practice]如何在SharePoint团队开发中利用WSPBuilder
  • 原文地址:https://www.cnblogs.com/yh666/p/8987049.html
Copyright © 2011-2022 走看看