• 2018-2019-2 20175306实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告


    2018-2019-2 20175306实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告


    实验内容

    1. XP基础
    2. XP核心实践
    3. 相关工具

    实验要求

    1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
    2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导

    实验步骤

    (一)编码标准

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

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

    • 使用:在项目名称上单击右键,在弹出菜单上选择编码规约扫描:

    • 出现下图内容,不规范的地方,有中文提示并且定位到了行,alibaba把问题分为block/critical/major三个等级,有些规则可以一键修复。

    • 例如这里就可以点击直接修复

    • 代码出现的问题:
      1.不允许任何魔法值(即未经定义的常量)直接出现在代码中。
      2.包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式
      3.所有的类都必须添加创建者信息。

    • 规范后代码:

    /**
     - CodeStandard
     -  - @author WJS20175306
     - @date 2019/4/29
     */
    @SuppressWarnings("ALL")
    public class CodeStandard {
        @SuppressWarnings("AlibabaUndefineMagicConstant")
        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());
            //noinspection AlibabaUndefineMagicConstant
            if (buffer.capacity() < 20) {
                buffer.append("1234567");
            }
            for (int i = 0; i < buffer.length(); i++) {
                System.out.println(buffer.charAt(i));
            }
        }
    }
    
    • code的使用:参考: code篇
      ·Gengrate ( 用于生成Construct、Getter/Setter、toString、Test等) Alt + Insert

      ·Cyclic Expand Word ( 循环往上选择单词 ) Alt + /
      ·Cyclic Expand Word (Backwrad)( 循环往下选择单词 ) Alt + Shift + /

    • 代码标准中很重要的一项是如何给包、类、变量、方法等标识符命名,能很好的命名可以让自己的代码立马上升一个档次。Java中的一般的命名规则有:
      · 要体现各自的含义
      · 包、类、变量用名词
      · 方法名用动宾
      · 包名全部小写,如:io,awt
      · 类名第一个字母要大写,如:HelloWorldApp
      · 变量名第一个字母要小写,如:userName
      · 方法名第一个字母要小写:setName

    (二)版本控制

    • 版本控制提供项目级的 undo(撤销) 功能: 没有什么事情是终结版本, 任何错误必须很容易回滚。 假设你在使用世界上最复杂的文字处理系统。 它具备了所有的能想到的功能,就是没有支持 DELETE(删除) 键。想象你打字的时候得多么的谨慎和缓慢吧, 特别是一篇超大的文档的快临近末尾的时候, 一个不小心就要重头再来(试想你选中所有的文字, 不小心按了 DELETE 键, 因为没有撤销功能,只好重新录入)。编辑文字和版本控制相同,任何时候都需要回滚,无论是一个小时, 一天, 还是一周, 这让你的团队工作自由快速的工作, 而且对于修正错误也非常自信。
    • 版本控制允许多人在同一代码上工作, 只要遵守一定的控制原则就行。 再也不会发生诸如一个人覆盖了另一个人编辑的代码,导致那个人的修改无效这样的情况。
    • 版本控制系统保存了过去所作的修改的历史记录。如果你遭遇到一些惊讶的代码,通过版本控制系统可以很容易找出是谁干的, 修改了什么, 修改的时间, 如果幸运的话,还能找出原因。
    • 版本控制系统还支持在主线上开发的同时发布多个软件版本。在软件发布的时候也不需要整个团队的停止工作,不需要冻结代码。
    • 版本控制也是项目级的时间机器,你可以选择任何一个时间, 精确地查看项目在当时的情况。 这对研究非常有用, 也是重现以前某个有问题的发布版本的基础。

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

    • 一个完整的重构流程包括:
      1.从版本控制系统代码库中Check out code
      2.读懂代码(包括测试代码)
      3.发现bad smell
      4.Refactoring
      5.运行所有的Unit Tests
      6.往代码库中Check in code

    (四)实践

    • 邀请搭档进入码云仓库:

    • 搭档的Complex代码

    • 对搭档代码进行测试:

    • 测试代码:

    package 其它;
    
    import junit.framework.TestCase;
    import org.junit.Test;
    
    public class HYComplexTest extends TestCase {
        HYComplex a = new HYComplex(2.0,4.0);
        HYComplex b = new HYComplex(0.0,-3.0);
        HYComplex c = new HYComplex(-5.0,0.0);
        @Test
        public void testgetRealpart(){
            assertEquals(2.0,a.getRealPart());
            assertEquals(0.0,b.getRealPart());
            assertEquals(-5.0,c.getRealPart());
        }
        @Test
        public void testgetImagePart(){
            assertEquals(4.0,a.getImagePart());
            assertEquals(-3.0,b.getImagePart());
            assertEquals(0.0,c.getImagePart());
        }
        @Test
        public void testMyComplexAdd(){
            String q = a.complexAdd(b).toString();
            String w = b.complexAdd(c).toString();
            String e = c.complexAdd(a).toString();
            assertEquals("2.0+1.0i",q);
            assertEquals("-5.0-3.0i",w);
            assertEquals("-3.0+4.0i",e);
        }
        @Test
        public void testMyComplexSub(){
            String r = a.complexSub(b).toString();
            String t = b.complexSub(c).toString();
            String y = c.complexSub(a).toString();
            assertEquals("2.0+7.0i",r);
            assertEquals("5.0-3.0i",t);
            assertEquals("-7.0-4.0i",y);
        }
        @Test
        public void testMyComplexMulti(){
            String u = a.complexMulti(b).toString();
            String i = b.complexMulti(c).toString();
            String o = c.complexMulti(a).toString();
            assertEquals("12.0-6.0i",u);
            assertEquals("15.0i",i);
            assertEquals("-10.0-20.0i",o);
        }
        @Test
        public void testMyComplexDiv(){
            String p = c.complexDiv(a).toString();
            assertEquals("-0.5+2.5i",p);
        }
        @Test
        public void testtoString(){
            assertEquals("2.0+4.0i",a.toString());
            assertEquals("-3.0i",b.toString());
            assertEquals("-5.0",c.toString());
        }
    }
    
    • 重构1:所有类都必须添加创建者信息

    • 重构2:所有的覆写方法,必须加@Override注解

    • 重构3:方法名,参数名,成员变量,局部变量都统一使用lowerCamelCase

    • 重构4:在if/else/for/while/do语句中必须使用大括号,即使只有一行代码

    • 重构后上传到搭档仓库的git log:

    码云链接:

    我的链接
    搭档的链接

    (五)java与密码学

    1.实验要求:
    参考 http://www.cnblogs.com/rocedu/p/6683948.html,以结对的方式完成Java密码学相关内容的学习,结合重构,git,代码标准。
    2.实验过程:
    我和搭档进行的是凯撒密码的实现。凯撒密码的加密和解密算法相当来说比较简单。
    其加密过程如下:
    若明文记为m,密文记为c,秘钥为k,加密变换记为Encrypt(k,m),解密变换记为Decrypt(k,m))。凯撒密码的加密过程可记为如下一个变换:

    c≡m+k mod n (其中n为基本字符个数)

    同样,解密过程可表示为:
    m≡c+k mod n (其中n为基本字符个数)
    加密代码为:

    import java.util.Scanner;
    
    public class JiaMi {
        public static void main(String[] args) {
            System.out.print("请输入明文:");
            Scanner a=new Scanner(System.in);
            String b=a.nextLine();
            System.out.print("请输入秘钥:");
            Scanner c=new Scanner(System.in);
            int key=c.nextInt();
            Encrypt(b, key);
        }
    
        public static void Encrypt(String str,int k){
            String s="";
            for (int i = 0; i < str.length(); i++) {
                char c=str.charAt(i);
                if(c>='a'&&c<='z'){
                    c+=k%26;
                    if(c<'a') {
                        c+=26;
                    }
                    if(c>'z') {
                        c-=26;
                    }
    
                }else if(c>='A'&&c<='Z'){
                    c+=k%26;
                    if(c<'A') {
                        c+=26;
                    }
                    if(c>'Z') {
                        c-=26;
                    }
                }
                s+=c;
            }
            System.out.println(str+" 加密为: "+s);
        }
    }
    

    解密代码为:

    import java.util.Scanner;
    
    public class JieMi {
        public static void main(String[] args) {
            System.out.print("请输入密文:");
            Scanner a=new Scanner(System.in);
            String b=a.nextLine();
            System.out.print("请输入秘钥:");
            Scanner c=new Scanner(System.in);
            int key=c.nextInt();
            Decrypt(b, key);
        }
    
        public static void Decrypt(String str,int k){
            String s="";
            for (int i = 0; i < str.length(); i++) {
                char c=str.charAt(i);
                if(c>='a'&&c<='z'){
                    c-=k%26;
                    if(c<'a') {
                        c+=26;
                    }
                    if(c>'z') {
                        c-=26;
                    }
    
                }else if(c>='A'&&c<='Z'){
                    c-=k%26;
                    if(c<'A') {
                        c+=26;
                    }
                    if(c>'Z') {
                        c-=26;
                    }
                }
                s+=c;
            }
            System.out.println(str+" 解密为: "+s);
        }
    }
    

    运行截图为:

    实验感悟:

    本次实验让我学会了对代码的规范修改,突然发现自己的代码还有很多的不足,不够规范,虽然有些问题不必非要体现出来,但是当规范后显得更加正式。还有对代码的重构,在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更,非常强大。最后学到了将代码上传到搭档的码云里,感觉不一样。

  • 相关阅读:
    JVM系列【2】Class文件结构
    JVM系列【5】JVM常用指令
    JVM系列【4】内存模型
    JVM系列【3】Class文件加载过程
    新编html网页设计从入门到精通 (龙马工作室) pdf扫描版​
    HTML5移动开发即学即用(双色) 王志刚 pdf扫描版​
    HTML5和CSS3实例教程 中文版 高清PDF扫描版
    HTML5+CSS3网站设计教程 (张晓景,胡克) [iso]
    HTML5+CSS3+jQuery Mobile轻松构造APP与移动网站 (陈婉凌) 中文pdf扫描版
    HTML5 Canvas游戏开发实战 PDF扫描版
  • 原文地址:https://www.cnblogs.com/wjs123456/p/10791866.html
Copyright © 2020-2023  润新知