2018-2019-2 20175227张雪莹《Java程序设计》

实验三 《敏捷开发与XP实践》

实验报告封面

  • 课程:Java程序设计 班级:1752班 姓名:张雪莹 学号:20175227
  • 指导教师:娄嘉鹏 实验日期:2019年4月29日
  • 实验时间:--- 实验序号:实验三
  • 实验名称:敏捷开发与XP实践
  • 实验题目
  • 实验要求
    • 完成实验三 敏捷开发与XP实践中的内容,参考Java密码学算法相关内容
    • 其中Eclipse相关的内容参考Intellj IDEA简易教程换成IDEA实现
    • 完成云班课中的检查点,也可以先完成实验报告,直接提交。注意不能只有截图,要有知识点,原理,遇到的问题和解决过程等说明。实验报告中一个检查点要有多张截图。
    • 发表实验报告博客,标题“学期(如2018-2019-2) 学号(如20175300)实验三《敏捷开发与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中的插件,通过Jetbrains官方仓库安装:打开 Settings ->Plugins -> Marketplace在搜索框输入alibaba即可看到Alibaba Java Code Guidelines插件,点击Install进行安装,然后重启IDE生效:

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



- 在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化



- 下面简单介绍一下Code菜单中选项的简单用法:

- Override Methods:重载方法/新建方法

- Implement Methods:执行方法

- Generate:创建类里面任何字段的getter与setter方法

- Surround with:将某条语句被if、for等等封装语句括起

- Move Statement Down/up:将语句下移到后一模块之后

- Move line down:调换语句顺序

- Comment with Line/Block Comment:两种注释

- Reformat Code:将代码按标准格式缩进

  • 结对编程

    • 要求:

      • 在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后,下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例,测试成功后git add .; git commit -m "自己学号 添加内容";git push;
      • 提交搭档项目git log的截图,包含上面git commit的信息,并加上自己的学号水印信息。
    • 结对编程是XP中的重要实践。在结对编程模式下,一对程序员肩并肩、平等地、互补地进行开发工作。

    • 结对编程中有两个角色:

      • 驾驶员(Driver)是控制键盘输入的人。
      • 领航员(Navigator)起到领航、提醒的作用。
    • 邀请结对伙伴加入自己的仓库

      • 打开自己的码云项目
      • 点击管理->仓库成员管理->添加仓库成员->邀请用户

  • 打开虚拟机,输入git clone 搭档码云链接
  • 转到要添加代码的搭档目录下进行atom Complex.javaatom ComplexTest.java

  • Complex代码为:
/**
@author Xueying Zhang 20175227
@date 2019/4/29 12:49.
*/
public class Complex{
private double a;
private double b; public Complex(double a, double b) {
this.a = a;
this.b = b;
} public static double getRealPart(double a) {
return a;
} public static double getImagePart(double b) {
return b;
} public Complex ComplexAdd(Complex c) {
return new Complex(a + c.a, b + c.b);
}
public Complex ComplexSub(Complex c) {
return new Complex(a - c.a, b - c.b);
}
public Complex ComplexMulti(Complex c) {
return new Complex(a * c.a - b * c.b, a * c.b + b * c.a);
}
public Complex ComplexDiv(Complex c) {
return new Complex((a * c.b + b * c.a)/(c.b * c.b + c.a * c.a), (b * c.b + a * c.a)/(c.b * c.b + c.a * c.a));
} public String toString() {
String s = " ";
if (b > 0) {
s = a + "+" + b + "i";
}
if (b == 0) {
s = a + "";
}
if (b < 0) {
s = a + " " + b + "i";
}
return s;
}
}
  • 需要测试的方法有:getRealPartgetImagePartComplexAddComplexSubComplexMultiComplexDiv
  • 测试代码如下:
