IntelliJ重构使用LoD

时间:2015-07-02 18:20:42

标签: java intellij-idea refactoring automated-refactoring law-of-demeter

说我有一些课Foo

class Foo {
    protected String x = "x";

    public String getX() {
        return x;
    }
}

我有一个使用Foo并违反LoD的程序

class Bar {
    protected Foo foo;

    public Bar() {
        this.foo = new Foo();
    }

    public Foo getFoo() {
        return foo;
    }
}

public static void main(String [] args) {
    Bar bar = new Bar();
    String x = bar.getFoo().getX(); 
}

重构使用LoD如下所示:

class Bar {
    protected Foo foo;

    public Bar() {
        this.foo = new Foo()
    }

    public String getFooX {
        return foo.getX();
    }
}

public static void main(String [] args) {
    Bar bar = new Bar();
    String x = bar.getFooX();
}

IntelliJ-IDEA有很多重构方法(例如,提取到方法,提取到变量,内联)。

IntelliJ-IDEA中是否有一个方法可以将bar.getFoo().getX()之类的代码重构为bar.getFooX()

1 个答案:

答案 0 :(得分:5)

假设您的示例是Java代码,您可以执行以下操作:

  1. bar.getFoo().getX()上的提取方法(创建getFooX()
  2. 如有必要,将创建的方法getFooX()移至Bar
  3. getFooX()
  4. 上调用查找和替换代码重复项
  5. getFooX()
  6. 上调用转换为实例方法
  7. 如果您忘记了第3步,可选择结构替换$a$.getFoo().getX() $a$.getFooX(); - )
  8. 内联getFoo()的所有调用(应仅在getFooX()中)