zoukankan      html  css  js  c++  java
  • 20165310_Exp2实验三《敏捷开发与XP实践》

    20165310 java_exp3 敏捷开发与XP实践

    一、编码标准

    编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。

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

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

    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));
    }
    }
    
    • 使用code菜单规范代码:Code->Reformate 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));
        }
    }
    
    • code更多的功能

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

      幕快照 2018-04-27 下午1.45.4

    • 使用IDEA插件

      293911-20180501190100121-109253925

    结对编程

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

    结对编程中有两个角色:

    • 驾驶员(Driver)是控制键盘输入的人。
    • 领航员(Navigator)起到领航、提醒的作用。
    • 编写搭档测试用例

    在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后,下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例,测试成功后git add .; git commit -m "自己学号 添加内容";git push;

    • 结对搭档源代码
    public class Complex {
        private double RealPart;
        private double ImagePart;
    
        public double getterRealPart() {
            return this.RealPart;
        }
    
        public double getterImagePart() {
            return this.ImagePart;
        }
    
        public static double getterRealPart(double RealPart) {
            return RealPart;
        }
    
        public static double getterImagePart(double ImagePart) {
            return ImagePart;
        }
    
        public void setterRealPart(double RealPart) {
            this.RealPart = RealPart;
        }
    
        public void setterImagePart(double ImagePart) {
            this.ImagePart = ImagePart;
        }
    
        public Complex() {
            this.RealPart = 1;
            this.ImagePart = 2;
        }
    
        public Complex(double R, double I) {
            this.RealPart = R;
            this.ImagePart = I;
        }
    
        //Override Object
        public boolean equals(Object obj) {
            Complex complex = (Complex) obj;
            if (this == obj) {
                return true;
            } else if (!(obj instanceof Complex)) {
                return false;
            } else if (getterRealPart() != complex.getterRealPart()) {
                return false;
            } else if (getterImagePart() != complex.getterImagePart()) {
                return false;
            } else
                return true;
        }
    
        public String toString() {
            if (getterRealPart() == 0)
                return getterImagePart() + "i";
            else if (getterImagePart() == 0)
                return getterRealPart() + "";
            else if (getterImagePart() < 0)
                return getterRealPart() + "" + getterImagePart() + "i";
            else
                return getterRealPart() + "+" + getterImagePart() + "i";
        }
    
        // 定义公有方法:加减乘除
        Complex ComplexAdd(Complex a) {
            return new Complex(this.getterRealPart() + a.getterRealPart(), getterImagePart() + a.getterImagePart());
        }
    
        Complex ComplexSub(Complex a) {
            return new Complex(this.getterRealPart() - a.getterRealPart(), getterImagePart() - a.getterImagePart());
        }
    
        Complex ComplexMulti(Complex a) {
            return new Complex(this.getterRealPart() * a.getterRealPart() - a.getterImagePart() * this.getterImagePart(), a.getterImagePart() * this.getterRealPart() + a.getterRealPart() * this.getterImagePart());
        }
    
        Complex ComplexDiv(Complex a) {
            Complex c = new Complex();
            if (a.equals(c)) {
                System.out.println("错误,分母不能为零!");
            }
            return new Complex(this.getterRealPart() / a.getterRealPart(), this.getterImagePart() / a.getterImagePart());
        }
    }
    
    • 测试用例
    import junit.framework.TestCase;
    import org.junit.Test;
    
    public class ComplexTest extends TestCase {
        Complex complex1 = new Complex(3, 4);
        Complex complex2 = new Complex(1, -2);
        Complex complex3 = new Complex(1, 1);
    
        @Test
        public void testgetterRealPart() throws Exception {
            assertEquals(3.0, Complex.getterRealPart(3.0));
            assertEquals(1.0, Complex.getterRealPart(1.0));
            assertEquals(-2.0, Complex.getterRealPart(-2.0));
        }
    
        @Test
        public void testgetterImagePart() throws Exception {
            assertEquals(4.0, Complex.getterImagePart(4.0));
            assertEquals(-2.0, Complex.getterImagePart(-2.0));
            assertEquals(0.0, Complex.getterImagePart(0.0));
        }
    
        @Test
        public void testAdd() throws Exception {
            assertEquals("4.0+2.0i", complex1.ComplexAdd(complex2).toString());
            assertEquals("4.0+5.0i", complex1.ComplexAdd(complex3).toString());
            assertEquals("2.0-1.0i", complex2.ComplexAdd(complex3).toString());
        }
    
        @Test
        public void testSub() throws Exception {
            assertEquals("2.0+6.0i", complex1.ComplexSub(complex2).toString());
            assertEquals("2.0+3.0i", complex1.ComplexSub(complex3).toString());
            assertEquals("-3.0i", complex2.ComplexSub(complex3).toString());
        }
    
        @Test
        public void testMulti() throws Exception {
            assertEquals("11.0-2.0i", complex1.ComplexMulti(complex2).toString());
            assertEquals("-1.0+7.0i", complex1.ComplexMulti(complex3).toString());
            assertEquals("3.0-1.0i", complex2.ComplexMulti(complex3).toString());
        }
    
        @Test
        public void testDiv() throws Exception {
            assertEquals("3.0-2.0i", complex1.ComplexDiv(complex2).toString());
            assertEquals("3.0+4.0i", complex1.ComplexDiv(complex3).toString());
            assertEquals("1.0-2.0i", complex2.ComplexDiv(complex3).toString());
        }
    }
    
    • 测试截图

      幕快照 2018-04-27 下午2.00.0

    • 上传到结对搭档的码云项目

      幕快照 2018-04-27 下午2.02.3

    重构

    • 重构的概念

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

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

    1. 从版本控制系统代码库中Check out code
    2. 读懂代码(包括测试代码)
    3. 发现bad smell
    4. Refactoring
    5. 运行所有的Unit Tests
    6. 往代码库中Check in code
    • 搭档代码与问题

      幕快照 2018-04-27 下午2.24.3

      • 问题一:起名不规范;
      • 问题二:定义变量没有分行并且过长;
      • 问题三:printf是对输出文字格式化后再显示在文本模式中,这里只需要标准输出即可;
    • 修改后代码

      幕快照 2018-04-27 下午2.26.1

    • Bad Smell

      serid28022labid810time143272176190

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

    • 伪代码

      (1) 生成MessageDigest对象
      (2) 传入需要计算的字符串,生成字符串数组
      (3) 计算消息摘要
      (4) 处理计算结果,将结果转为字符串
      

    • 源代码

      幕快照+2018-04-27+下午6.19.5

    • 重构代码

      幕快照+2018-04-27+下午6.17.5

    • 编写测试代码并规范代码幕快照+2018-04-27+下午6.07.5

    • 测试代码

      幕快照+2018-04-27+下午6.09.2

    • 分工:

      我完成伪代码与源代码,搭档进行重构与代码测试,最终将完善的产品代码上传至码云

    PSP

    步骤 耗时 百分比
    需求分析 12min 10%
    设计 10min 8%
    代码实现 48min 40%
    测试 40min 34%
    分析总结 10min 8%
  • 相关阅读:
    Android 获取内存信息
    Android上基于libgdx的游戏开发资料
    Android使用http协议与服务器通信
    Android 下载zip压缩文件并解压
    2014年终总结
    OSG 坑爹的Android example
    支持Android 的几款开源3D引擎调研
    利用Android NDK编译lapack
    Django 中实现连接多个数据库并实现读写分离
    Git之多人协同开发
  • 原文地址:https://www.cnblogs.com/atbaoi/p/8995596.html
Copyright © 2011-2022 走看看