IntelliJ IDEA 复杂的重构技巧
IntelliJ IDEA 复杂的重构技巧(二)
转载
上次我说了一些 “复杂的重构技巧” ,讲的是一些使用 IntelliJ 的简单功能实现复杂的重构需求的技巧。 看到大家的反响之后我就感觉那个可能不大亲民,因为很多人连 inline 这功能都不知道(那岂不是把 IntelliJ 用成了记事本), 于是我决定再写一篇讲讲 IntelliJ 已经提供好了的一些复杂的重构功能。
这就不再是需要自己进行奇奇怪怪的操作的教程了,就会亲民得多。
从方法中提取方法
这是用来快速复用一段代码的功能,名叫 “Extract Method” 。
比如,我现在有这么一段业务代码(顺带一提,这是在 Java 调用动态语言 API 时能使用的最健壮的处理数值类型的方法):
|
为了效率考虑,你决定不使用 subList(1, nodes.size()).forEach
而是使用 for
循环。
然后你突然发现,这个 “遍历一个集合除了第一个元素之外的元素” 操作在你的代码里面已经被调用了很多次了。
于是你决定贯彻 “非极端性 DRY 原则” ,把这坨代码复用起来。
我们仔细观察一下。
这坨代码中,直觉上,我们希望可以通过形如
|
的代码来一行处理这个操作的(不懂方法引用的请退群),但是这个 forEachExceptFirst
是不存在的。
所以我们想自己造一个。
这时候我们就应该使用 IntelliJ IDEA 提供的 Extract method
功能了。
首先选中那一堆代码,然后按下 Ctrl+Alt+m,看到这么一个窗口。
img
然后我们在 “Name” 那一栏输入 forEachExceptFirst
,也就是我们想提取的函数的函数名;然后回车。
我们可以看到,代码变成了这样:
|
我们可以看看它生成的这个 forEachExceptFirst
方法:
|
然后你就可以在其他地方使用这个方法了。
我们可以给它加上 JetBrains annotations:
|
当然加这么多意义不大,对 Node
类型的 @NotNull
注解是可以去掉的。
撤回这个操作的话,请使用上一篇博客所大量使用的 inline
功能。
从类中提取接口
比如,我们有这么一个 Java 类(最近突然觉得,对类型的注解应该比可见性修饰符更靠近类型(比如在一个方法中, 我就可以用这种方法来区分对返回类型的注解(比如 @NotNull
)和对方法本身的注解(比如 @Override
)), 所以就有了这么个把注解写在可见性修饰符后面的奇怪的写法,希望读者不要介意这一点)。
|
代码中省去了一些对文章不重要的细节。
然后我们可以在类名上右键,然后找到这个东西:
img
这样我们会看到一个窗口,里面的东西还挺复杂的:
img
首先我们在 “Interface name” 那里填我们想抽取的接口的名字,比如刚刚的那个类 Marisa
,就很适合GensokyoManagement
(毕竟魔理沙是幻想乡两位城管之一嘛,又因为城管的翻译是 Urban management
) 这个名字的接口。
然后我们希望把这三个方法都抽取到接口里面去,于是就勾选下面的三个方法。请根据实际需求勾选需要抽取的方法。
最后回车。
这时候 IntelliJ IDEA 会询问你,是否 “尽可能在这个类被使用的地方,把这个类的类型改成接口的类型”。
img
这是一种很好的作法,比如我们会倾向于把
|
写成
|
,对不对吖。
这里这个提示就是问你要不要这么换一波的。这个就看需求了,另外建议取消勾选下面的 “Preview usages to be changed”。
最后我们就提取出来了这么个玩意(这里只有三个方法所以生成的代码很少,看起来不是很高大上, 如果你实现了一种操作比较多的数据结构(比如线段树啊,各种图啊树啊)再这么来一波,就能生成一大坨):
|
然后我们就可以再写其他类,比如:
|
然后让 IntelliJ IDEA 自动生成之前那些方法,然后我们就可以愉快地写实现啦。
接口与实现间的互相发送代码
我们还有很多可以做的事情,比如我们现在给 Marisa
类加了新方法作为新功能,然后我们想给 Reimu
也加上, 并把这个方法作为 GensokyoManagement
的一个抽象方法之一(接口的方法是默认抽象的,别因为省了 abstract
修饰符就以为不是了):
|
我们可以这样,在新方法上右键,然后这么选:
img
这样我们会看到一个窗口,里面的东西不怎么复杂:
img
只需要勾选我们要送给接口(或者父类)的方法,然后回车就好了。
IntelliJ IDEA 会给你加上 @Override
修饰符,和生成新的抽象方法。
然后我们就可以跳到 Reimu
类,让 IntelliJ IDEA 生成一个空实现,然后接着写啦。
本文作者:ice1000
原文链接:http://ice1000.org/2017/12/25/IDEARefactoring2/
版权归作者所有,转载请注明出处
IntelliJ IDEA 复杂的重构技巧的更多相关文章
- Java常见重构技巧 - 去除不必要的!=null判断空的5种方式,很少有人知道后两种
常见重构技巧 - 去除不必要的!= 项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢?@pdai 常见重构技巧 - 去除不必要的!= 场景一:null无意义之常规判断空 ...
- 常见重构技巧 - 5种方式去除多余的if else
常见重构技巧 - 去除多余的if else 最为常见的是代码中使用很多的if/else,或者switch/case:如何重构呢?方法特别多,本文带你学习其中的技巧. 常见重构技巧 - 去除多余的if ...
- RefactoringGuru 代码异味和重构技巧总结
整理自 RefactoringGuru 代码异味 --什么?代码如何"闻味道"?? --它没有鼻子...但它肯定会发臭! 代码膨胀 [代码膨胀]是代码.方法和类,它们的规模已经增加 ...
- IntelliJ IDEA重构技巧收集
https://segmentfault.com/a/1190000002488608(重命名文件) http://www.jianshu.com/p/ab298b46bf50(快速生成方法) htt ...
- Intellij IDEA快捷键与使用技巧一览表
Intellij IDEA快捷键 Ctrl+Shift + Enter,语句完成 "!",否定完成,输入表达式时按 "!"键 Ctrl+E,最近的文件 Ctrl ...
- IntelliJ IDEA 常用快捷键和技巧
IntelliJ Idea 常用快捷键列表 Alt+回车 导入包,自动修正Ctrl+N 查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L 格式化代码Ctrl+Alt+O 优化导入的类和 ...
- 前端页面重构技巧总结TIP【持续更新...】
本文均为项目实战经验,要求兼容至IE8,所以以下内容均为兼容代码,欢迎各位小伙伴批评指教.其实重构页面是一门学问,看似简单,却暗藏很多学问.实际项目中页面的重构有以下几点最基本需求: 1.需要使用合理 ...
- IntelliJ IDEA编辑器的使用技巧
目录 1. 使用技巧 1. 跳转小工具 2. 无处不在的跳转 3. 精准搜索 4. 列操作: 5. live template 6. postfix 7. ALT+ENTER智能提示,代码优化 8. ...
- [效率神技]Intellij 的快捷键和效率技巧|系列一|常用快捷键
Intellij 是个功能强大的IDE,这里只讲window下社区版的Intellij. 1. 常用快捷: Alt+回车 导入包,自动修正Ctrl+N 查找类Ctrl+Shift+N 查找文件Ct ...
随机推荐
- linux安装mysql可视化界面
之前是一直用shell交互界面,但是最近频繁地检查数据库中的数据感觉特别麻烦,便装了一个可视化工具. 安装: $ sudo apt-get install mysql-workbench [sudo] ...
- mysql 数据库备份 -- (定时任务)
场景: 我们经常需要对数据库备份 方式一:mysql 数据备份方式 在linux 备份方式 通常采用 mysqldump -uroot -ppassword --database 数据库名 > ...
- linux开机执行脚本
有些服务用命令启动的想要做到开机启动可以 /etc/profile.d/ 下面建一个脚本文件(这个目录优先级最低) #!/bin/bash ... 转载请注明博客出处:http://www.cnblo ...
- linux升级安装openssh时出现依赖冲突
通过如下方式下载到openssh安装包 https://www.cnblogs.com/qq931399960/p/11120429.html -rwxrwxrwx. root root Jul : ...
- vue-cli构建的项目结构解析
参考: https://www.jianshu.com/p/32beaca25c0d
- Visual Studio Code-Vscode下快速补全新建HTML文件默认代码
1.新建文件. 2.点击右下角文档格式:纯文本,上方弹出框输入HTML改成 html文档格式. 3.输入“ !”,按tab. 4.完成.
- PHP安装 (结合之前的nginx安装与mysql安装组合为lnmp)
检查安装PHP所需的lib库 yum -y install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-de ...
- vue 添加一个二级目录
原先的: http://xxx.xx.xxx.xxx:xxx/#/ 现在的: http://xxx.xx.xxx.xxx:xxx/guangfu/#/
- OGG-01877 Missing explicit accessrule for server collector
OGG-01877 Missing explicit accessrule for server collector Table of Contents 1. OGG-01877 1 OGG-0187 ...
- OpenStack 对接 Ceph 环境可以创建卷但不能挂载卷的问题
问题 环境:Nova.Cinder.Glance 都对接了 Ceph RBD 后端存储. 以往的操作包括上传镜像.创建卷.挂载卷都是一切正常的,但突然出现了无法挂载卷的问题,而且还是因为 Ceph 客 ...