IntelliJ中的简单自定义重构

问题描述 投票:16回答:1

此问题是后续问题for this

说我有一些Foo课。

class Foo {
    protected String x = "x";

    public String getX() {
        return x;
    }
}

我有一个使用Foo并违反LoD(Law of 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(); 
}

我可以通过两步重构此代码以使用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();
}

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

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

你好迈克尔,

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

最好的问候,Yaroslav Bedrov JetBrains

编辑至少有一种方法可以检查Demeter法则问题。screenshot

Here is a gist包含仅将查找LoD违规的检查配置文件。您可以import it into IntelliJ

java intellij-idea refactoring automated-refactoring law-of-demeter
1个回答
2
投票

在将getFooX()方法添加到Bar之后,我将使用Edit> Find> 结构上替换以下表达式:

搜索模板:

$instance$.getFoo().getX()

替换模板:

$instance$.getFooX()

它做得很好。也许您可以向$instance$变量添加一些约束以缩小搜索范围,但这仅在您使用该方法名称包含多个类时才有用。

© www.soinside.com 2019 - 2024. All rights reserved.