“再一次问好。”

“你好!”

“今天我要给大家讲讲重构。重构就是在不改变项目功能的情况下改变项目中的代码。”

“但这怎么可能?”

“好吧,在最简单的情况下,我们可以重命名变量和/或方法。毕竟,更改变量的名称不会使程序运行不同,不是吗?”

“当然不是。”

“你也可以将大型方法分解成几个较小的方法。

“您可以将重复的代码片段提取到一个单独的方法中。

“一些函数可以声明为静态的,然后移到实用程序类中。”

“但这是对重构的狭义解释。”

“重构有时意味着在不添加新功能的情况下重写(改进)项目的架构。这是广义上的重构。”

“IntelliJ IDEA 成为最流行的集成开发环境 (IDE),特别是因为它率先引入了非常强大的重构工具。”

“这些法器是什么?”

魔术 #1:更改方法的名称。

“想象一下,您的代码有一个从 100-500 个不同地方调用的方法。您决定将其名称更改为更容易理解的名称。假设它是 run(),而您希望它是 runDownloadTaskAsync()。多快你能做到吗?

“嗯,首先你需要改变方法的名称,然后找到程序中所有调用该方法的地方,并在那里也改变名称。”

“你怎么找到那些地方?”

“我只需运行该程序,IntelliJ IDEA 就会向我展示调用不存在的方法的所有位置。”

“好吧。但是现在假设每个方法都有一个解释性注释 (JavaDoc) 来解释该方法的作用——并且旧的方法名称写在那里。”

“我也会改变评论。”

“但也可能有一些变量的名称与方法的名称相关联。最好也更改它们:”

Task task = manager.run();
Task asyncTask = manager.runDownloadTaskAsync();

“是的,最好也更改那些变量的名称。不会有什么坏处。”

“嗯,所有这些都可以使用 IntelliJ IDEA 在几秒钟内完成!”

“您将光标放在方法名称上(或用鼠标单击它),然后按Shift+F6并开始键入所需的方法名称。”

“这是一个编辑方法名称的示例。”

“开始编辑:”

想法:重构 - 1

“指定一个新名称:”

想法:重构 - 2

“只要输入一个新名称,回车,就可以了。这个方法在项目中被调用的任何地方都会被重命名。”

“IntelliJ IDEA 通常还会询问您是否要在注释中重命名变量名和方法名。只需单击“是”,它就会改变一切。”

“更何况,如果项目在本次重构操作之前编译通过,那么重构之后也能保证编译成功。”

“听起来很有希望。”

“顺便说一句,您可以用同样的方式更改变量名称。单击一个名称后,只需按Shift+F6——然后您可以输入一个新名称,IntelliJ 将在任何使用的地方更改变量名称。

“如果变量是类中的一个字段并且有一个 getter 和一个 setter,那么 getter 和 setter 的名称也会更改以匹配变量的新名称。”

“我尝试使用变量。一切都像你说的那样工作,Ellie。重构太棒了!”

“你认为重构就是全部吗?重构是一个如此广泛的话题——我们甚至还没有触及表面。”

“哇。还有什么?”

魔术 #2:提取变量。

“有时某些表达式在代码中经常重复,以至于您需要将它们移到一个单独的变量中。例如:”

代码
public void printInfo(User user)
{
 System.out.println(user.getProfile().getName());
 System.out.println(user.getProfile().getAddress().getState());
 System.out.println(user.getProfile().getAddress().getCity());
 System.out.println(user.getProfile().getAddress().getStreet());
 System.out.println(user.getProfile().getAddress().getHomeNumber());
}
你希望它看起来如何:
public void printInfo(User user)
{
 Address address = user.getProfile().getAddress();

 System.out.println(user.getProfile().getName());
 System.out.println(address.getState());
 System.out.println(address.getCity());
 System.out.println(address.getStreet());
 System.out.println(address.getHomeNumber());
}

“啊。”

“而且代码可能会复杂得多,有很多重复的部分。”

“程序员不会故意那样写。但你经常需要向方法中添加一些东西,然后再添加其他东西——随着时间的推移,重复的次数会飙升。”

“通过创建一个单独的变量,我们可以给它一个合适的名字并提高代码的可读性。”

“例如,在上面的例子中,也许我们不是在谈论家庭地址。也许我们在谈论紧急联系人的地址。然后你可以调用这个变量 emergencyContactAddress,而不仅仅是地址。然后,一个程序员第一次看到这段代码就会明白这里发生了什么。”

“是的,我同意。添加这样的变量是有道理的。”

“你是怎么做到的?”

“将一个表达式移动到一个单独的变量中非常简单。”

第一步:用鼠标选择表达式。

想法:重构 - 3

第 2 步:按 Ctrl+Alt+V

想法:重构 - 4

“打开一个窗口,IntelliJ IDEA 会询​​问我们是要仅替换选定的表达式还是替换表达式的所有实例(出现 4 次)?”

“选择第二个选项来替换所有出现(替换所有 4 次出现)”

第 3 步:按回车键。

想法:重构 - 5

“IntelliJ IDEA 会提示您输入一个变量名。它也会对名称提出自己的建议。不错,嗯?”

“嗯嗯,对了,我们还打算给变量命名为‘地址’,它是怎么知道的?”

“通过在表达式中使用最后一个方法的名称,它返回一个地址。因此,变量很可能将用于存储地址。”

“结果真的很好。太棒了,艾莉。”

魔术 #3:将代码提取到一个单独的方法中。

“但我们本可以做其他事情。我们可以声明一个新方法,例如printAddress (),然后将所有这些代码移入其中。”

“我们试试吧。”

第 1 步:选择使用地址变量的 4 行代码:

想法:重构 - 6

第 2 步:按 Ctrl+Alt+M

想法:重构 - 7

“IntelliJ IDEA 确定该方法需要哪些变量,并建议它应该是什么样子。“唯一剩下的就是为该方法输入一个名称。

第 3 步:输入 printAddress 作为方法名称,然后按 Enter 键。

想法:重构 - 8

“你觉得如何?”

“太棒了。IntelliJ IDEA 不仅将代码提取到一个单独的方法中,还添加了所有必需的变量。而且,它猜对了所有名称。”