import junit.framework.TestCase;
import org.junit.Test; public class ComplexTest extends TestCase {
Complex com1=new Complex(1.0,2.0);
Complex com2=new Complex(0.0,1.0);
Complex com3=new Complex(1.0,0.0);
Complex com4=new Complex(-1.0,-2.0); public void testgetRealPart()throws Exception{//测试getRealPart方法
assertEquals(2.7,Complex.getRealPart(2.7));
assertEquals(-2.7,Complex.getRealPart(-2.7));
assertEquals(5.0,Complex.getRealPart(5.0));
assertEquals(0.0,Complex.getRealPart(0.0));
}
public void testgetImagePart()throws Exception{//测试getImagePart方法
assertEquals(2.7,Complex.getImagePart(2.7));
assertEquals(-2.7,Complex.getImagePart(-2.7));
assertEquals(5.0,Complex.getImagePart(5.0));
assertEquals(0.0,Complex.getImagePart(0.0));
}
public void testComplexAdd()throws Exception{//测试ComplexAdd方法
assertEquals("1.0+3.0i",com1.ComplexAdd(com2).toString());
assertEquals("2.0+2.0i",com1.ComplexAdd(com3).toString());
assertEquals("1.0+1.0i",com2.ComplexAdd(com3).toString());
assertEquals("0.0",com1.ComplexAdd(com4).toString());
}
public void testComplexSub()throws Exception{//测试ComplexSub方法
assertEquals("1.0+1.0i",com1.ComplexSub(com2).toString());
assertEquals("0.0+2.0i",com1.ComplexSub(com3).toString());
assertEquals("-1.0+1.0i",com2.ComplexSub(com3).toString());
assertEquals("2.0+4.0i",com1.ComplexSub(com4).toString());
}
public void testComplexMulti()throws Exception{//测试ComplexMulti方法
assertEquals("-2.0+1.0i",com1.ComplexMulti(com2).toString());
assertEquals("1.0+2.0i",com1.ComplexMulti(com3).toString());
assertEquals("0.0+1.0i",com2.ComplexMulti(com3).toString());
assertEquals("3.0 -4.0i",com1.ComplexMulti(com4).toString());
}
public void testComplexDiv()throws Exception{//测试ComplexDiv方法
assertEquals("1.0+2.0i",com1.ComplexDiv(com2).toString());
assertEquals("2.0+1.0i",com1.ComplexDiv(com3).toString());
assertEquals("1.0",com2.ComplexDiv(com3).toString());
assertEquals("-0.8 -1.0i",com1.ComplexDiv(com4).toString());
}
}
  • 运行示例(此处由虚拟机中atom更改为windows中IDEA编写,因为方便运用junit单元测试)如下:

  • 上传至码云:

  • 重构

    • 要求

      • 实验三 敏捷开发与XP实践 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成IDEA
      • 完成重构内容的练习,下载搭档的代码,至少进行三项重构,提交重构后代码的截图,加上自己的学号水印。提交搭档的码云项目链接。
    • 概念:重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。
    • 前提:不改变软件外部行为;来确保重构的安全
    • 如何做到不改变软件外部行为?
      • 重构后的代码要能通过单元测试
    • 修改软件的四种动机:
      • 增加新功能;
      • 原有功能有BUG;
      • 改善原有程序的结构;
      • 优化原有系统的性能 。
    • 臭味道(Bad Smell)的代码及其重构方法:
  • 完整的重构流程:

    • 从版本控制系统代码库中Check out code
    • 读懂代码(包括测试代码)
    • 发现bad smell
    • Refactoring
    • 运行所有的Unit Tests
    • 往代码库中Check in code
  • 练习:

  • 重构前代码:

       class XiyoujiRenwu{
float height,weight;
String head,ear;
void speak(String s){
head ="歪着头";
System.out.println(s);
}
}
public class Example4_3{
public static void main(String args[]){
XiyoujiRenwu zhubajie,sunwukong;
zhubajie = new XiyoujiRenwu();
sunwukong = new XiyoujiRenwu();
zhubajie.height = 1.80f;
zhubajie.head = "大头";
zhubajie.ear = "一双大耳朵";
sunwukong.height = 1.62f;
sunwukong.weight = 1000f;
sunwukong.head = "秀发飘飘";
System.out.println("zhubajie的身高"+zhubajie.height);
System.out.println("zhubajie的头"+zhubajie.head);
System.out.println("sunwukong的重量"+sunwukong.height);
System.out.println("sunwukong.head"+sunwukong.head);
zhubajie.speak("俺老猪我想娶媳妇");
System.out.println("zhubajie现在的头:"+zhubajie.head);
sunwukong.speak("老孙我重1000斤,我想骗猪八戒背我");
System.out.println("sunwukong现在的头:"+sunwukong.head);
}
}
  • 代码中存在的问题:

    • 类命名方法未遵守驼峰规则
    • 成员变量未封装
    • 类中方法未封装
  • 重构后代码

  • Java密码学算法

    • 要求

    • 安全问题可以归结为安全的三个属性(CIA金三角):
      • 机密性(Confidentiality)
      • 完整性(Integrity)
      • 可用性(Availability)
    • 密码学: 主要是研究保密通信和信息保密的学科, 包括信息保密传输和信息加密存储等。密码学包含密码编码学( Cryptography) 和密码分析学(Cryptanalyst) 两个分支。
    • 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平台上进行用户身份鉴别的功能。
    • 我与结对伙伴共同编写凯撒密码加解密算法代码如下:
      • 初始代码:

  • 规范代码

  • 代码为:

  • Caesar.java

/**
* @author Xueying Zhang 20175227
* @date 2019/4/29 19:46.
*/ public class Caesar {
public static void main(String args[]) throws Exception{
String s=args[0];
int key=Integer.parseInt(args[1]);
Movement m=new Movement();
int n=s.length();
String es="";
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(c >= 'a' && c <= 'z'){
es=m.realizeMove(n,c,key,'a','z');
}
else if (c >= 'A' && c <= 'Z'){
es=m.realizeMove(n,c,key,'A','Z');
}
}
System.out.println(es);
}
}
  • Movement.java
/**
* @author Xueying Zhang 20175227
* @date 2019/4/29 20:33.
*/
public class Movement {
String es="";
public String realizeMove(int n,char c,int key,char a,char b){
//移动key%26位
c+=key%26;
if(c<a) {
c+=26;
//向左超界
}
if(c>b) {
c-=26;
//向右超界
}
es+=c;
return es;
}
}

  • 运行结果

