java - Refactorización simple personalizada en IntelliJ
intellij-idea refactoring (1)
Esta pregunta es un seguimiento de esto .
Di que tengo algo de clase Foo.
class Foo {
protected String x = "x";
public String getX() {
return x;
}
}
Tengo un programa que usa Foo y viola LoD ( Ley de 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();
}
Puedo refactorizar este código para usar LoD en dos pasos.
-
bar.getFoo().getX()
⌘ mbar.getFoo().getX()
->getFooX(bar)
(extraer al método, también encontrar y reemplazar las ocurrencias) - F6
getFooX(bar)
->bar.getFooX()
(pasar al método de instancia, también buscar y reemplazar ocurrencias)
El programa que usa Bar
ya no viola 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();
}
Me pregunto si hay una manera de hacer un método de refactorización personalizado en IntelliJ que consolide estos dos pasos en uno.
EDITAR Recibí una respuesta de JetBrains con un enlace a una solicitud de función preexistente. Por favor, vote sobre esto si le parece útil.
Hola Michael,
Parece que tenemos una solicitud similar en YouTrack: https://youtrack.jetbrains.com/issue/IDEA-122400 . Siéntete libre de votar y dejar comentarios.
Saludos cordiales, Yaroslav Bedrov JetBrains
EDITAR Hay al menos una forma de inspeccionar los problemas de la Ley de Demeter. captura de pantalla http://i59.tinypic.com/2s80ft0.png
Aquí hay un resumen que contiene un perfil de inspección que solo buscará violaciones de LoD. Puedes importarlo en IntelliJ .
Después de agregar el método getFooX()
a la Bar
, usaría Edición > Buscar > Reemplazar estructuralmente con las siguientes expresiones:
Plantilla de búsqueda:
$instance$.getFoo().getX()
Plantilla de reemplazo:
$instance$.getFooX()
Hace el trabajo perfectamente. Tal vez puede agregar algunas restricciones a la variable $instance$
para limitar la búsqueda, pero eso solo sería útil si tuviera varias clases con ese nombre de método.