16

这个问题是对此的跟进。

假设我有一些类 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。

  1. ⌥</kbd>⌘</kbd>m bar.getFoo().getX() -> getFooX(bar) (extract to method, also find and replace occurrences)
  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 。随意投票并发表评论。

最好的问候, 雅罗斯拉夫贝德罗夫 JetBrains

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

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

4

1 回答 1

3

getFooX()方法添加到后Bar,我将使用Edit > Find > Replace Structurally和以下表达式:

搜索模板:

$instance$.getFoo().getX()

替换模板:

$instance$.getFooX()

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

于 2015-11-16T16:49:31.117 回答