此问题是后续问题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。
bar.getFoo().getX()
- > getFooX(bar)
(提取到方法,也可以查找和替换事件)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
修改 至少有一种方法可以检查得墨忒耳法的问题。 screenshot http://i59.tinypic.com/2s80ft0.png
Here is a gist包含仅查找LoD违规的检查配置文件。你可以import it into IntelliJ。
答案 0 :(得分:2)
将getFooX()
方法添加到Bar
后,我会使用修改> 查找> 使用以下表达式替换结构:
搜索模板:
$instance$.getFoo().getX()
替换模板:
$instance$.getFooX()
完美地完成了这项工作。也许你可以在$instance$
变量中添加一些约束来缩小搜索范围,但只有当你有多个classess和该方法名称时才会有用。