IntelliJ中的简单自定义重构

mic*_*den 16 java refactoring intellij-idea law-of-demeter automated-refactoring

这个问题是一个跟进这个.

说我有一些课Foo.

class Foo {
    protected String x = "x";

    public String getX() {
        return x;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个程序使用Foo并违反了LoD(Demeter法则).

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(); 
}
Run Code Online (Sandbox Code Playgroud)

我可以通过两个步骤重构此代码以使用LoD.

  1. m bar.getFoo().getX()- > getFooX(bar)(提取到方法,也可以查找和替换出现)
  2. F6 getFooX(bar)- > bar.getFooX()(转到实例方法,也找到并替换出现)

使用的程序Bar不再违反LoD.

class Bar {
    protected Foo foo;

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

    public Foo getFoo() {
        return foo;
    }

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

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

我想知道是否有办法在IntelliJ中制作自定义重构方法,将这两个步骤合并为一个.

编辑 我收到了JetBrains的回复,其中包含指向预先存在的功能请求的链接.如果您觉得有用,请投票!

你好迈克尔,

似乎我们在YouTrack中有类似的请求:https://youtrack.jetbrains.com/issue/IDEA-122400 .随意投票并发表评论.

此致,Yaroslav Bedrov JetBrains

编辑 至少有一种方法可以检查得墨忒耳法的问题. 截图http://i59.tinypic.com/2s80ft0.png

这是一个要点,其中包含一个仅查找LoD违规的检查配置文件.您可以将其导入IntelliJ.

Dan*_*edo 3

getFooX()将方法添加到 后Bar,我将使用“编辑” > “查找” > “结构替换”,并使用以下表达式:

搜索模板:

$instance$.getFoo().getX()
Run Code Online (Sandbox Code Playgroud)

更换模板:

$instance$.getFooX()
Run Code Online (Sandbox Code Playgroud)

它完美地完成了这项工作。也许您可以向$instance$变量添加一些约束来缩小搜索范围,但这只有在您有多个具有该方法名称的类时才有用。