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

    实验三 敏捷开发与XP实践

    实验内容

    • XP基础

    • 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));
    }
    }
    
    • 程序没有最基本的缩进,让人读起来很费劲,在IDEA中:

    下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例
    • 搭档代码如下:
    import java.lang.*;
    public class Complex {
        //定义属性并生成getter,setter
        double RealPart;
        double ImagePart;
        public double getRealPart() {
            return RealPart;
        }
        public void setRealPart(double realPart) {
            this.RealPart=realPart;
        }
        public double getImagePart() {
            return ImagePart;
        }
        public void setImagePart(double imagePart) {
            this.ImagePart=imagePart;
        }
        //定义构造函数
        public Complex(double R, double I) {
            RealPart = R;
            ImagePart = I;
        }
        //Override Object
        public boolean equals(Complex obj1) {
            if (this.getRealPart () == obj1.getRealPart () && this.getImagePart () == obj1.getImagePart ())
                return true;
            else return false;
        }
        //定义公有方法:加减乘除
        public String toString() {
            return "第一个"+RealPart + " 第二个" + ImagePart ;
        }
        public Complex ComplexAdd(Complex obj) {
            return new Complex ( RealPart + obj.getRealPart (), ImagePart + obj.getImagePart () );
        }
        public Complex ComplexSub(Complex obj) {
            return new Complex ( RealPart - obj.getRealPart (), ImagePart - obj.getImagePart () );
        }
        public Complex ComplexMulti(Complex obj) {
            return new Complex ( RealPart * obj.getRealPart () - ImagePart * obj.getImagePart (), RealPart * obj.getImagePart () + ImagePart * obj.getRealPart () );
        }
        public Complex ComplexDiv(Complex obj){
            return new Complex ( RealPart / obj.getRealPart () - ImagePart / obj.getImagePart (), RealPart / obj.getImagePart () + ImagePart / obj.getRealPart () );
        }
    }
    
    • 根据他的代码编写ComplexTest,加入不少于三个单元测试用例,代码如下:
    /**
     * Created by 20155327 on 2017/5/4.
     */
    
    import static org.junit.Assert.*;
    
    
    import junit.framework.TestCase;
    import org.junit.Test;
    
    public class ComplexTest extends TestCase {
        Complex c1 = new Complex(0, 3);
        Complex c2 = new Complex(-1, -1);
        Complex c3 = new Complex(2, 1);
    
        @Test
        public void testgetRealPart() throws Exception {
            assertEquals(-1.0, Complex.getRealPart(-1.0));
            assertEquals(5.0, Complex.getRealPart(5.0));
            assertEquals(0.0, Complex.getRealPart(0.0));
        }
    
        @Test
        public void testgetImagePart() throws Exception {
            assertEquals(-1.0, Complex.getImagePart(-1.0));
            assertEquals(5.0, Complex.getImagePart(5.0));
            assertEquals(0.0, Complex.getImagePart(0.0));
        }
    
        @Test
        public void testgetPart() throws Exception {
            assertEquals(4.0, Complex.getImagePart(4.0));
            assertEquals(5.0, Complex.getImagePart(5.0));
            assertEquals(1.0, Complex.getImagePart(1.0));
        }
    
    
    }
    
    

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

    IDEA中的Code菜单中
    可以发现其中的功能十分丰富,同时很多功能都可以通过快捷键实现。现将几个比较常用的功能总结如下:
    -code 进入generate中

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

    重构,是让我们在不为系统带来新的bug的前提下,使其更加易于阅读、易于维护和易于变更。

    重构如下:

    public class Person3 implements Cloneable {
        private String name;
        private int ID;
        Person3(String name, int ID){
            this.name = name;
            this.ID = ID;
        }
        public String getName() {
            return name;
        }
        public int getID() {
            return ID;
        }
        @Override
        protected Person3 clone() throws CloneNotSupportedException {
            return (Person3)super.clone();
        }
    
        public static void main(String[] args) {
            try {
                Person3 p = getJustin();
                Person3 p3 = getClone(p);
    
                getPrintln((Person3) p);
                getPrintln((Person3) p3);
                getPrintln("p.getName().hashCode() : " + p.getName().hashCode());
                getPrintln("p3.getName().hashCode() : " + p3.getName().hashCode());
                String result = p.getName().hashCode() == p3.getName().hashCode() ? "浅拷贝" : "深拷贝";
                getPrintln(result);
            }catch(CloneNotSupportedException e){
                System.out.println(e);
            }
        }
    
        private static Person3 getClone(Person3 p) throws CloneNotSupportedException {
            return p.clone();
        }
    
        private static Person3 getJustin() {
            return new Person3("Justin",20150001);
        }
    
        private static void getPrintln(String x) {
            System.out.println(x);
        }
    
        private static void getPrintln(Person3 p) {
            System.out.println(p);
        }
    }
    
    

    重构

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

    • 代码重复,还有方法过长、参数列过长、条件逻辑过度复杂、分支语句等等方面。通过重构,我们可以实现代码的优化。
    以结对的方式完成Java密码学相关内容的学习,结合重构、git、代码标准等

    PSP(Personal Software Process)时间
    步骤 耗时 百分比
    需求分析 20min 20%
    设计 10min 10%
    代码实现 40min 40%
    测试 20min 20%
    分析总结 10min 10%
    实验体会

    这次实验主要是学习重构,重构主要是解决代码重复,还有方法过长、参数列过长、条件逻辑过度复杂、分支语句等等方面的问题,对代码进行优化,看上去不那么的冗长。

    重温实验,发现自己还是有地方没有完成,老师让我们介绍code中的一项功能,之前的真的很敷衍,这次重新优化了一下。本次对书上的长代码进行了一次重构体验,真实的体会到了,重构对代码的重要性。他可让代码更短,言简意赅这四个字可能就是对重构最好的诠释吧

  • 相关阅读:
    POJ1850Code
    POJ1019Number Sequence
    POJ2115C Looooops
    POJ1496Word Index
    POJ3292Semiprime Hnumbers
    POJ1942Paths on a Grid
    搞笑!
    个人感觉vs 提高效率的快捷键
    PYTHON实现 字符串转化为十六进制串
    scapy发送伪装包(1) 获取本机信息
  • 原文地址:https://www.cnblogs.com/hpl20155329/p/6822323.html
Copyright © 2011-2022 走看看