• Intellij Idea 重构
    • 提炼函数
    • 内联函数
    • 查询取代临时变量

    Intellij Idea 重构

    下面简单地介绍一下,一些可以直接使用 IDE 就能完成的重构。这种重构可以用在日常的工作中,只需要使用 IDE 上的快捷键就可以完成了。

    提炼函数

    Intellij IDEA 带了一些有意思的快捷键,或者说自己之前不在意这些快捷键的存在。重构作为单独的一个菜单,显然也突显了其功能的重要性,说说提炼函数,或者说提出方法。

    快捷键

    Mac: alt+command+M

    Windows/Linux: Ctrl+Alt+M

    鼠标: Refactor | Extract | Method

    重构之前

    以重构一书代码为例,重构之前的代码

    1. public class extract {
    2. private String _name;
    3. void printOwing(double amount){
    4. printBanner();
    5. System.out.println("name:" + _name);
    6. System.out.println("amount" + amount);
    7. }
    8. private void printBanner() {
    9. }
    10. }

    重构

    选中

    1. System.out.println("name:" + _name);
    2. System.out.println("amount" + amount);

    按下上述的快捷键,会弹出下面的对话框

    Extrct Method

    输入

    1. printDetails

    那么重构就完成了。

    重构之后

    IDE 就可以将方法提出来

    1. public class extract {
    2. private String _name;
    3. void printOwing(double amount){
    4. printBanner();
    5. printDetails(amount);
    6. }
    7. private void printDetails(double amount) {
    8. System.out.println("name:" + _name);
    9. System.out.println("amount" + amount);
    10. }
    11. private void printBanner() {
    12. }
    13. }

    重构

    还有一种就以 Intellij IDEA 的示例为例,这像是在说其的智能。

    1. public class extract {
    2. public void method() {
    3. int one = 1;
    4. int two = 2;
    5. int three = one + two;
    6. int four = one + three;
    7. }
    8. }

    只是这次要选中的只有一行,

    1. int three = one + two;

    以便于其的智能,它便很愉快地告诉你它又找到了一个重复

    1. IDE has detected 1 code fragments in this file that can be replaced with a call to extracted method...

    便返回了这样一个结果

    1. public class extract {
    2. public void method() {
    3. int one = 1;
    4. int two = 2;
    5. int three = add(one, two);
    6. int four = add(one, three);
    7. }
    8. private int add(int one, int two) {
    9. return one + two;
    10. }
    11. }

    然而我们就可以很愉快地继续和它玩耍了。当然这其中还会有一些更复杂的情形,当学会了这一个剩下的也不难了。

    内联函数

    继续走这重构一书的复习之路,接着便是内联,除了内联变量,当然还有内联函数。

    快捷键

    Mac: alt+command+N

    Windows/Linux: Ctrl+Alt+N

    鼠标: Refactor | Inline

    重构之前

    1. public class extract {
    2. public void method() {
    3. int one = 1;
    4. int two = 2;
    5. int three = add(one, two);
    6. int four = add(one, three);
    7. }
    8. private int add(int one, int two) {
    9. return one + two;
    10. }
    11. }

    add(one,two)很愉快地按上个快捷键吧,就会弹出

    Inline Method

    再轻轻地回车,Refactor 就这么结束了。。

    Intellij Idea 内联临时变量

    以书中的代码为例

    1. double basePrice = anOrder.basePrice();
    2. return (basePrice > 1000);

    同样的,按下Command+alt+N

    1. return (anOrder.basePrice() > 1000);

    对于 python 之类的语言也是如此

    1. def inline_method():
    2. baseprice = anOrder.basePrice()
    3. return baseprice > 1000

    查询取代临时变量

    快捷键

    Mac: 木有

    Windows/Linux: 木有

    或者: Shift+alt+command+T 再选择 Replace Temp with Query

    鼠标: Refactor | Replace Temp with Query

    重构之前

    过多的临时变量会让我们写出更长的函数,变量不应该太多,以便使功能单一。这也是重构的另外的目的所在,只有函数专注于其功能,才会更容易读懂。

    以书中的代码为例

    1. import java.lang.System;
    2. public class replaceTemp {
    3. public void count() {
    4. double basePrice = _quantity * _itemPrice;
    5. if (basePrice > 1000) {
    6. return basePrice * 0.95;
    7. } else {
    8. return basePrice * 0.98;
    9. }
    10. }
    11. }

    重构

    选中basePrice很愉快地拿鼠标点上面的重构

    Replace Temp With Query

    便会返回

    1. import java.lang.System;
    2. public class replaceTemp {
    3. public void count() {
    4. if (basePrice() > 1000) {
    5. return basePrice() * 0.95;
    6. } else {
    7. return basePrice() * 0.98;
    8. }
    9. }
    10. private double basePrice() {
    11. return _quantity * _itemPrice;
    12. }
    13. }

    而实际上我们也可以

    1. 选中

      1. _quantity * _itemPrice
    2. 对其进行Extrace Method

    3. 选择basePriceInline Method

    在 Intellij IDEA 的文档中对此是这样的例子

    1. public class replaceTemp {
    2. public void method() {
    3. String str = "str";
    4. String aString = returnString().concat(str);
    5. System.out.println(aString);
    6. }
    7. }

    接着我们选中aString,再打开重构菜单,或者

    Command+Alt+Shift+T 再选中 Replace Temp with Query

    便会有下面的结果:

    1. import java.lang.String;
    2. public class replaceTemp {
    3. public void method() {
    4. String str = "str";
    5. System.out.println(aString(str));
    6. }
    7. private String aString(String str) {
    8. return returnString().concat(str);
    9. }
    10. }