zoukankan      html  css  js  c++  java
  • 20155327实验三

    20155327 实验三 敏捷开发与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));
    }
    }
    这样的代码没有层次感,不符合 代码的规范。适时缩进,并根据逻辑加入一些空行,改成下面这种格式就清晰多了:

    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));
    }
    

    }
    Java中的一般的命名规则:

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

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

    几个比较常用的功能总结如下:

    Override Methods(Ctrl+O):重载基本类的方法;
    Implement Methods(Ctrl+I):完成当前类 implements 的(或者抽象基本类的)接口的方法;
    Generate(Alt+Insert):创建类里面任何字段的 getter 与 setter 方法;
    Surround With(Ctrl+Alt+T):使用if-else、try-catch、do-while等包装代码段;

    Insert Live Template(Ctrl-J):执行一些记不起来的 Live Template 缩写;

    Comment with Line Comment(Ctrl+斜杠)/Comment with Block Comment(Ctrl+Shift+斜杠):用 Ctrl+斜杠 与 Ctrl-Shift-/ 来注释(或反注释)代码行与代码块。 用Ctrl+斜杠单行注释标记(“ //… ”)来注释(或反注释)当前行或者选择地代码块。而 Ctrl+Shift+斜杠则可以用块注释标记(“ /* */”)把所选块包围起来。要反注释一个代码块就在块中任何一个地方按 Ctrl+Shift+斜杠 即可;
    Reformat Code(Ctrl+Alt+L):将代码按标准格式缩进;
    ...
    后面还有一些可以将光标所在行上移或下移的功能,如果能在实践中经常使用Code菜单的各个功能,可以大大提升编程效率。

    二、敏捷开发与XP

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

    任务二:下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例
    1.结对编程的角色
    (1)驾驶员(Driver)是控制键盘输入的人。
    (2)领航员(Navigator)起到领航、提醒的作用。
    2.如何更好地实现结对编程
    (1)驾驶员:写设计文档,进行编码和单元测试等XP开发流程。
    (2)领航员:审阅驾驶员的文档、驾驶员对编码等开发流程的执行;考虑单元测试的覆盖率;思考是否需要和如何重构;帮助驾驶员解决具体的技术问题。
    (3)驾驶员和领航员不断轮换角色,不要连续工作超过一小时,每工作一小时休息15分钟。领航员要控制时间。
    (4)主动参与。任何一个任务都首先是两个人的责任,也是所有人的责任。
    (5)只有水平上的差距,没有级别上的差异。

    需要测试的方法有:add()、minus()、multiply(),所以编写测试代码并上传到搭档码云项目上:

    三、重构

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

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

    增加新功能;
    原有功能有BUG;
    改善原有程序的结构;
    优化原有系统的性能 。
    IDEA主要提供了以下重构功能:

    那么,哪些地方需要重构呢?有臭味道(Bad Smell)的代码。这个概念非常宽泛,不仅包括代码重复,还有方法过长、参数列过长、条件逻辑过度复杂、分支语句等等方面。通过重构,我们可以实现代码的优化。

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

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

    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平台上进行用户身份鉴别的功能。
    进行了学习之后,我与搭档选择了实现MD5算法,以结对的方式完成了代码编写的工作。

    首先,我们一起学习了java.security包中的MessageDigest类,以及类中的方法,包括update()、digest()等。

    大致了解了MD5算法需要用到的方法框架后,我编写了伪代码:

    /**

    • 伪代码:

    • MD5算法:把一个任意长度的字节串变换成一定长的十六进制数字串

    • 具体步骤:(1)生成MessageDigest对象
      *(2)传入需要计算的字符串
      *(3)计算消息摘要
      *(4)处理计算结果
      */
      搭档参考伪代码,编写了产品代码:

      import java.security.MessageDigest;

      public class DigestPass{
      public static String md5Encode(String inStr) throws Exception {
      MessageDigest md5 = null;
      try {
      md5 = MessageDigest.getInstance("MD5");
      } catch (Exception e) {
      System.out.println(e.toString());
      e.printStackTrace();
      return "";
      }

        byte[] byteArray = inStr.getBytes("UTF-8");
        byte[] md5Bytes = md5.digest(byteArray);
        StringBuffer hexValue = new StringBuffer();
        for (int i = 0; i < md5Bytes.length; i++) {
            int val = ((int) md5Bytes[i]) & 0xff;
            if (val < 16) {
                hexValue.append("0");
            }
            hexValue.append(Integer.toHexString(val));
        }
        return hexValue.toString();
      

      }
      }
      编写了测试代码对产品代码进行测试:
      public static void main(String args[]) throws Exception {
      String str = new String("amigoxiexiexingxing");
      System.out.println("原始:" + str);
      System.out.println("MD5后:" + md5Encode(str));
      }

    五、实验体会与总结

    本次实验通过结对编程实现重构等操作,也通过实验找到了结对编程的便利与趣味。

    1.版本控制的好处
    (1)版本控制提供项目级的 undo(撤销)功能:没有什么事情是终结版本,任何错误必须很容易回滚。
    (2)版本控制允许多人在同一代码上工作,只要遵守一定的控制原则就行。
    (3)版本控制系统保存了过去所作的修改的历史记录。
    (4)版本控制系统支持在主线上开发的同时发布多个软件版本。
    (5)版本控制也是项目级的时间机器,你可以选择任何一个时间, 精确地查看项目在当时的情况。
    2.重构(Refactor):就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更。
    修改方法是:用鼠标单击要改的名字,选择Eclipse中菜单中的Refactor->Rename...

  • 相关阅读:
    JUnit之持续集成(CI,Continuous Integration)
    Junit初级编码(二)探索JUnit核心
    《opencv学习》 之 特征检测与匹配
    opencv小问题大智慧
    opencv3.1+contrib的配置大总结(配置了两天,遇到问题无数)
    《图像处理实例》 之 透视变换
    《图像处理实例》 之 物体计数
    《图像处理实例》 之 操作规则的圆
    《电路学习第三天》 之 彩扩机项目设计
    《图像处理实例》 之 提取特殊背景的直线
  • 原文地址:https://www.cnblogs.com/l97----/p/6838033.html
Copyright © 2011-2022 走看看