问题
Say I have some class Foo
class Foo {
protected String x = "x";
public String getX() {
return x;
}
}
I have a program that uses Foo and violates 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();
}
Refactoring to use LoD looks like this:
class Bar {
protected Foo foo;
public Bar() {
this.foo = new Foo()
}
public String getFooX {
return foo.getX();
}
}
public static void main(String [] args) {
Bar bar = new Bar();
String x = bar.getFooX();
}
IntelliJ-IDEA has a lot of refactoring methods (e.g. extract to method, extract to variable, inline).
Is there a method in IntelliJ-IDEA that will refactor code like bar.getFoo().getX()
to look like bar.getFooX()
?
回答1:
Assuming that your example is Java code, you could do the following:
- Extract method on
bar.getFoo().getX()
(creatinggetFooX()
) - Move the created method
getFooX()
toBar
if necessary - Invoke Find and Replace Code Duplicates on
getFooX()
- Invoke Convert To Instance Method on
getFooX()
- Optionally Structural Replace
$a$.getFoo().getX()
with$a$.getFooX()
if you forgot step 3;-) - Inline all invocations of
getFoo()
(should be only ingetFooX()
)
来源:https://stackoverflow.com/questions/31191880/intellij-refactor-to-use-lod