2017-2018-2 20165318 实验三《Java面向对象程序设计》实验报告
2017-2018-2 20165318 实验三《Java面向对象程序设计》实验报告
一、实验报告封面
课程:Java程序设计 班级:1653班 姓名:孙晓暄 学号:20165318
指导教师:娄嘉鹏 实验日期:2018年4月27日
实验时间:13:45 - 3:25 实验序号:实验三
实验名称:敏捷开发与XP实践
实验内容:
- XP基础
- XP核心实践
- 相关工具
实验要求:
- 没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
- 完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
- 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
二、实验内容及步骤
目录
(一)编码标准
- 安装alibaba 插件,解决代码中的规范问题。具体流程如下:
打开
Settings
->Plugins
->Browse
repositories
...
在搜索框输入
alibaba
即可看到Alibaba Java Code Guidelines
插件,点击Install
进行安装,然后重启IDE生效:使用比较简单:在项目名称上单击右键,在弹出菜单上选择
编码规约扫描
:
出现下图内容:
不规范的地方,有中文提示并且定位到了行,alibaba把问题分为block/critical/major
三个等级,有些规则可以一键修复。
Java中的一般的命名规则有:
- 要体现各自的含义
- 包、类、变量用名词
- 方法名用动宾
- 包名全部小写,如:io,awt
- 类名第一个字母要大写,如:HelloWorldApp
- 变量名第一个字母要小写
,如:userName - 方法名第一个字母要小写:setName
规范后的代码格式
import java.util.concurrent.Callable;
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中使用工具(Code->Reformate Code)格式化代码,并学习Code菜单的功能
IDEA中的Code菜单如下:
几个比较常用的功能总结如下:
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,去除不必要的importsMove Line/statement Down/Up
:将某行、表达式向下、向上移动一行
(二)敏捷开发与XP
结对编程是XP中的重要实践。在结对编程模式下,一对程序员肩并肩、平等地、互补地进行开发工作。他们并排坐在一台电脑前,面对同一个显示器,使用同一个键盘、同一个鼠标一起工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起做单元测试,一起做集成测试,一起写文档等。
--引用自实验三 敏捷开发与XP实践
任务二:下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例
搭档的Complex代码如下:
需要测试的方法有:ComplexAdd()
,ComplexSub()
,ComplexMulti()
,ComplexDiv()
;
编写测试代码并上传到搭档码云项目上:
import junit.framework.TestCase;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Created by sxx on 2018/4/26.
*/
public class ComplexTest 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);
@Test
public void testgetRealpart() throws Exception{
assertEquals(0.0,Complex.getRealPart(0.0));
assertEquals(-1.0,Complex.getRealPart(-1.0));
assertEquals(1.0,Complex.getRealPart(1.0));
}
@Test
public void testgetImagePart() throws Exception{
assertEquals(2.0,Complex.getImagePart(2.0));
assertEquals(-1.0,Complex.getImagePart(-1.0));
assertEquals(2.0,Complex.getImagePart(2.0));
}
@Test
public void testComplexAdd() 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());
}
@Test
public void testComplexSub() 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());
}
@Test
public void testComplexMulti() 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());
}
@Test
public void testComplexDiv() 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());
}
}
(三)重构
重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。
我们要修改软件,万变不离其宗,无非就是四种动机:
- 增加新功能;
- 原有功能有BUG;
- 改善原有程序的结构;
- 优化原有系统的性能 。
需要重构的地方:
代码重复、方法过长、参数列过长、条件逻辑过度复杂、分支语句
一个完整的重构流程包括:
- 从版本控制系统代码库中Check out code
- 读懂代码(包括测试代码)
- 发现bad smell
- Refactoring
- 运行所有的Unit Tests
- 往代码库中Check in code
任务三:下载搭档的代码,至少进行三项重构
如上代码存在以下几个问题:
- 类名不符合命名规则;
- 类中变量没有被封装;
- 方法没有被封装;
程序修改入下:
练习
任务四:以结对的方式完成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 class Caesar {
public static void main(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 new EadException(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 class EadException extends Exception{
String message;
public EadException(String sourceString){
message = "The input is not correct";
}
public String warnMess(){
return message;
}
}
最初代码:
运行结果:
代码规范截图:
重构截图:
除了实现凯撒密码算法之外,我还运行了其他算法:
DES算法
- 文件key1.dat中生成的密钥
- 保存密钥编码并打印
- 用DESede加密
- 用DESede解密
RSA加密
RSA解密
MD5算法
(五)实验过程中遇到的问题及解决方法
Q1:在做重构相关内容的实验时,由于对重构的内容并不是非常了解,小伙伴的代码也大都是书上的代码,找了好多,都没有发现太多需要重构的地方。
解决方法:在学习了实验三 敏捷开发与XP实践——娄老师的博客,以及参考了Java代码重构的几种模式详解
java 代码重构(系列讲解)后,我再次查看伙伴的代码,找到了几处可以规范的地方。Q2:在编译运行MD5算法时,出现以下问题
解决方法:通过alibaba编码扫描,我发现是代码中有一处“;”使用成了中文的“;”导致编码错误,改正该错误后,代码就可以正常运行了。
(六)实验体会与总结
通过本次实验,我主要学习到了代码标准,代码重构,Java中密码学算法等内容。
代码标准和重构的学习,使我注意到自己之前编写代码时的很多不规范之处,而且通过使用alibaba的实时编码扫描,使我在编写代码的同时,注意规范代码的标准格式,使写出的代码更加明了可观,类名和变量名的规范,也使我在编写代码时,减少了许多不必要的注释。
有了之前四则运算结对编程的锻炼,在本次实验过程中,我与我的小伙伴合作的比较融洽,节约了一些不必要的时间,结对编程效率有了一定的提高。
代码托管
PSP需求分析
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 10min | 6% |
设计 | 20min | 11% |
代码实现 | 70min | 40% |
测试 | 20min | 13% |
分析总结 | 50min | 30% |
参考资料
Java 密码学算法——娄老师的博客
实验三 敏捷开发与XP实践——娄老师的博客
Java代码重构的几种模式详解
java 代码重构(系列讲解)
IntelliJ IDEA使用技巧一览表
返回目录
2017-2018-2 20165318 实验三《Java面向对象程序设计》实验报告的更多相关文章
- 20145208 实验三 Java面向对象程序设计
20145208 实验三 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...
- 实验二Java面向对象程序设计实验报告(2)
实验二 Java面向对象程序设计 实验概述: 课程:程序设计与数据结构 班级:1623班 姓名: 邢天岳 学号:2309 指导老师:娄老师 王老师 实验日期:2017.4.16 实验名称: Java面 ...
- 20145213《Java程序设计》实验二Java面向对象程序设计实验报告
20145213<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装,继承,多态 初步掌握UML建模 熟悉S.O. ...
- 20145206《Java程序设计》实验二Java面向对象程序设计实验报告
20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...
- 20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告
20145308刘昊阳 <Java程序设计>实验二 Java面向对象程序设计 实验报告 实验名称 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面相对象三要素:封 ...
- 20162311 实验二 Java面向对象程序设计 实验报告
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
- 实验二 Java面向对象程序设计实验报告
实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...
- 20145326《Java程序设计》实验二Java面向对象程序设计实验报告
20145326<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...
- 20155217 实验二 Java面向对象程序设计 实验报告
20155217 实验二 Java面向对象程序设计 实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模 ...
- 20145219 《Java程序设计》实验二 Java面向对象程序设计实验报告
20145219 <Java程序设计>实验二 Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S. ...
随机推荐
- 浅谈JSONP (vue-jsonp组件 XXXtoken:报错处理)
由于同源策略的存在,特别是前后端两个项目存在的情况下,客户端访问服务端必然存在跨域的情况,而使用jsonp,则不存在这个问题. 主要是因为jsonp是在页面中插入一段js代码,而请求返回的也是一段js ...
- Shiro眼皮下玩ajax,玩出302 Found
2017/06/14这一天,是我玩Shiro安全框架最刻骨铭心的一天.因为Shiro今天给我深深的补了一刀,在这儿我也给各位补一刀吧,其实问题很简单,解决方式也极其简单,只是给各位分享一下这个错误,纯 ...
- Vue脚手架
https://cli.vuejs.org/zh/guide/ Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供: 通过 @vue/cli 搭建交互式的项目脚手架. 通过 @vu ...
- shell_语法
1.运算符: 1.基本语法:$((运算式))或$[运算式] 2.expr + n // 注意运算符中间有空格 再用expr时要加 ` ` 号,* 号加转义字符\ \* ,表示乘 2.判断语句 [ c ...
- Docker:集装箱式“运输”在软件上的实现
Docker是由PaaS提供商dotCloud在2013年年初创建的一款开源应用引擎,Docker可以自动将任何应用打包成轻量.可移植.自包涵的容器引擎.开发者构建的应用可以一次构建全平台运行,包括本 ...
- 用MSBuild和Jenkins搭建持续集成环境(1)[收集]
你或其他人刚刚写完了一段代码,提交到项目的版本仓库里面.但等一下,如果新提交的代码把构建搞坏了怎么办?万一出现编译错误,或者有的测试失败了,或者代码不符合质量标准所要求的底限,你该怎么办? 最不靠谱的 ...
- JS之ClassName属性使用
一.style与className属性的对比 在前面的style属性学习中,知道了通过style属性可以控制元素的样式,从而实现了行为层通过DOM的style属性去干预变现层显示的目地,但是这种就是不 ...
- Django中Ajax提交数据的CSRF问题
错误信息: Forbidden (CSRF token missing or incorrect.): 什么是CSRF: django为用户实现防止跨站请求伪造的功能,通过中间件 django.mid ...
- css选取table元素的第一列
table tr td:first-child
- 在JavaScript文件中用jQuery方法实现日期时间选择功能
JavaScript Document $(document).ready(function(e) { 在文本框里面显示当前日期 var date = new Date(); var nian = d ...