2018-2019-2 20175214 实验三《敏捷开发与XP实践》实验报告
一、实验内容
- 1、编码标准:在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下Code菜单,找出一项让自己感觉最好用的功能。提交截图,加上自己学号水印。
- 2、搭档代码检验:在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后,下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例,测试成功后git add .; git commit -m "自己学号 添加内容";git push;
- 3、重构:完成重构内容的练习,下载搭档的代码,至少进行三项重构
- 4、以结对的方式完成Java密码学相关内容的学习,结合重构,git,代码标准。
二、实验步骤
1.编码标准
在扩展包处搜索
alibaba
并下载,安装完成后重启:
在要进行规范的文件右键选择 “编码规约扫描”开始扫描:
- 规范前给出的不规范内容提示如下:
规范后的代码如下:
Java中的一般的命名规则有:
- 要体现各自的含义
- 包、类、变量用名词
- 方法名用动宾
- 包名全部小写,如:io,awt
- 类名第一个字母要大写,如:HelloWorldApp
- 变量名第一个字母要小写,如:userNamege
- 方法名第一个字母要小写:setName
Code菜单中的一些功能
Override Methods(ctrl+O):重载基本类的方法
Surround With(Ctrl+Alt+T):使用if-else、for、while等语句包装代码段
omment with Line Comment(Ctrl+/):将本行变成注释
Comment with Block Comment(Ctrl+Shift+/):将选中的代码块变成注释
Move Statement Down ( 方法、代码下移 ) 快捷键:Ctrl + Shift + 向下箭头
Move Statement Up ( 方法、代码上移 )快捷键: Ctrl + Shift + 向上箭头
2.测试搭档代码
获得伙伴仓库权限
- 登陆伙伴的码云仓库,在管理中选择仓库成员管理,—>添加仓库成员—>邀请用户,然后直接手机扫码或者复制链接
- 登陆伙伴的码云仓库,在管理中选择仓库成员管理,—>添加仓库成员—>邀请用户,然后直接手机扫码或者复制链接
搭档代码如下:
package Experiment;
public class ComplexWZH {
double realPart;
double imagePart;
public ComplexWZH() {}
public ComplexWZH(double r, double i) {
realPart = r;
imagePart = i;
}
public double getRealPart() {
return realPart;
}
public double getImagePart() {
return imagePart;
}
@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj == null) {
return false;
}
if(getClass() != obj.getClass()) {
return false;
}
if(!(obj instanceof ComplexWZH)) {
return false;
} else {
ComplexWZH complexWZH = (ComplexWZH) obj;
if (complexWZH.imagePart == ((ComplexWZH) obj).imagePart) {
return true;
}
if (complexWZH.realPart == ((ComplexWZH) obj).realPart) {
return true;
}
}
return false;
}
@Override
public String toString() {
String str = "";
if (realPart == 0&& imagePart == 0) {
str = "0.0";
} else if (realPart == 0&& imagePart != 0) {
str = imagePart + "" + "i";
} else if (realPart != 0&& imagePart == 0) {
str = realPart + "";
} else if (realPart !=0&& imagePart > 0) {
str = realPart + "" + "+" + imagePart + "i";
} else if (realPart !=0&& imagePart < 0) {
str = realPart + "" + imagePart + "i";
}
return str;
}
public ComplexWZH complexAdd(ComplexWZH a) {
return new ComplexWZH(realPart + a.getRealPart(), imagePart + a.getImagePart());
}
public ComplexWZH complexSub(ComplexWZH a) {
return new ComplexWZH(realPart - a.getRealPart(), imagePart - a.getImagePart());
}
public ComplexWZH complexMulti(ComplexWZH a) {
return new ComplexWZH(realPart *a.getRealPart() - imagePart *a.getImagePart(), realPart *a.getImagePart() + imagePart *a.getRealPart());
}
public ComplexWZH complexDiv(ComplexWZH a) {
if(a.getRealPart() == 0&&a.getImagePart() == 0) {
System.out.println("除数不能为0");
return new ComplexWZH();
}
else {
return new ComplexWZH((realPart *a.getRealPart() - imagePart *a.getImagePart())/(a.getRealPart()*a.getRealPart()-a.getImagePart()*a.getImagePart()),(realPart *a.getImagePart() + imagePart *a.getRealPart())/(a.getRealPart()*a.getRealPart()-a.getImagePart()*a.getImagePart()));
}
}
}
对其中的所有方法均进行了测试
测试代码:
package Experiment;
import junit.framework.TestCase;
import org.junit.Test;
public class ComplexWZHTest extends TestCase {
ComplexWZH a = new ComplexWZH(2.0,5.0);
ComplexWZH b = new ComplexWZH(1.0,-4.0);
ComplexWZH c = new ComplexWZH(-3.0,2.0);
ComplexWZH d = new ComplexWZH(-4.0,-3.0);
ComplexWZH e = new ComplexWZH(0.0,0.0);
@Test
public void testgetRealPart() throws Exception {
assertEquals(2.0,a.getRealPart());
assertEquals(1.0,b.getRealPart());
assertEquals(-3.0,c.getRealPart());
assertEquals(-4.0,d.getRealPart());
assertEquals(0.0,e.getRealPart());
}
@Test
public void testgetImagePart() throws Exception {
assertEquals(5.0,a.getImagePart());
assertEquals(-4.0,b.getImagePart());
assertEquals(2.0,c.getImagePart());
assertEquals(-3.0,d.getImagePart());
assertEquals(0.0,e.getImagePart());
}
@Test
public void testequals() throws Exception {
assertEquals(true,a.toString().equals(a.toString()));
assertEquals(false,b.toString().equals(c.toString()));
assertEquals(false,d.toString().equals(e.toString()));
}
@Test
public void testtoString() throws Exception {
assertEquals("2.0+5.0i",a.toString());
assertEquals("1.0-4.0i",b.toString());
assertEquals("-3.0+2.0i",c.toString());
assertEquals("-4.0-3.0i",d.toString());
assertEquals("0.0",e.toString());
}
@Test
public void testComplexAdd() throws Exception {
assertEquals("3.0+1.0i",a.ComplexAdd(b).toString());
assertEquals("-7.0-1.0i",c.ComplexAdd(d).toString());
assertEquals("-4.0-3.0i",d.ComplexAdd(e).toString());
}
@Test
public void testComplexSub() throws Exception {
assertEquals("1.0+9.0i",a.ComplexSub(b).toString());
assertEquals("1.0+5.0i",c.ComplexSub(d).toString());
assertEquals("-3.0+2.0i",c.ComplexSub(e).toString());
}
public void testComplexMulti() throws Exception {
assertEquals("22.0-3.0i",a.ComplexMulti(b).toString());
assertEquals("18.0+1.0i",c.ComplexMulti(d).toString());
assertEquals("0.0",b.ComplexMulti(e).toString());
}
public void testComplexDiv() throws Exception {
assertEquals("-1.4666666666666666+0.2i",a.ComplexDiv(b).toString());
assertEquals("2.5714285714285716+0.14285714285714285i",c.ComplexDiv(d).toString());
assertEquals("0.0",a.ComplexDiv(e).toString());
}
}
测试结果:
将测试好的代码push至伙伴的码云并git log
- 3.重构
对代码进行如下重构
重写方法加上@Override进行注解
在代码前添加创建者的相关信息
方法名、参数名、成员变量、局部变量都统一使用LowerCamelCase,必须遵从驼峰形式,重构前提示
重构后代码:
/**
* ComplexWZH
* @author 林郅聪
* @date 2019/5/1
*/
package Experiment;
@SuppressWarnings({"ALL", "AlibabaLowerCamelCaseVariableNaming"})
public class ComplexWZH {
@SuppressWarnings("AlibabaLowerCamelCaseVariableNaming")
double realPart;
double imagePart;
public ComplexWZH() {}
public ComplexWZH(double r, double i) {
realPart = r;
imagePart = i;
}
public double getRealPart() {
return realPart;
}
public double getImagePart() {
return imagePart;
}
@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj == null) {
return false;
}
if(getClass() != obj.getClass()) {
return false;
}
if(!(obj instanceof ComplexWZH)) {
return false;
} else {
ComplexWZH complexWZH = (ComplexWZH) obj;
if (complexWZH.imagePart == ((ComplexWZH) obj).imagePart) {
return true;
}
if (complexWZH.realPart == ((ComplexWZH) obj).realPart) {
return true;
}
}
return false;
}
@Override
public String toString() {
String str = "";
if (realPart == 0&& imagePart == 0) {
str = "0.0";
} else if (realPart == 0&& imagePart != 0) {
str = imagePart + "" + "i";
} else if (realPart != 0&& imagePart == 0) {
str = realPart + "";
} else if (realPart !=0&& imagePart > 0) {
str = realPart + "" + "+" + imagePart + "i";
} else if (realPart !=0&& imagePart < 0) {
str = realPart + "" + imagePart + "i";
}
return str;
}
public ComplexWZH complexAdd(ComplexWZH a) {
return new ComplexWZH(realPart + a.getRealPart(), imagePart + a.getImagePart());
}
public ComplexWZH complexSub(ComplexWZH a) {
return new ComplexWZH(realPart - a.getRealPart(), imagePart - a.getImagePart());
}
public ComplexWZH complexMulti(ComplexWZH a) {
return new ComplexWZH(realPart *a.getRealPart() - imagePart *a.getImagePart(), realPart *a.getImagePart() + imagePart *a.getRealPart());
}
public ComplexWZH complexDiv(ComplexWZH a) {
if(a.getRealPart() == 0&&a.getImagePart() == 0) {
System.out.println("除数不能为0");
return new ComplexWZH();
}
else {
return new ComplexWZH((realPart *a.getRealPart() - imagePart *a.getImagePart())/(a.getRealPart()*a.getRealPart()-a.getImagePart()*a.getImagePart()),(realPart *a.getImagePart() + imagePart *a.getRealPart())/(a.getRealPart()*a.getRealPart()-a.getImagePart()*a.getImagePart()));
}
}
}
-4.Java密码学相关内容
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平台上进行用户身份鉴别的功能。凯撒密码
对凯撒密码进行了验证,并对代码进行了重构
运行结果
重构后结果
Java对称加密—DES算法
密钥的产生
加密Hello World
对密文进行解密
Java非对称加密—RSA算法
公私钥的产生
加密Hello World
对密文进行解密
使用密钥协定创建共享密钥—DH算法
A和B分别产生自己的公钥和私钥
创建共享密钥
Java摘要算法—MD5
三、实验中遇到的问题
- 问题:在实现DH算法时,希望把用户A和B的产生的公钥和私钥分别存放至两个目录中,但实际上不能做到放至同一个包下,在out文件中运行时会自动存放至根目录下,无法真正实现博客中所说的个人用户的管理
- 解决方法:暂无
四、伙伴评价
伙搭档学习热情很高,一直督促我学习,过程中也帮助我很多,是很好的学习伙伴。
五、码云链接
2018-2019-2 20175214 实验三《敏捷开发与XP实践》实验报告的更多相关文章
- 20165230 《Java程序设计》实验三 敏捷开发与XP实践 实验报告
20165230 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: 指导教 ...
- 20175212童皓桢 实验三敏捷开发与XP实践实验报告
20175212童皓桢 实验三敏捷开发与XP实践实验报告 实验内容 XP基础 XP核心实践 相关工具 实验步骤 一.Code菜单功能的研究 Move Line/statement Down/Up:将某 ...
- 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告
20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...
- 20162311 实验三 敏捷开发与XP实践 实验报告
20162311 实验三 敏捷开发与XP实践 实验报告 实验内容 一.研究学习IDEA中的Code菜单 使用Code ->Reformate Code功能将以下代码格式化 public clas ...
- 20165308实验三 敏捷开发与XP实践实验报告
实验三 敏捷开发与XP实践实验报告 实验目的 安装 alibaba 插件,解决代码中的规范问题.再研究一下Code菜单,找出一项让自己感觉最好用的功能. 在码云上把自己的学习搭档加入自己的项目中,确认 ...
- 20155207王雪纯 《Java程序设计》实验三 敏捷开发与XP实践 实验报告
20155207王雪纯 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...
- 20155220 实验三 敏捷开发与XP实践 实验报告
20155220 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...
- # 20155224 实验三 敏捷开发与XP实践 实验报告
20155224 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...
- 20155226 实验三 敏捷开发与XP实践 实验报告
20155226 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...
- 20155311 实验三 敏捷开发与XP实践 实验报告
20155311 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 xp核心工具 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...
随机推荐
- java通过正则进行语法分析实现表达式的逻辑判断和复杂计算实现
首先功能展示: 相关功能实现,实现功能类似js,弱语言类型: 1.核销语法解析使用正则校验和匹配实现处理,每一行是一个完整表达式 2.有系统变量使用,内置的变量可直接获取值进行相关逻辑和条件计算 3. ...
- 《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版
(判断一个元素均不相同的序列是否为一个BST的LRD) 书中方法:首先对于二叉搜索树,左子树中的所有元素小于根节点小于右子树中的所有元素,然后后序遍历序列最后一个元素是根节点,这是我们已知的条件.这道 ...
- springboot工程启动时,报错:No bean named 'shiroFilter' available
在启动Springboot项目时,报错:org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ' ...
- 51nod1769 Clarke and math 2
题目 实际上就是要求\(f*I^k\). 因为\(I^k\)是一个积性函数,所以我们只需要考虑如何求\(I^k(p^a)\). 把这个东西转化成一个长度为\(k\)的序列,每一位是\(\frac{i_ ...
- [LeetCode] 47. 全排列 II
题目链接 : https://leetcode-cn.com/problems/permutations-ii/ 题目描述: 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [ ...
- Python 入门之常用运算符
Python 入门之常用运算符 Python中的运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算 1.常用运算符: (1)算数运算符: + - * / %(取余(模) ...
- 微信小程序css篇----flex模型
一.Flex布局是什么? Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局. .box{displ ...
- python email模块
python email模块 官方文档 email模块 电子邮件包是一个用于管理电子邮件消息的库.它的特殊设计不用于向SMTP (RFC 2821).NNTP或其他服务器发送任何电子邮件消息;这些是模 ...
- Python核心技术与实战——四|Python黑箱:输入与输出
抽象的看,Python程序可以被看成一个黑箱:通过输入流将数据送达,经过处理后在输入,也就是说具备了一个图灵机运作的必要条件. 输入输出基础 最简单的输入是来自键盘的操作 name = input(' ...
- 组件通信 eventtBus
平级组件的通信 一个全局发布订阅模式,它是挂载到全局的 <!DOCTYPE html> <html lang="en"> <head> < ...