JAVA算法设计实验_2017-2018-2 实验三 《Java面向对象程序设计》实验报告

一、实验报告封面

课程:Java程序设计        班级:1652班

指导教师:娄嘉鹏                              实验日期:2018年4月27日

实验时间:13:45 - 15:25                    实验序号:实验三

实验名称:敏捷开发与XP实践

实验内容:

XP基础

XP核心实践

相关工具

实验要求:

没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程

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

严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。

二、实验内容及步骤

(一)编码标准

安装alibaba 插件,解决代码中的规范问题。具体流程如下:

打开 Settings -> Plugins -> Browse repositories...

92216f4d2cd273d9d2ee5b553e14158e.png

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

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

7298f252da63c42ae78a76b6ba14baa0.png

出现下图内容:

cad0e8ef9c97ab02ac824fb4f8cdaa12.png

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

Java中的一般的命名规则有:

要体现各自的含义

包、类、变量用名词

方法名用动宾

包名全部小写,如:io,awt

类名第一个字母要大写,如:HelloWorldApp

变量名第一个字母要小写

,如:userName

方法名第一个字母要小写:setName

规范后的代码格式

import java.util.concurrent.Callable;public classCodeStandard {public static voidmain(String[] args) {

StringBuffer buffer= newStringBuffer();

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中使用工具(Code->Reformate Code)格式化代码,并学习Code菜单的功能

IDEA中的Code菜单如下:

c475b8f642303709bde153fc18edbe53.png

几个比较常用的功能总结如下:

Override Methods(Ctrl+O):重载基本类的方法;

Implement Methods(Ctrl+I):完成当前类 implements 的(或者抽象基本类的)接口的方法;

Generate(Alt+Insert):创建类里面任何字段的 getter 与 setter 方法;

Surround With(Ctrl+Alt+T):使用if-else、try-catch、do-while等包装代码段;

Insert Live Template(Ctrl-J):执行一些记不起来的 Live Template 缩写;

Comment with Line Comment(Ctrl+斜杠)/Comment with Block Comment(Ctrl+Shift+斜杠):用 Ctrl+斜杠 与 Ctrl-Shift-/ 来注释(或反注释)代码行与代码块。 用Ctrl+斜杠单行注释标记(“ //… ”)来注释(或反注释)当前行或者选择地代码块。而 Ctrl+Shift+斜杠则可以用块注释标记(“ /* */”)把所选块包围起来。要反注释一个代码块就在块中任何一个地方按 Ctrl+Shift+斜杠 即可;

Reformat Code(Ctrl+Alt+L):将代码按标准格式缩进;

show reformat file dialog:按照格式自动对齐

Optimize imports:可以优化imports,去除不必要的imports

Move Line/statement Down/Up:将某行、表达式向下、向上移动一行

(二)敏捷开发与XP

任务二:下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例

搭档的Complex代码如下:

1bd2777a242867e10db731dccd82ac6e.png

需要测试的方法有:ComplexAdd(),ComplexSub(),ComplexMulti(),ComplexDiv();

编写测试代码并上传到搭档码云项目上:

import junit.framework.TestCase;

import org.junit.Test;

importstatic org.junit.Assert.*;/**

* Created by sxx on 2018/4/26.*/

public classComplexTest extends TestCase {

Complex c1= new Complex(0.0, 2.0);

Complex c2= new Complex(-1.0, -1.0);

Complex c3= new Complex(1.0,2.0);

@Testpublic voidtestgetRealpart() throws Exception{

assertEquals(0.0,Complex.getRealPart(0.0));

assertEquals(-1.0,Complex.getRealPart(-1.0));

assertEquals(1.0,Complex.getRealPart(1.0));

}

@Testpublic voidtestgetImagePart() throws Exception{

assertEquals(2.0,Complex.getImagePart(2.0));

assertEquals(-1.0,Complex.getImagePart(-1.0));

assertEquals(2.0,Complex.getImagePart(2.0));

}

@Testpublic voidtestComplexAdd() throws Exception{

assertEquals("-1.0+1.0i",c1.ComplexAdd(c2).toString());

assertEquals("1.0+4.0i",c1.ComplexAdd(c3).toString());

assertEquals("0.0+1.0i",c2.ComplexAdd(c3).toString());

}

@Testpublic voidtestComplexSub() throws Exception{

assertEquals("1.0+3.0i",c1.ComplexSub(c2).toString());

assertEquals("-1.0",c1.ComplexSub(c3).toString());

assertEquals("-2.0-3.0i",c2.ComplexSub(c3).toString());

}

@Testpublic voidtestComplexMulti() throws Exception{

assertEquals("2.0-2.0i",c1.ComplexMulti(c2).toString());

assertEquals("-4.0+2.0i",c1.ComplexMulti(c3).toString());

assertEquals("1.0-3.0i",c2.ComplexMulti(c3).toString());

}

@Testpublic voidtestComplexDiv() throws Exception{

assertEquals("-1.0-1.0i",c1.ComplexDiv(c2).toString());

assertEquals("0.4+0.8i",c1.ComplexDiv(c3).toString());

assertEquals("-0.6-0.6i",c2.ComplexDiv(c3).toString());

}

}

d8821dd7cfdf79d0a475e8a53451c5f9.png

(三)重构

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

我们要修改软件,万变不离其宗,无非就是四种动机:

增加新功能;

原有功能有BUG;

改善原有程序的结构;

优化原有系统的性能 。

需要重构的地方:

代码重复、方法过长、参数列过长、条件逻辑过度复杂、分支语句

c492d08b54322d79ed43d19bba2100de.png

一个完整的重构流程包括:

从版本控制系统代码库中Check out code

读懂代码(包括测试代码)

发现bad smell

Refactoring

运行所有的Unit Tests

往代码库中Check in code

任务三:下载搭档的代码,至少进行三项重构

ec2a2d93866354488743e023b50d4a6f.png

如上代码存在以下几个问题:

类名不符合命名规则;

类中变量没有被封装;

方法没有被封装;

练习

任务四:以结对的方式完成Java密码学相关内容的学习,结合重构、git、代码标准等

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平台上进行用户身份鉴别的功能。

进行了学习之后,我与搭档选择了实现凯撒密码的加解密算法,并以结对的方式完成了代码编写的工作。

凯撒密码算法:将字母表中的字母移动一定位置而实现加密。

具体步骤:

(1)根据凯撒密码特性设计算法

(2)传入需要计算的字符串

(3)处理计算结果

伪代码:

定义main方法

传入参数

参数判断,是否有非法输入,若有,抛出异常

进行加解密,大小写区分

输出结果

产品代码:

Caesaar.java

public classCaesar {public static voidmain(String[] args) throws EadException {

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);//自定义异常类

try{

boolean exist= ((c > 64) && (c < 91)) || ((c > 96) && (c < 123) || c == 32 || c == 33);if (exist == false) {throw newEadException(s);

}

}catch(EadException e) {

System.out.println(e.warnMess());

}//小写字母

if (c >= 'a' && c <= 'z') {//移动key%26位

c += 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);

}

}

EadException.java

public classCaesar {public static voidmain(String[] args) throws EadException {

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);//自定义异常类

try{

boolean exist= ((c > 64) && (c < 91)) || ((c > 96) && (c < 123) || c == 32 || c == 33);if (exist == false) {throw newEadException(s);

}

}catch(EadException e) {

System.out.println(e.warnMess());

}//小写字母

if (c >= 'a' && c <= 'z') {//移动key%26位

c += 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);

}

}

运行结果:

cdb950655818e40a7b6366821848e88b.png

除了实现凯撒密码算法之外,我还运行了其他算法:

DES算法

文件key1.dat中生成的密钥

3c3aa5885d6315a1ef1539b16e82ba07.png

保存密钥编码并打印

7ff4fabd8701d281ab30545ab6a78f16.png

用DESede加密

2fab8a35b0191d9bd175a22680f9f4f4.png

用DESede解密

87fbe4e4643a241a07152634daff13ca.png

RSA加密

c5908da8fee71e4f209ed9f3281becc4.png

RSA解密

0cfe86ef159f67d7d3dbe3f1aca91a78.png

MD5算法

1c1a6239b260b79c56c07c401e2408b9.png

(五)实验过程中遇到的问题及解决方法

在做重构相关内容的实验时,由于对重构的内容并不是非常了解,小伙伴的代码也大都是书上的代码,找了好多,都没有发现太多需要重构的地方。

(六)实验体会与总结

通过本次实验,我主要学习到了代码标准,代码重构,Java中密码学算法等内容。

代码标准和重构的学习,使我注意到自己之前编写代码时的很多不规范之处,而且通过使用alibaba的实时编码扫描,使我在编写代码的同时,注意规范代码的标准格式,使写出的代码更加明了可观,类名和变量名的规范,也使我在编写代码时,减少了许多不必要的注释。

有了之前四则运算结对编程的锻炼,在本次实验过程中,我与我的小伙伴合作的比较融洽,节约了一些不必要的时间,结对编程效率有了一定的提高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值