惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
S
Schneier on Security
The Hacker News
The Hacker News
P
Proofpoint News Feed
Spread Privacy
Spread Privacy
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
I
Intezer
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Schneier on Security
Schneier on Security
Security Latest
Security Latest
AWS News Blog
AWS News Blog
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
有赞技术团队
有赞技术团队
博客园 - 叶小钗
The Last Watchdog
The Last Watchdog
O
OpenAI News
月光博客
月光博客
Hacker News: Ask HN
Hacker News: Ask HN
阮一峰的网络日志
阮一峰的网络日志
S
Security @ Cisco Blogs
Google Online Security Blog
Google Online Security Blog
云风的 BLOG
云风的 BLOG
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Latest news
Latest news
P
Palo Alto Networks Blog
Last Week in AI
Last Week in AI
M
MIT News - Artificial intelligence
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
Apple Machine Learning Research
Apple Machine Learning Research
U
Unit 42
PCI Perspectives
PCI Perspectives
博客园 - 聂微东
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
Forbes - Security
Forbes - Security
H
Heimdal Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Hugging Face - Blog
Hugging Face - Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Troy Hunt's Blog
博客园 - 三生石上(FineUI控件)
Application and Cybersecurity Blog
Application and Cybersecurity Blog
罗磊的独立博客
WordPress大学
WordPress大学
D
Darknet – Hacking Tools, Hacker News & Cyber Security

懒程序员改变世界

AI时代的站会:从同步到异步 真实流量,本地回放:一种轻量的性能测试思路 AI编程成熟度模型:从3倍到10倍的路径 用AWS创建工作流 未来的软件开发什么样 Java 11时代,这些编程习惯可以改一改了 手稿秒变html的Sketch 2 Code 组合型软件架构 用JaVers比较对象 逆向工作法 挖掘IntelliJ IDEA的调试功能 软件开发有没有高下 挖掘IntelliJ IDEA的实用功能 个人的技术债 《Java函数式编程》出版啦 懒程序员笔记 SSH妙用 用Tampermonkey实现自动化网页操作 代码还是数据
敲最少的键,编最多的码
Qinghua Gao · 2018-02-04 · via 懒程序员改变世界

敲最少的键,编最多的码

我们知道在软件开发中,效率是很重要的环节。结对编程时,有些手快的人想到哪里就能编到哪里,恨不得分分钟从手慢的人那儿把键盘抢过来。今天的这篇文章主要是如何用好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
 

4.0.0

org.ggg
ggg
1.0-SNAPSHOT


junit
junit
4.12



专业版的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+Vnew HoursCalculator()抽取为一个变量hoursCalculatorCommand+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回到我们的测试类,准备编写下一个测试。
  • 活动模板:将光标移动到合适的位置,输入testTAB键。可以看到生成了另一个测试方法。当然我们在此也可以用上面的“代码自动生成”,这里不过是用了另一种方法而已。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
@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。你也可以编写自己的插件