实验中遇到的问题和解决过程

  • 问题1:在实现第一步代码规范时,下面提示需要注释作者信息,我之前并没有设置过,于是出现了上文截图中系统默认的作者信息。
  • 问题1解决办法:在IDEA中选Settings->Editor->File and Code Templates->Class在程序框中输入:
     /**
*@author xxx
*@date ${DATE} ${TIME}.
*/

再次重新新建class就能看见有作者信息注释了:

感悟和收获

  • 通过本次实验,学习了如何使代码规范,代码重构,Java中密码算法的实现等内容。
  • 我意识到平时自己的编程中有很多不规范的地方和缺少注释的地方,注意这些方面可以使自己的程序可读性更高。
  • 实验二时,老师教授了很多关于编程的原则,使得我的思维从会编程到便好程,但是对于更改“bad smell”程序时,在不知道可以使用代码重构的情况下,这个任务会显得很麻烦,重复工作很多;在此次实验过后,有了效率更高的办法解决该问题,同时也感受到了IDEA功能的强大。
  • 本次实验还get了码云仓库新技能,可以在仓库中添加成员,这对于结对编程来说很方便,一定程度上提高了结对编程效率。

代码托管

参考资料

2018-2019-2 20175227张雪莹《Java程序设计》实验三 《敏捷开发与XP实践》的更多相关文章

  1. 20155229实验三 《Java面向对象程序设计实验三 敏捷开发与XP实践 》实验报告

    实验题目 1.在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下Code菜单,找出一项让自己感觉最好用的功能. 2.下载搭档实验二的Complex代 ...

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

    2018-2019-20175205 实验三敏捷开发与XP实践<Java开发环境的熟悉>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>&l ...

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

    2018-2019-2 20175306实验三敏捷开发与XP实践<Java开发环境的熟悉>实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先 ...

  4. 20165230 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    20165230 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: 指导教 ...

  5. 20145213《Java程序设计》实验三敏捷开发与XP实践

    20145213<Java程序设计>实验三敏捷开发与XP实践 实验要求 1.XP基础 2.XP核心实践 3.相关工具 实验内容 1.敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法 ...

  6. 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...

  7. JAVA课程实验报告 实验三 敏捷开发与XP实践

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉 ...

  8. 20145225《Java程序设计》 实验三 "敏捷开发与XP实践"

    20145225<Java程序设计> 实验三 "敏捷开发与XP实践" 实验报告 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 git 上 ...

  9. 20155324 《Java程序设计》实验三 敏捷开发与XP实践

    20155324 <Java程序设计>实验三 敏捷开发与XP实践 实验内容 XP基础 1.XP核心实践 2.相关工具 实验步骤 敏捷开发与XP 1.敏捷开发(Agile Developme ...

  10. 20165205 2017-2018-2 《Java程序设计》实验三 敏捷开发与XP实践

    20165205 2017-2018-2 <Java程序设计>实验三 敏捷开发与XP实践 实验内容 检查点1: 安装alibaba 插件,解决代码中的规范问题 首先把搭档加入到自己的项目中 ...

随机推荐

  1. C# 检查数字

    #region 检查数字 public bool IsNumeric(string value) { bool result; try { int x = int.Parse(value); resu ...

  2. vue-router+elelment-ui,实现导航栏激活高亮

    <el-menu :default-active="$route.path" class="el-menu-vertical-demo" backgrou ...

  3. CAShapeLayer绘图

    之前讲过使用UIBezierPath在UIView的drawRect中绘图, 今天我们讲下另外一种方式: CAShaperLayer 先说说使用CAShapeLayer的优点: GPU执行, GPU执 ...

  4. Watchman 的安装

    先查看gcc的版本 gcc --version 如果gcc的版本低于4.8,就要升级gcc的版本了.在这里,就不延时升级gcc了, 安装watchman git clone https://githu ...

  5. border边框属性

    边框属性: 边框宽度(border-width):thin.medium.thick.长度值 边框颜色(border-color):颜色.transparent(透明) 边框样式(border-sty ...

  6. python学习5---实现凸包

    1.暴力法 def g(A,B,P): """ 判断点PA矢量在AB矢量的顺时针还是逆时针方向, 若在逆时针方向则返回1,同向返回0,在顺时针方向返回-1 :param ...

  7. Django_ORM相关操作

    一般的操作 1.all():查询所有的结果 2.filter():包含与所有筛选条件匹配的对象 3.get():返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果对象没有或者超过一个会报错 4 ...

  8. VS Code引用 vue/cli

    npm i @vue/cli -g    引用cli脚手架 3.0版本 下载好后 找个空文件夹  vue create myvue 创建vue项目   myvue是自己项目名称 Your connec ...

  9. Kali Linux Web后门工具、Windows操作系统痕迹清除方法

    Kali Linux Web后门工具 Kali的web后门工具一共有四款,今天只介绍WebaCoo 首先介绍第一个WeBaCoo(Web Backdoor Cookie) WeBaCoo是一款隐蔽的脚 ...

  10. meven仓库设置局域网私服

    找到设置文件 在设置文件中配置私服地址