IntelliJ 中的简单自定义重构

这个问题是对此的后续。

假设我有一些班级Foo。

class Foo {
    protected String x = "x";

    public String getX() {
        return x;
    }
}

我有一个使用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(); 
}

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

  1. m bar.getFoo().getX() -> getFooX(bar)(提取到方法,也查找和替换实例)
  2. F6 getFooX(bar) -> bar.getFooX()(移动到实例方法,同时查找和替换实例)

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

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。随时投票支持它并发表评论。

最好的问候, 雅罗斯拉夫·贝德罗夫喷气脑

编辑至少有一种方法可以检查得墨忒耳定律的问题。screenshot

下面是一个包含检查配置文件的要点,该配置文件将仅查找 LoD 违规。你可以把它导入到IntelliJ中


答案 1

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

搜索模板:

$instance$.getFoo().getX()

替换模板:

$instance$.getFooX()

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


答案 2

推荐