修改方法签名的重构手法

简介: 今天看到同事写的一篇博客《依赖快捷键做重构是不行的》。里面讲了一个这样的案例:本来有一方法,假设叫methodA。 1 2 3 public void methodA(){ // blablabla... } 后来由于需求变动,需要增加一个参数,姑且看做这个样子。

今天看到同事写的一篇博客《依赖快捷键做重构是不行的》。里面讲了一个这样的案例:本来有一方法,假设叫methodA。

1
2
3
public void methodA(){
  // blablabla... 
}

后来由于需求变动,需要增加一个参数,姑且看做这个样子。

1
2
3
public void methodA(String param){
//  blablabla... 
}

他本来想直接修改方法签名(Intellij中快捷键是Ctrl+F6)。但这样会导致所有调用此方法的地方由于缺乏对新加参数的处理,会导致单元测试甚至编译失败。他得出结论说依赖快捷键做重构是不行的。

我想说的是并不是依赖快捷键做重构不行,而恰恰是没有快捷键做重构会异常痛苦。如果没有方便的快捷键的话,依靠手工做重构会大大增加重构的时间成本及出错成本。正是由于重构快捷键的越来越便利,才导致重构不再是奢侈品,而成了家常便饭。

其实针对这种情况是使用快捷键的思路不对。我们的目标是对methodA添加一个参数,看似直接采用修改方法签名的快捷键就可以直接搞定。但其实这种想法是大大错误的。 结合他在文中给出的另一个实现方式,修改方法签名的一个正确的顺序应该是这样的。

  1. 新写一个methodA2,这个方法相当于重构后的methodA。如果实现需要调用methodA,可以直接调用。

  2. 使用查找所有用例的快捷键(Ctrl+Alt+F7)查找methodA的所有用例,并逐一修改为调用methodA2的实现。期间每改一处要运行一下测试,防止修改破坏了原有功能。

  3. 如果methodA2调用了methodA方法,使用inline method快捷键(Ctrl+Alt+N)将methodA inline到methodA2中。

  4. 使用safe delete快捷键(Alt+Delete)删除methodA方法。如果仍然有指向methodA的方法调用,IDE会进行提示。

  5. 使用rename的快捷键(Shift+F6)将methodA2方法重名为methodA。

我们可以看到,这五步中有四步都需要IDE的快捷键支持。如果脱离了IDE的快捷键,你会发现连一个小小的rename都会花上大量的时间。

而这种方式与一上去就直接修改方法签名的方式好在那里?

  • 基本不会出现编译错误。直接修改方法签名会陷入修复编译错误的泥潭。

  • 小步前进,随时可以停下而不担心程序构建失败。方式一会将程序带入一个漫长的不稳定的状态。

学会重构手法固然重要,但是掌握IDE提供的重构快捷键也不能轻视。如果你是Java程序员,推荐使用Intellij,里面的重构快捷键比eclipse多出不少,而且效果更好。如果你是c#程序员,推荐给你的Visual Studio装上ReShaper。注意IntellijReShaper都是JetBrains出品的。要知道程序员挑选IDE就跟女生使用化妆品一样挑剔,但是JetBrains赢得了广大程序员的心。

PS:我知道这两款产品都不是免费的,但是对于程序员来说,节省了时间就是节省了金钱,对于工具,当然要用最好的。

相关文章
|
8月前
|
存储 监控 小程序
《优化接口设计的思路》系列:第三篇—留下用户调用接口的痕迹
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧。
58 0
《优化接口设计的思路》系列:第三篇—留下用户调用接口的痕迹
|
安全 JavaScript 前端开发
Javascript框架库漏洞验证
Javascript框架库漏洞验证
2584 0
Javascript框架库漏洞验证
|
7月前
|
机器学习/深度学习 人工智能 安全
【网安AIGC专题10.11】①代码大模型的应用:检测、修复②其安全性研究:模型窃取攻击(API和网页接口) 数据窃取攻击 对抗攻击(用途:漏洞隐藏) 后门攻击(加触发器+标签翻转)(下)
【网安AIGC专题10.11】①代码大模型的应用:检测、修复②其安全性研究:模型窃取攻击(API和网页接口) 数据窃取攻击 对抗攻击(用途:漏洞隐藏) 后门攻击(加触发器+标签翻转)
166 1
|
7月前
|
自然语言处理 安全 API
【网安AIGC专题10.11】①代码大模型的应用:检测、修复②其安全性研究:模型窃取攻击(API和网页接口) 数据窃取攻击 对抗攻击(用途:漏洞隐藏) 后门攻击(加触发器+标签翻转)(上)
【网安AIGC专题10.11】①代码大模型的应用:检测、修复②其安全性研究:模型窃取攻击(API和网页接口) 数据窃取攻击 对抗攻击(用途:漏洞隐藏) 后门攻击(加触发器+标签翻转)
259 0
关于《生成器运行时机导致的难以察觉的 bug》勘误
关于《生成器运行时机导致的难以察觉的 bug》勘误
61 0
|
安全 API Android开发
教你如何高效的检查APK中使用敏感权限的地方以及检查某系统方法被调用的地方
教你如何高效的检查APK中使用敏感权限的地方以及检查某系统方法被调用的地方
435 0
教你如何高效的检查APK中使用敏感权限的地方以及检查某系统方法被调用的地方
|
Java
攻防:如何防止动态hook绕过jni签名校验
攻 我们知道jni校验签名也不可靠,可以被动态hook绕过。代码如下:
408 0
|
关系型数据库 数据库
重构老系统遗留代码的一些方法学习笔记
重构老系统遗留代码的一些方法学习笔记
116 0
重构老系统遗留代码的一些方法学习笔记