一、实验报告封面
课程:Java程序设计 班级:1653班 姓名:孙晓暄 学号:20165318
指导教师:娄嘉鹏 实验日期:2018年4月27日
实验时间:13:45 - 3:25 实验序号:实验三
实验名称:敏捷开发与XP实践
实验内容:
- 1、XP基础
- 2、XP核心实践
- 3、相关工具
实验要求:
- 1、没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
- 2、完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
- 3、严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
二、实验内容及步骤
(一)编码标准
安装alibaba 插件,解决代码中的规范问题。具体流程如下:
1.打开 Settings
-> Plugins
,在搜索框输入alibaba
即可看到Alibaba Java Code Guidelines
插件,点击Install
进行安装,然后重启IDE生效:
2.使用比较简单:在项目名称上单击右键,在弹出菜单上选择编码规约扫描:
出现下图内容:
不规范的地方,有中文提示并且定位到了行,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
任务二:下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例
搭档的Complex代码如下:
需要测试的方法有:ComplexAdd()
,ComplexSub()
,ComplexMulti()
,ComplexDiv()
;
编写测试代码并上传到搭档码云项目上:
import junit.framework.TestCase;
import org.junit.Test;
import static org.junit.Assert.*;
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;
- 改善原有程序的结构;
- 优化原有系统的性能 。
需要重构的地方:
代码重复、方法过长、参数列过长、条件逻辑过度复杂、分支语句
一个完整的重构流程包括:
- 1.从版本控制系统代码库中Check out code
- 2.读懂代码(包括测试代码)
- 3.发现bad smell
- 4.Refactoring
- 5.运行所有的Unit Tests
- 6.往代码库中Check in code
任务三:下载搭档的代码,至少进行三项重构
如上代码存在以下几个问题:
- 类名不符合命名规则;
- 类中变量没有被封装;
- 方法没有被封装;
程序修改入下:
(四)实验体会与总结
通过本次实验,我主要学习到了代码标准,代码重构等内容。
代码标准和重构的学习,使我注意到自己之前编写代码时的很多不规范之处,而且通过使用alibaba的实时编码扫描,使我在编写代码的同时,注意规范代码的标准格式,使写出的代码更加明了可观,类名和变量名的规范,也使我在编写代码时,减少了许多不必要的注释
代码托管
参考资料
Java 密码学算法——娄老师的博客
实验三 敏捷开发与XP实践——娄老师的博客
Java代码重构的几种模式详解
java 代码重构(系列讲解)
IntelliJ IDEA使用技巧一览表