20175221曾祥杰 实验三《敏捷开发与XP实践》
实验三《敏捷开发与XP实践》
实验报告封面
课程:Java程序设计 班级:1752班 姓名:曾祥杰 学号:20175221
指导教师:娄嘉鹏 实验日期:2019年4月30日
实验时间:13:45 - 15:25 实验序号:21
实验名称:敏捷开发与XP实践
一.实验内容
1. XP基础
2. XP核心实践
3. 相关工具
二.实验步骤
第一部分:
要求:参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD 安装alibaba 插件,解决代码中的规范问题。
在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));
}
}
- 首先在IDEA中安装alibaba插件, Settings → Plugins → Marketplace ,然后在搜素栏输入 Alibaba ,即可看到 Alibaba Java Code Guidelines 插件,点击Install进行安装,然后重启IDE生效。
- 使用比较简单:在项目名称上单击右键,在弹出菜单上选择“
编码规约扫描
” - 随后即可
- 随后即可根据报错内容进行规范修改
- 我们可以使用 Code → Reformat Code (或 Ctrl + Alt +L )规范缩进,规范后的代码如下:
- code菜单中,我感觉最好用的功能就是 Move Statement Up 和 Move Statement Down ,整行移动简直不要太好玩(划掉),太方便!
第二部分:
要求:在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后,下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例,测试成功后git add .; git commit -m "自己学号 添加内容";git push;
提交搭档项目git log的截图,包含上面git commit的信息,并加上自己的学号水印信息。
- 首先将搭档拉入自己的项目中:管理→仓库成员管理→管理员→添加仓库成员→邀请用户
- 产生链接
- 邀请成功
- 下载搭档代码
public class Complex {
// 定义属性并生成getter,setter
double RealPart;
double ImagePart; // 定义构造函数
public Complex(){
}
public Complex(double R,double I){
RealPart=R;
ImagePart=I;
} public static double RealPart(double v) {
return 1;
} public static double ImagePart(double v) {
return 0;
} //Override Object
public boolean equals(Complex m){
if(m.RealPart==this.RealPart&&m.ImagePart==this.ImagePart){
return true;
}
else{
return false;
}
}
public String toString(){
if (this.RealPart != 0 && this.ImagePart > 0) {
return this.RealPart + " + " + this.ImagePart + "i";
} else if (this.RealPart != 0 && this.ImagePart == 0) {
return String.valueOf(this.RealPart);
} else if (this.RealPart != 0 && this.ImagePart < 0) {
return this.RealPart + " - " + -this.ImagePart + "i";
} else if (this.RealPart == 0 && this.ImagePart != 0) {
return this.ImagePart + "i";
} else {
return "0";
}
} // 定义公有方法:加减乘除
Complex ComplexAdd(Complex a){
return new Complex(this.RealPart + a.RealPart, this.ImagePart + a.ImagePart);
}
Complex ComplexSub(Complex a){
return new Complex(this.RealPart - a.RealPart, this.ImagePart - a.ImagePart);
}
Complex ComplexMulti(Complex a){
return new Complex(this.RealPart * a.RealPart - this.ImagePart * a.ImagePart,
this.ImagePart * a.RealPart + this.RealPart * a.ImagePart);
}
Complex ComplexDiv(Complex a){
return new Complex((this.ImagePart * a.ImagePart + this.RealPart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart),
(this.RealPart * a.ImagePart - this.ImagePart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart));
}
}
- 测试代码
import junit.framework.TestCase;
import org.junit.Test; public class ComplexTest extends TestCase {
Complex a = new Complex(0.0, 2.0);
Complex b = new Complex(-1.0, -1.0);
Complex c = new Complex(1.0,2.0);
@Test
public void testgetRealPart() throws Exception {
assertEquals(1.0, Complex.RealPart(0.0));
assertEquals(1.0, Complex.RealPart(-1.0));
assertEquals(1.0, Complex.RealPart(1.0));
}
@Test
public void testgetImagePart() throws Exception {
assertEquals(0.0, Complex.ImagePart(2.0));
assertEquals(0.0, Complex.ImagePart(-1.0));
assertEquals(0.0, Complex.ImagePart(2.0));
}
@Test
public void testComplexAdd() throws Exception {
assertEquals("-1.0 + 1.0i", a.ComplexAdd(b).toString());
assertEquals("1.0 + 4.0i", a.ComplexAdd(c).toString());
assertEquals("1.0i", b.ComplexAdd(c).toString());
}
@Test
public void testComplexSub() throws Exception {
assertEquals("1.0 + 3.0i", a.ComplexSub(b).toString());
assertEquals("-1.0", a.ComplexSub(c).toString());
assertEquals("-2.0 - 3.0i", b.ComplexSub(c).toString());
}
@Test
public void testComplexMulti() throws Exception {
assertEquals("2.0 - 2.0i", a.ComplexMulti(b).toString());
assertEquals("-4.0 + 2.0i", a.ComplexMulti(c).toString());
assertEquals("1.0 - 3.0i", b.ComplexMulti(c).toString());
}
@Test
public void testComplexComplexDiv() throws Exception {
assertEquals("-1.0 + 1.0i", a.ComplexDiv(b).toString());
assertEquals("0.8 - 0.4i", a.ComplexDiv(c).toString());
assertEquals("-0.6 - 0.2i", b.ComplexDiv(c).toString());
}
}
- 测试截图:
- 然后虚拟机里 mkdir 20175221zxj 新建文件夹以方便区分, git clone 搭档码云链接 ,将代码推到搭档码云:
- 推送成功截图
第三部分:
要求:完成重构内容的练习,下载搭档的代码,至少进行三项重构,提交重构后代码的截图,加上自己的学号水印。提交搭档的码云项目链接。
- 我们先看看重构的概念:重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。
- 重构中一个非常关键的前提就是“不改变软件外部行为”,它保证了我们在重构原有系统的同时,不会为原系统带来新的BUG,以确保重构的安全。
- 如何保证不改变软件外部行为?重构后的代码要能通过单元测试。
- 如何使其更加易于阅读、易于维护和易于变更 ?设计模式给出了重构的目标。
- -修改软件的四种动机:
①增加新功能;
②原有功能有BUG;
③改善原有程序的结构;
④优化原有系统的性能 。 - -需要重构的地方:
①代码重复;
②方法过长;
③参数列过长;
④条件逻辑过度复杂;
⑤分支语句。 - -一个完整的重构流程包括
①从版本控制系统代码库中Check out code;
②读懂代码(包括测试代码);
③发现bad smell;
④Refactoring;
⑤运行所有的Unit Tests;
⑥往代码库中Check in code。 - 常用使用方法:
- refactor->Rename 给类、包、方法、变量改名字
- refactor->Encapsulate Field 封装
- Source->Generate toString() toString()方法
- refactor->Extract Method 提炼出重复的代码
我继续以搭档的 Complex 代码为例进行重构
代码中存在的问题:
- 许多地方命名时未采用驼峰形式
- 类未添加创建者信息
- 类方法等未遵从javadoc规范
- 重构后代码如下:
/**
* @author 20175221 zxj
* @date 2019/5/1
*/
@SuppressWarnings("ALL")
public class Complex { double realpart;
double imagepart; public Complex() {
} public Complex(double r, double i) {
realpart = r;
imagepart = i;
} public static double realpart(double v) {
return ;
} public static double imagepart(double v) {
return ;
} public boolean equals(Complex m) {
if (m.realpart == this.realpart && m.imagepart == this.imagepart) {
return true;
} else {
return false;
}
} @Override
public String toString() {
if (this.realpart != && this.imagepart > ) {
return this.realpart + " + " + this.imagepart + "i";
} else if (this.realpart != && this.imagepart == ) {
return String.valueOf(this.realpart);
} else if (this.realpart != && this.imagepart < ) {
return this.realpart + " - " + -this.imagepart + "i";
} else if (this.realpart == && this.imagepart != ) {
return this.imagepart + "i";
} else {
return "";
}
} Complex complexAdd(Complex a) {
return new Complex(this.realpart + a.realpart, this.imagepart + a.imagepart);
} Complex complexSub(Complex a) {
return new Complex(this.realpart - a.realpart, this.imagepart - a.imagepart);
} Complex complexmulti(Complex a) {
return new Complex(this.realpart * a.realpart - this.imagepart * a.imagepart,
this.imagepart * a.realpart + this.realpart * a.imagepart);
} Complex complexDiv(Complex a) {
return new Complex((this.imagepart * a.imagepart + this.realpart * a.realpart) / (a.imagepart * a.imagepart + a.realpart * a.realpart),
(this.realpart * a.imagepart - this.imagepart * a.realpart) / (a.imagepart * a.imagepart + a.realpart * a.realpart));
}
}
第四部分:
- 参考 http://www.cnblogs.com/rocedu/p/6683948.html,以结对的方式完成Java密码学相关内容的学习,结合重构,git,代码标准。
- 提交学习成果码云链接和代表性成果截图,要有学号水印。
密码学包括密码编码学(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平台上进行用户身份鉴别的功能。
- 我和我的伙伴使用java语言编写了凯撒密码:
- 编码规范扫描,发现以上错误,开始进行重构,并运行:
- 代码如下:
import java.util.Scanner; /**
* @author 20175221Zxj
* @date 2019/5/2
*/
public class Caeser {
/**
定义密钥字母表
*/
private String alphabet;
/**
定义密钥 key
*/
private int key;
public Caeser(String alphabet, int key) {
// 根据不同的字母表和不同的密钥生成一个新的凯撒算法,达到通用的目的
super();
this.alphabet = alphabet;
this.key = key;
}
public String encode(String from) {
//凯撒加密算法,传入明文字符串,返回一个密文字符串
String to = "";
for (int i = ; i < from.length(); i++) {
to += alphabet.charAt((alphabet.indexOf(from.charAt(i))+key)%alphabet.length());
}
return to;
} public static void main(String[] args) {
Caeser caeser = new Caeser("abcdefghijklmnopqrstuvwxyz", );
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要加密的字符串");
//输入字符串
String str =scanner.nextLine();
//调用加密方法进行加密
String result = caeser.encode(str);
// 得到结果
System.out.print(result);
}
}
实验中遇到的问题
问题1:由于IDEA与老师的版本不一,下载Alibaba找了好一会
问题1解决方案:我下载的IDEA版本 Plugins 后没有 Browse repositories... ,这里应该是 Marketplace ,然后在搜索框输入 alibaba 即可看到插件。
实验体会:
- 这次的实验对我来说还是很有难度的,虽然每一步的教程都有,但由于老师给的教程版本和我的不一样,期间无论是下载东西还是编写代码,都还是出现了很多难题。
- 这一次的实验需要将搭档拉入自己的码云项目,在和伙伴的合作下完成,所以需要两个人配合默契,才能使这次实验完成得高效。
- 通过这次的实验,我学到了如何使代码规范,将代码上传到搭档的码云上,怎样让代码重构,Java中密码算法的实现等内容,收获颇丰。也希望以后的实验也可以做得更好。
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 9min | 5% |
设计 | 18min | 10% |
代码实现 | 90min | 50% |
测试 | 9min | 5% |
分析总结 | 54min | 30% |
20175221曾祥杰 实验三《敏捷开发与XP实践》的更多相关文章
- 20145213《Java程序设计》实验三敏捷开发与XP实践
20145213<Java程序设计>实验三敏捷开发与XP实践 实验要求 1.XP基础 2.XP核心实践 3.相关工具 实验内容 1.敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法 ...
- 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告
20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...
- JAVA课程实验报告 实验三 敏捷开发与XP实践
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:韩玉琪 学号:20135317 成绩: 指导教师:娄嘉 ...
- 20145225《Java程序设计》 实验三 "敏捷开发与XP实践"
20145225<Java程序设计> 实验三 "敏捷开发与XP实践" 实验报告 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 git 上 ...
- 20145215实验三 敏捷开发与XP实践
20145215实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软 ...
- 20145325张梓靖 实验三 "敏捷开发与XP实践"
20145325张梓靖 实验三 "敏捷开发与XP实践" 程序设计过程 实验内容 使用 git 上传代码 git上传中遇到的问题 使用 git 相互更改代码 实现代码的重构 git ...
- 20162311 实验三 敏捷开发与XP实践 实验报告
20162311 实验三 敏捷开发与XP实践 实验报告 实验内容 一.研究学习IDEA中的Code菜单 使用Code ->Reformate Code功能将以下代码格式化 public clas ...
- 2018-2019-20175205 实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告
2018-2019-20175205 实验三敏捷开发与XP实践<Java开发环境的熟悉>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>&l ...
- 20175314 实验三 敏捷开发与XP实践
20175314 实验二 Java面向对象程序设计 一.实验内容 XP基础 XP核心实践 相关工具 二.实验步骤 (一)代码格式化 创建"175314.exp3"项目,在该项目下创 ...
- #实验三 敏捷开发与XP实践---实验报告
一.实验三 敏捷开发与XP实践-1 1.实验要求 -实验三 敏捷开发与XP实践 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成I ...
随机推荐
- Mybatis-学习笔记(4)1对1、1对多、多对多
1.1对1 有2种方式对内嵌Bean设值: 1>关联查询就一条语句.使用association关键字,直接将嵌套对象的映射表的字段赋值内嵌对象. <association property ...
- Javascript的是三种字符串连接方式
第一种:用连接符“+”连接字符串 str="a"; str+="b"; 这种方法相对以下两种,最便捷快速.建议100字符以下的连接使用这种连接方式. 第二种:以 ...
- C#.NET、Power BI、数据挖掘
阅读目录 1.采集目目标特点与分析 2.方案第一版-Low到爆,别笑话 3.碰壁后的第二版方案 4.最终方案第三版 5.总结 说起采集,其实我是个外行,以前拔过阿里巴巴的客户数据,在我博客的文章:C# ...
- 为ASP.NET按钮(Button)添加确认对话框
http://www.cnblogs.com/blodfox777/articles/1261303.html Button有两个点击事件: onclick 触发服务端事件,脚本为c#或VB.NET ...
- 【问题解决方案】Centos操作文件vim-No write since last change (add ! to override)
参考链接 CSDN:Centos 7 操作文件No write since last change (add ! to override) 问题描述: :q或者:wq退出失败,显示如No write ...
- 解决stanfordnlp一直运行不报错也没有结果
最近学习stanfordnlp,当运行程序时,发现程序一直没有反应,上网查询说是内存不够,但是本地电脑是8g内存.后来重新下载了所需文件,问题解决.
- Excel批量插入的SQL Server
首先新建一个WPF的项目,名为ExcelToServerDemo 到Nuget去安装NPOI的Nuget包,点击安装即可,会自动引用项目. 新建一个Student的表格,有名字,年龄,性别,地址,以及 ...
- 解决arcgis10.5直连postgresql报错
软件版本: arcgis10.5 postgresql9.5.9 最近使用desktop直连postgresql,已经拷贝了类库文件到desktop及pgsql配置完成的前提下,但还是报以下错误: 解 ...
- 自己制作 Android Vector Asset 矢量图
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/c5138891/article/deta ...
- verilog中的timescale
`timescale是Verilog HDL 中的一种时间尺度预编译指令,它用来定义模块的仿真 时的时间单位和时间精度.格式如下: `timescale 仿真时间单位/时间精度 注意:,不能为其它的 ...