16

此问题是后续for thisIntelliJ中的简单自定义重构

假设我有一些Foo类。

class Foo { 
    protected String x = "x"; 

    public String getX() { 
     return x; 
    } 
} 

我有一个使用Foo和违反毁灭之王(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. ⌘米bar.getFoo().getX() - >getFooX(bar)(提取物的方法,还查找和替换出现)
  2. F6getFooX(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。随意为其投票 并发表评论。

最好的问候,雅罗斯拉夫Bedrov JetBrains公司

编辑 至少有一种方式来检查德米特的法律问题。 screenshot http://i59.tinypic.com/2s80ft0.png

Here is a gist其中包含检查配置文件,只会查找LoD违规。你可以import it into IntelliJ

+0

我想知道是否可以用当前的IDEA版本(v14)在一个步骤中完成,我没有找到任何合适的单一命令。如果此功能真的缺失,提交功能请求可能是一个好主意。 – erkfel

+1

@erkfel我目前正在审查。链接看起来并不活跃,但它应该在这里:https://intellij-support.jetbrains.com/hc/en-us/requests/66429 – michaelsnowden

+1

@erkfel查看我的编辑,并签出https:// youtrack .jetbrains.com /问题/ IDEA-122400 – michaelsnowden

回答

1

添加getFooX()方法Bar后,我会用编辑>查找>替换结构上利用下列表达式:

搜索模板:

$instance$.getFoo().getX() 

更换模板:

$instance$.getFooX() 

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