2018-2019-2-20175204 张湲祯 实验三 《敏捷开发与XP实践》实验报告
实验三 Java面向对象程序设计
一.实验内容:
1.XP基础
2.XP核心实践
3.相关工具
4.编码标准:在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下Code菜单,找出一项让自己感觉最好用的功能。提交截图,加上自己学号水印。
5.搭档代码检验:在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后,下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例,测试成功后git add .; git commit -m "自己学号 添加内容";git push;
6.重构:完成重构内容的练习,下载搭档的代码,至少进行三项重构.
二.实验步骤
(一)编码标准
1.相关标准
具有说明性的名字
清晰的表达式
直截了当的控制流
可读的代码和注释
实现这些内容时一致所使用某些规则和惯用法
2.安装alibaba插件
参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD 安装alibaba 插件,解决代码中的规范问题。
打开Settings ->Plugins
在搜索框输入alibaba
即可看到Alibaba Java Code Guidelines
插件,点击Install进行安装,然后重启IDE生效:
3.在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下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));
}
}
4.使用:在项目名称上单击右键,在弹出菜单上选择编码规约扫描:
5.根据报错内容进行规范修改。
6.code相关功能
Override Methods
( 重写覆盖方法 ) Ctrl + O
Implements Methods
( 实现接口方法 ) Ctrl + I
Gengrate
( 用于生成Construct、Getter/Setter、toString等) Alt + Insert
Surround With
(使用if-else、for、while等语句包装代码段) Ctrl+Alt+T
SmartType
( 智能选择并实现 ) Ctrl + Shift + 空格
Cyclic Expand Word
( 循环往上选择单词 ) Alt + /
Cyclic Expand Word
(Backwrad)( 循环往下选择单词 ) Alt + Shift + /
Expand
( 方法展开 ) Ctrl + 加号
Collapse
( 方法折叠 ) Ctrl + 减号
Expand Recursively
( 同上,方法展开 ) Ctrl + Alt + 加号
Collapse Recursively
( 同上,方法折叠 ) Ctrl + Alt + 减号
Expand All
( 全部方法展开 ) Ctrl + Shift + 加号
Collapse All
( 全部方法折叠 ) Ctrl + Shift + 减号
Expand doc comments
( 展开Java doc注释 )
Collapse doc comments
( 折叠Java doc注释 )
Insert Live Template
( 选择Live Templates模板 ) Ctrl + J
Surround with Live Template
( 选择Live Templates模板 ) Ctrl + Alt + J
Comment with Line Comment
( 行注释 ) Ctrl + /
Comment with Block Comment
( 块注释 ) Ctrl + Shift + /
Reformat Code
( 格式化代码 ) Ctrl + Alt + L
Show Reformat File Dialog
( 弹出格式化弹框 ) Ctrl + Alt + Shift + L
Optimize Imports
( 去除未引用的包导入声明 ) Ctrl + Alt + O
Rearrange Code
( 重新整理代码 )
(二)搭档代码进行测试
1.将搭档拉入自己码云项目
2.下载搭档代码
public class Complex {
double RealPart;
double ImagePart;
public Complex() {}
public Complex(double R,double I) {
RealPart = R;
ImagePart = I;
}
public double getRealPart() {
return RealPart;
}
public double getImagePart() {
return ImagePart;
}
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
if(!(obj instanceof Complex))
return false;
else {
Complex complex = (Complex) obj;
if (complex.ImagePart == ((Complex) obj).ImagePart)
return true;
if (complex.RealPart == ((Complex) obj).RealPart)
return true;
}
return false;
}
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 Complex ComplexAdd(Complex a) {
return new Complex(RealPart + a.getRealPart(),ImagePart + a.getImagePart());
}
public Complex ComplexSub(Complex a) {
return new Complex(RealPart - a.getRealPart(),ImagePart - a.getImagePart());
}
public Complex ComplexMulti(Complex a) {
return new Complex(RealPart*a.getRealPart() - ImagePart*a.getImagePart(),RealPart*a.getImagePart() + ImagePart*a.getRealPart());
}
public Complex ComplexDiv(Complex a) {
if(a.getRealPart() == 0&&a.getImagePart() == 0) {
System.out.println("除数不能为0");
return new Complex();
}
else
return new Complex((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()));
}
}
3.对搭档代码进行测试
测试代码
* Demo class
*
* @author 20175204 zyz
* @date 2019/4/29
*/
import junit.framework.TestCase;
import org.junit.Test;
import org.testng.annotations.ITestAnnotation;
public class wzhComplexTest extends TestCase {
wzhComplex a = new wzhComplex(2.0,5.0);
wzhComplex b = new wzhComplex(1.0,-4.0);
wzhComplex c = new wzhComplex(-3.0,2.0);
wzhComplex d = new wzhComplex(-4.0,-3.0);
wzhComplex e = new wzhComplex(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 testwzhComplexAdd() throws Exception {
assertEquals("3.0+1.0i",a.wzhComplexAdd(b).toString());
assertEquals("-7.0-1.0i",c.wzhComplexAdd(d).toString());
assertEquals("-4.0-3.0i",d.wzhComplexAdd(e).toString());
}
@Test
public void testwzhComplexSub() throws Exception {
assertEquals("1.0+9.0i",a.wzhComplexSub(b).toString());
assertEquals("1.0+5.0i",c.wzhComplexSub(d).toString());
assertEquals("-3.0+2.0i",c.wzhComplexSub(e).toString());
}
public void testwzhComplexMulti() throws Exception {
assertEquals("22.0-3.0i",a.wzhComplexMulti(b).toString());
assertEquals("18.0+1.0i",c.wzhComplexMulti(d).toString());
assertEquals("0.0",b.wzhComplexMulti(e).toString());
}
public void testwzhComplexDiv() throws Exception {
assertEquals("-1.4666666666666666+0.2i",a.wzhComplexDiv(b).toString());
assertEquals("2.5714285714285716+0.14285714285714285i",c.wzhComplexDiv(d).toString());
assertEquals("0.0",a.wzhComplexDiv(e).toString());
}
}
(三)对搭档代码进行重构
1.对代码进行规约扫描
2.对代码不规范问题加以改正
1.单语句时if else 也需要加大括号
2.对于所覆写的方法,必须加@override进行注解
3.方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase,必须遵从驼峰形式
4.类需要添加创建者信息
3.重构之后的代码
* Demo class
*
* @author 20175204 zyz
* @date 2019/4/29
*/
@SuppressWarnings("ALL")
public class wzhComplex {
double RealPart;
double ImagePart;
public wzhComplex() {}
public wzhComplex(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 wzhComplex)) {
return false;
} else {
wzhComplex wzhComplex = (wzhComplex) obj;
if (wzhComplex.ImagePart == ((wzhComplex) obj).ImagePart) {
return true;
}
if (wzhComplex.RealPart == ((wzhComplex) 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 wzhComplex wzhComplexAdd(wzhComplex a) {
return new wzhComplex(RealPart + a.getRealPart(),ImagePart + a.getImagePart());
}
public wzhComplex wzhComplexSub(wzhComplex a) {
return new wzhComplex(RealPart - a.getRealPart(),ImagePart - a.getImagePart());
}
public wzhComplex wzhComplexMulti(wzhComplex a) {
return new wzhComplex(RealPart*a.getRealPart() - ImagePart*a.getImagePart(),RealPart*a.getImagePart() + ImagePart*a.getRealPart());
}
public wzhComplex wzhComplexDiv(wzhComplex a) {
if(a.getRealPart() == 0&&a.getImagePart() == 0) {
System.out.println("除数不能为0");
return new wzhComplex();
}
else {
return new wzhComplex((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()));
}
}
}
(四)Java密码学相关内容的学习
1.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平台上进行用户身份鉴别的功能。
2.体验加解密---凯撒密码
1.凯撒密码的加密算法:
明文记为m,密文记为c,加密变换记为E(k1,m)(其中k1为密钥),解密变换记为D(k2,m)(k2为解密密钥)(在这里k1=k2,不妨记为k)。凯撒密码的加密过程可记为如下一个变换:
c≡m+k mod n (其中n为基本字符个数)
同样,解密过程可表示为:
m≡c+k mod n (其中n为基本字符个数)
2.重构算法代码
* Demo class
*
* @author 20175204 zyz
* @date 2019/5/4
*/
public class kaisa {
public static void main(String[] args) throws Exception{
String s=args[0];
int key=Integer.parseInt(args[1]);
String es="";
for(int i=0;i<s.length( );i++)
{ char c=s.charAt(i);
if(c>='a' && c<='z')
/** 是小写字母 */
{ c+=key%26;
/**移动key%26位 */
if(c<'a') {
c+=26;
/**向左超界 */
}
if(c>'z') {
c-=26;
/**向右超界 */
}
}
else if(c>='A' && c<='Z')
/**是大写字母 */
{ c+=key%26;
if(c<'A') {
c+=26;
}
if(c>'Z') {
c-=26;
}
}
es+=c;
}
System.out.println(es);
}
}
3.Java对称加密-DES算法
(1) 获取密钥生成器
KeyGenerator kg=KeyGenerator.getInstance("DESede");
(2) 初始化密钥生成器
kg.init(168);
(3) 生成密钥
SecretKey k=kg.generateKey( );
(4) 通过对象序列化方式将密钥保存在文件中
FileOutputStream f=new FileOutputStream("key1.dat");
ObjectOutputStream b=new ObjectOutputStream(f);
b.writeObject(k);
* Demo class
*
* @author 20175204 zyz
* @date 2019/5/4
*/
import java.io.*;
import javax.crypto.*;
public class Skey_DES{
public static void main(String args[])
throws Exception{
KeyGenerator kg=KeyGenerator.getInstance("DESede");
kg.init(168);
SecretKey k=kg.generateKey( );
FileOutputStream f=new FileOutputStream("key1.dat");
ObjectOutputStream b=new ObjectOutputStream(f);
b.writeObject(k);
}
}
(5) 获取密钥
FileInputStream f=new FileInputStream("key1.dat");
ObjectInputStream b=new ObjectInputStream(f);
Key k=(Key)b.readObject( );
(6) 获取主要编码格式
byte[ ] kb=k.getEncoded( );
(7) 保存密钥编码格式
FileOutputStream f2=new FileOutputStream("keykb1.dat");
f2.write(kb);
* Demo class
*
* @author 20175204 zyz
* @date 2019/5/4
*/
import java.io.*;
import java.security.*;
public class Skey_kb{
public static void main(String args[]) throws Exception{
FileInputStream f=new FileInputStream("key1.dat");
ObjectInputStream b=new ObjectInputStream(f);
Key k=(Key)b.readObject( );
byte[ ] kb=k.getEncoded( );
FileOutputStream f2=new FileOutputStream("keykb1.dat");
f2.write(kb);
// 打印密钥编码中的内容
for(int i=0;i<kb.length;i++){
System.out.print(kb[i]+",");
}
}
}
(8)加密HelloWorld
* Demo class
*
* @author 20175204 zyz
* @date 2019/5/4
*/
import java.io.*;
import java.security.*;
import javax.crypto.*;
public class SEnc{
public static void main(String args[]) throws Exception{
String s="Hello World!";
FileInputStream f=new FileInputStream("key1.dat");
ObjectInputStream b=new ObjectInputStream(f);
Key k=(Key)b.readObject( );
Cipher cp=Cipher.getInstance("DESede");
cp.init(Cipher.ENCRYPT_MODE, k);
byte ptext[]=s.getBytes("UTF8");
for(int i=0;i<ptext.length;i++){
System.out.print(ptext[i]+",");
}
System.out.println("");
byte ctext[]=cp.doFinal(ptext);
for(int i=0;i<ctext.length;i++){
System.out.print(ctext[i] +",");
}
FileOutputStream f2=new FileOutputStream("SEnc.dat");
f2.write(ctext);
}
}
(9)对密文进行解密
* Demo class
*
* @author 20175204 zyz
* @date 2019/5/4
*/
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public class SDec{
public static void main(String[] args) throws Exception{
// 获取密文
FileInputStream f=new FileInputStream("SEnc.dat");
int num=f.available();
byte[ ] ctext=new byte[num];
f.read(ctext);
// 获取密钥
FileInputStream f2=new FileInputStream("keykb1.dat");
int num2=f2.available();
byte[ ] keykb=new byte[num2];
f2.read(keykb);
SecretKeySpec k=new SecretKeySpec(keykb,"DESede");
// 解密
Cipher cp=Cipher.getInstance("DESede");
cp.init(Cipher.DECRYPT_MODE, k);
byte []ptext=cp.doFinal(ctext);
// 显示明文
String p=new String(ptext,"UTF8");
System.out.println(p);
}
}
4.Java非对称加密-RSA算法
1.公私钥的产生
2.加密
3.解密
5.使用密钥协定创建共享密钥
1.创建DH公钥和私钥
2.创建共享密钥
6.Java摘要算法- MD5
(四)实验体会
通过本次实验,对idea相关功能有所更多的了解,也对所编写的代码有了更好的规范,更加符合相关标准,养成一个良好的编程习惯。