IntelliJ中的简单自定义重构

时间:2015-07-03 20:32:03

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

此问题是后续问题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()(移至实例方法,也可查找并替换出现)
  3. 使用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

    修改 至少有一种方法可以检查得墨忒耳法的问题。 screenshot http://i59.tinypic.com/2s80ft0.png

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

1 个答案:

答案 0 :(得分:2)

getFooX()方法添加到Bar后,我会使用修改> 查找> 使用以下表达式替换结构

搜索模板:

$instance$.getFoo().getX()

替换模板:

$instance$.getFooX()

完美地完成了这项工作。也许你可以在$instance$变量中添加一些约束来缩小搜索范围,但只有当你有多个classess和该方法名称时才会有用。