一、实验报告封面
课程:Java程序设计 班级:1752班 姓名:吕正宏 学号:20175213
指导教师:娄嘉鹏 实验日期:2019年4月29日
实验时间:13:45 - 21:00 实验序号:实验三
实验名称:敏捷开发与XP实践
实验内容:
1、XP基础
2、XP核心实践 3、相关工具实验要求:
1、完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。
2、严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。二、实验内容与步骤
(一)编码标准
1.要求:参考 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
2.实验步骤
首先是安装alibaba:
IDEA中的插件,我们通过Jetbrains官方仓库安装:打开Settings
->Plugins
-> Browse repositories...
在搜索框输入alibaba
即可看到Alibaba Java Code Guidelines
插件,点击Install
进行安装,然后重启IDE生效:
使用比较简单:在项目名称上单击右键,在弹出菜单上选择编码规约扫描:
出现下图内容:
不规范的地方,有中文提示并且定位到了行,alibaba把问题分为block/critical/major
三个等级,有些规则可以一键修复。
经编码规约扫描后,下面是规范后的代码和规范说明:
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
然后是IDEA里的Code菜单,下面是Code菜单:
我挑选的是Surround With(Ctrl+Alt+T)
这种选项,其功能是使用if-else、try-catch、do-while等包装代码段;
(二)敏捷开发与XP
1.要求:在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后,下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例,测试成功后git add .; git commit -m "自己学号 添加内容";git push;
提交搭档项目git log的截图,包含上面git commit的信息,并加上自己的学号水印信息。
2.实验步骤
下面是我搭档的Complex代码:
public class Complex { double RealPart; double ImagePart; public Complex() { } public Complex(double R, double I) { RealPart = R; ImagePart = I; } public boolean equals(Complex a) { if (a.RealPart == this.RealPart && a.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)); }}
我对此Complex代码测试的方法有:Equals()
,ToString()
,ComplexAdd()
,ComplexSub()
,ComplexMulti()
,ComplexDiv()
;
下面是对Complex的测试代码:
import junit.framework.TestCase;public class ComplexTest extends TestCase { Complex a = new Complex(3.0, 4.0); Complex b = new Complex(-2.0, -3.0); public void testEquals() { assertEquals(true, a.equals(a)); assertEquals(false, b.equals(a)); } public void testToString() { assertEquals("3.0 + 4.0i", a.toString()); assertEquals("-2.0 - 3.0i", b.toString()); } public void testComplexAdd() { assertEquals("1.0 + 1.0i",a.ComplexAdd(b).toString()); assertEquals("-4.0 - 6.0i",b.ComplexAdd(b).toString()); } public void testComplexSub() { assertEquals("5.0 + 7.0i",a.ComplexSub(b).toString()); assertEquals("0",b.ComplexSub(b).toString()); } public void testComplexMulti() { assertEquals("-7.0 + 24.0i",a.ComplexMulti(a).toString()); assertEquals("6.0 - 17.0i",a.ComplexMulti(b).toString()); } public void testComplexDiv() { assertEquals("1.0",a.ComplexDiv(a).toString()); }}
(三)重构
1.要求:参考http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成IDEA
完成重构内容的练习,下载搭档的代码,至少进行三项重构,提交重构后代码的截图,加上自己的学号水印。提交搭档的码云项目链接。
2.实验步骤
重构的概念:
重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。
重构中一个非常关键的前提就是“不改变软件外部行为”,它保证了我们在重构原有系统的同时,不会为原系统带来新的BUG,以确保重构的安全。如何保证不改变软件外部行为?重构后的代码要能通过单元测试。如何使其更加易于阅读、易于维护和易于变更 ?设计模式给出了重构的目标。
我们要修改软件,万变不离其宗,无非就是四种动机:
增加新功能;
原有功能有BUG;
改善原有程序的结构;
优化原有系统的性能 。
第一种和第二种动机,都是源于客户的功能需求,而第四种是源于客户的非功能需求。软件的外部质量,其衡量的标准就是客户对软件功能需求与非功能需求的满意度。它涉及到一个企业、一个软件的信誉度与生命力,因此为所有软件企业所高度重视。要提高软件内部质量,毫无疑问就是软件修改的第三个动机:改善原有程序的结构。它的价值是隐性的,并不体现在某一次或两次开发中,而是逐渐体现在日后长期维护的软件过程中。
而一个完整的重构流程包括:
从版本控制系统代码库中Check out code
读懂代码(包括测试代码)
发现bad smell
efactoring
运行所有的Unit Tests
往代码库中Check in code
下面就是下载搭档的代码,并进行三项重构:
搭档的代码:
class A { float computer(float x,float y) { return x+y; } public int g(int x,int y) { return x+y; }}class B extends A { float computer (float x,float y,double z) { return x-y; }}public class Example5_5 { public static void main(String args[]) { B b=new B(); double result=b.computer(8,9); //b调用重写的方法 System.out.println(result); int m=b.g(12,8); //b调用继承的方法 System.out.println(m); }}
针对编码规约扫描提出的问题一一解决。
问题一:
问题二:
问题三:
问题四:
修改后代码截图:
(四)Java密码学算法
要求:
(1)参考 http://www.cnblogs.com/rocedu/p/6683948.html,以结对的方式完成Java密码学相关内容的学习,结合重构,git,代码标准。
(2)提交学习成果码云链接和代表性成果截图,要有学号水印。
(3)安全问题可以归结为安全的三个属性(CIA金三角):
-机密性(Confidentiality)
-完整性(Integrity)
-可用性(Availability)
(4)密码学: 主要是研究保密通信和信息保密的学科, 包括信息保密传输和信息加密存储等。密码学包含密码编码学( Cryptography) 和密码分析学(Cryptanalyst) 两个分支。
(5)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平台上进行用户身份鉴别的功能。
实验代码:
/** * @author LZH * @date 2019/05/05 */public class Caesar { public static void main(String args[]) { String s=args[0]; int key=Integer.parseInt(args[1]); M m=new M(); int n=s.length(); String es=""; for(int i=0;i= 'a' && c <= 'z'){ es=m.realizeMove(n,c,key,'a','z'); } else if (c >= 'A' && c <= 'Z'){ es=m.realizeMove(n,c,key,'A','Z'); } } System.out.println(es); }}class M { String es=""; public String realizeMove(int n,char c,int key,char a,char b){ //移动key%26位 c+=key%26; if(c b) { c-=26; //向右超界 } es+=c; return es; }}
运行截图
(五)实验体会与总结
本次实验,代码的规范让我受益匪浅,规范后的代码让人看着很一目了然。
本次实验加强了对代码测试的理解,拓宽了视野。