敲最少的键,编最多的码

我们知道在软件开发中,效率是很重要的环节。结对编程时,有些手快的人想到哪里就能编到哪里,恨不得分分钟从手慢的人那儿把键盘抢过来。今天的这篇文章主要是如何用好IntelliJ IDEA这个著名的IDE,以实现:“敲最少的键,编最多的码”。虽说本文的示例是Java,其它语言区别也不大,尤其是当现在的JET BRAINS全家桶已经是如此齐备时。

结果

废话不多说,在环境准备好的情况下,假设我们来测试驱动开发一个计算一天有多少个小时的API。参见以下的两分半小视频:

要是视频不清晰或看不到,就直接到腾讯视频中看720P吧。

如何才能做到”敲最少的键,编最多的码“呢?除了掌握技巧之外,就是多练习实践了。以下就是技巧的内容。

准备环境

首先把环境准备一下。只要有srctest即可。我自己是一个默认的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支持项目模板,如果你对默认的模板不满意,项目模板能够节省你的一部分操作。

步骤分解

  1. 快捷键:在test/java中用快捷键Ctrl+N生成文件。
  2. 文件模版:选择的JUnit正是我事先创建好的文件模板,内容见下文的“功能简介”。这里的一个小诀窍是先按下u,可以过滤掉不需要的模板。
  3. 输入:输入HoursCalculatorTest并回车,测试文件就此生成。
  4. 代码自动生成:移动光标到合适位置,用快捷键Ctrl+N自动生成Test Method
  5. 输入:将测试方法命名为should_get_24_hours_for_1_day
  6. 输入:这里需要新建一个测试目标,即new HoursCalculator()
  7. 快捷键:因为HoursCalculator类还不存在,所以会报错,用快捷键F2移动到下一个错误处,再用快捷键Alt+Enter自动修复错误,选择Create class ‘HoursCalculator’
  8. 代码自动生成:输入org.ggg自动生成HoursCalculator类。
  9. 快捷键:Ctrl+Tab回到上一个文件即我们的测试类。Command+Alt+Vnew HoursCalculator()抽取为一个变量hoursCalculatorCommand+Shift+Enter结束本行,将光标跳至下一行开头。
  10. 输入:输入int hoursByDay = hoursCalculator.getHoursByDay(1)来获取计算结果。小诀窍是只要输入hc,IDEA就会提示hoursCalculator
  11. 代码自动生成:还是Alt+Enter自动修复错误,选择Create method ‘getHoursByDay’,便能在HoursCalculator类中自动生成getHoursByDay方法。
  12. 输入:一路回车,可以把参数名改为days
  13. 快捷键:还是Ctrl+Tab回到测试类,然后Command+Shift+Enter结束本行(分号会自动补齐)。
  14. 输入:输入assertEquals(24,hoursByDay),还是Command+Shift+Enter结束本行(还会调整格式)。
  15. 快捷键:Ctrl+Shift+F10运行测试,红了。用Ctrl+Tab回到HoursCalculator类准备修改实现。
  16. 输入:把返回值从0改为24
  17. 快捷键:Shift+F10运行上个测试,这回绿了。用Ctrl+Tab回到我们的测试类,准备编写下一个测试。
  18. 活动模板:将光标移动到合适的位置,输入testTAB键。可以看到生成了另一个测试方法。当然我们在此也可以用上面的“代码自动生成”,这里不过是用了另一种方法而已。test是我事先创建好的活动模板,内容见下文的“功能简介”。
  19. 输入:将方法命名为should_get_48_hours_for_2_days。之后按照类似上文的方式,实现并执行测试,红了。令方法返回24 * day并再次执行测试,绿了。移动光标到测试方法之外,执行全部测试,都绿了,保证后一个实现不会破坏前一个实现。
  20. 快捷键:现在是tdd的重构阶段。24是一个magic number,所以我们要用Command+Alt+C将其变成一个常量,如hoursInDay。不过常量应该还是大写的蛇式比较符合惯例,于是可以Shift+F6改名。
  21. 插件:我事先安装了string-manipulation插件,所以可以直接使用快捷键Alt+M并选择4. To SCREAMING_SNAKE_CASE将变量改名为HOURS_IN_DAY。其实现在版本的IDEA已经会在快捷键改名时提示HOURS_IN_DAY了,但是插件支持的功能更加丰富一些,并且也能在编辑非java文件时使用。
  22. 快捷键:用Shift+F10运行上次运行的全部测试,依然是绿的。
  23. 快捷键:测试文件还不在包中,用F6将其移入org.ggg中。还可以用Command+Alt+O来优化import部分。
  24. 快捷键:再次用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
@Test
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。你也可以编写自己的插件

原文转载自:http://qinghua.github.io/type-less-code-more/