我们知道在软件开发中,效率是很重要的环节。结对编程时,有些手快的人想到哪里就能编到哪里,恨不得分分钟从手慢的人那儿把键盘抢过来。今天的这篇文章主要是如何用好IntelliJ IDEA这个著名的IDE,以实现:“敲最少的键,编最多的码”。虽说本文的示例是Java,其它语言区别也不大,尤其是当现在的JET BRAINS全家桶已经是如此齐备时。
结果
废话不多说,在环境准备好的情况下,假设我们来测试驱动开发一个计算一天有多少个小时的API。参见以下的两分半小视频:
要是视频不清晰或看不到,就直接到腾讯视频中看720P吧。
如何才能做到”敲最少的键,编最多的码“呢?除了掌握技巧之外,就是多练习实践了。以下就是技巧的内容。
准备环境
首先把环境准备一下。只要有src
和test
即可。我自己是一个默认的Maven新项目,在pom
中引用了junit
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.ggg</groupId>
<artifactId>ggg</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
|
专业版的IDEA支持项目模板,如果你对默认的模板不满意,项目模板能够节省你的一部分操作。
步骤分解
- 快捷键:在
test/java
中用快捷键Ctrl+N生成文件。 - 文件模版:选择的
JUnit
正是我事先创建好的文件模板,内容见下文的“功能简介”。这里的一个小诀窍是先按下u,可以过滤掉不需要的模板。 - 输入:输入
HoursCalculatorTest
并回车,测试文件就此生成。 - 代码自动生成:移动光标到合适位置,用快捷键Ctrl+N自动生成Test Method。
- 输入:将测试方法命名为
should_get_24_hours_for_1_day
。 - 输入:这里需要新建一个测试目标,即
new HoursCalculator()
。 - 快捷键:因为
HoursCalculator
类还不存在,所以会报错,用快捷键F2移动到下一个错误处,再用快捷键Alt+Enter自动修复错误,选择Create class ‘HoursCalculator’。 - 代码自动生成:输入
org.ggg
自动生成HoursCalculator
类。 - 快捷键:Ctrl+Tab回到上一个文件即我们的测试类。Command+Alt+V将
new HoursCalculator()
抽取为一个变量hoursCalculator
,Command+Shift+Enter结束本行,将光标跳至下一行开头。 - 输入:输入
int hoursByDay = hoursCalculator.getHoursByDay(1)
来获取计算结果。小诀窍是只要输入hc
,IDEA就会提示hoursCalculator
。 - 代码自动生成:还是Alt+Enter自动修复错误,选择Create method ‘getHoursByDay’,便能在
HoursCalculator
类中自动生成getHoursByDay
方法。 - 输入:一路回车,可以把参数名改为
days
。 - 快捷键:还是Ctrl+Tab回到测试类,然后Command+Shift+Enter结束本行(分号会自动补齐)。
- 输入:输入
assertEquals(24,hoursByDay)
,还是Command+Shift+Enter结束本行(还会调整格式)。 - 快捷键:Ctrl+Shift+F10运行测试,红了。用Ctrl+Tab回到
HoursCalculator
类准备修改实现。 - 输入:把返回值从
0
改为24
。 - 快捷键:Shift+F10运行上个测试,这回绿了。用Ctrl+Tab回到我们的测试类,准备编写下一个测试。
- 活动模板:将光标移动到合适的位置,输入test和TAB键。可以看到生成了另一个测试方法。当然我们在此也可以用上面的“代码自动生成”,这里不过是用了另一种方法而已。
test
是我事先创建好的活动模板,内容见下文的“功能简介”。 - 输入:将方法命名为
should_get_48_hours_for_2_days
。之后按照类似上文的方式,实现并执行测试,红了。令方法返回24 * day
并再次执行测试,绿了。移动光标到测试方法之外,执行全部测试,都绿了,保证后一个实现不会破坏前一个实现。 - 快捷键:现在是tdd的重构阶段。
24
是一个magic number,所以我们要用Command+Alt+C将其变成一个常量,如hoursInDay
。不过常量应该还是大写的蛇式比较符合惯例,于是可以Shift+F6改名。 - 插件:我事先安装了string-manipulation插件,所以可以直接使用快捷键Alt+M并选择4. To SCREAMING_SNAKE_CASE将变量改名为
HOURS_IN_DAY
。其实现在版本的IDEA已经会在快捷键改名时提示HOURS_IN_DAY
了,但是插件支持的功能更加丰富一些,并且也能在编辑非java文件时使用。 - 快捷键:用Shift+F10运行上次运行的全部测试,依然是绿的。
- 快捷键:测试文件还不在包中,用F6将其移入
org.ggg
中。还可以用Command+Alt+O来优化import部分。 - 快捷键:再次用Shift+F10运行测试,依然是绿的,重构完成。
用到的IDE功能简介
快捷键(Shortcuts)
我用的是Mac OS X的Keymap。常用的快捷键要牢记,很多时候它决定了程序员的效率如何。JET BRAINS的各种语言的IDE快捷键都比较类似,花点精力记住它决不会吃亏。
文件模板(File Templates)
顾名思义,文件模板即是新建文件时使用到的模板。我们在上面的步骤中使用的JUnit
活动模板如下:
1
2
3
4
5
6
7
8
9
|
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
import org.junit.Test;
import static org.junit.Assert.*;
#parse("File Header.java")
public class ${NAME} {
}
|
它的语法基于Apache Velocity,支持变量,如${PACKAGE_NAME}
表示包名,${NAME}
表示用户输入的名称,等等。
可以通过在Preferences中搜索File and Code Templates,来创建或修改文件模板。也可以在一开始Ctrl+N时选择Edit File Templates…。
活动模板(Live Templates)
活动模板与文件模板类似,但它不需要新建文件,可以在文件的任何地方激活,只需要输入名字后加一个TAB即可。我们在上面的步骤中使用的test
活动模板如下:
1
2
3
4
|
public void $NAME$() {
$END$
}
|
其中的$END$
表示最后光标会出现在哪里。在此,表示光标最后会出现在方法体内,以便于继续编写实现。
可以通过在Preferences中搜索Live Templates,来创建或修改活动模板。
代码自动生成(Generating Code)
有许多常用的代码,例如getter、setter、constructor、equals&hashCode等等,IDEA都能够通过这个功能帮助自动生成。
我们在上面的步骤中使用了Ctrl+N生成了junit的测试方法,用Alt+Enter通过修复错误的方式来生成类和方法。
插件(Plugins)
IDEA支持许多插件。插件的功能强大,能够做到从修改字符串到语言级别的支持。比如我们用的版本控制系统VCS就是用插件的方式开发的。
我们在上面的步骤中使用了string-manipulation插件。安装完插件,别忘了重启IntelliJ IDEA。你也可以编写自己的插件。